2008-09-23 132 views
3

我有一个SP需要10秒运行约10次(每次运行约一秒)。该平台是asp.net,服务器是SQL Server 2005.我已经索引了表(不是PK),这不是问题。一些注意事项:存储过程;插入缓慢

  • usp_SaveKeyword不是问题。我评论说整个SP并没有什么不同。
  • 我将@SearchID设置为1,时间大大减少,平均只需要15ms的时间。
  • 我注释掉了整个存储过程,除了插入到tblSearches中,奇怪的是它需要更多的时间来执行。

任何有关可能发生什么的想法?

set ANSI_NULLS ON 

go 

ALTER PROCEDURE [dbo].[usp_NewSearch] 

    @Keyword VARCHAR(50), 

    @SessionID UNIQUEIDENTIFIER, 

    @time SMALLDATETIME = NULL, 

    @CityID INT = NULL 

AS 

BEGIN 

    SET NOCOUNT ON; 

    IF @time IS NULL SET @time = GETDATE(); 



    DECLARE @KeywordID INT; 

    EXEC @KeywordID = usp_SaveKeyword @Keyword; 

    PRINT 'KeywordID : ' 

    PRINT @KeywordID 

    DECLARE @SearchID BIGINT;  

    SELECT TOP 1 @SearchID = SearchID 

    FROM tblSearches 

    WHERE SessionID = @SessionID 

    AND KeywordID = @KeywordID; 



    IF @SearchID IS NULL BEGIN 

     INSERT INTO tblSearches 

       (KeywordID, [time], SessionID, CityID) 

     VALUES 

       (@KeywordID, @time, @SessionID, @CityID) 

     SELECT Scope_Identity(); 

    END 

    ELSE BEGIN 

     SELECT @SearchID 

    END 



END 
+0

*存储 - 请校对。 – GEOCHET 2008-09-23 13:33:07

+0

这将有助于了解在表格上设置了哪些索引/触发器。 – Nikki9696 2008-09-23 13:34:41

回答

2

为什么在此查询中使用top 1 @SearchID而不是max (SearchID)where existstop要求您运行查询并从结果集中检索第一行。如果结果集很大,在获得最终结果集之前可能会消耗相当多的资源。

SELECT TOP 1 @SearchID = SearchID  
    FROM tblSearches  
WHERE SessionID = @SessionID  
    AND KeywordID = @KeywordID; 

我没有看到这方面的任何明显的理由 - 无论是上述的结构应该给你拿点语义上等同于这一个非常便宜的索引查找。除非我失去了一些东西,你应该能够做到像

select @SearchID = isnull (max (SearchID), -1) 
    from tblSearches 
where SessionID = @SessionID 
    and KeywordID = @KeywordID 

这应该是相当有效和(除非我失去了一些东西)语义上等同。

1

触发器!

他们确实是阴险的。

+0

当然:“触发器!”太短而无法发布。 – 2008-09-23 13:28:30

+0

我的猜测也是触发器..如果没有剩下,它仍然很慢,必须有其他东西;) – VVS 2008-09-23 14:28:32

2

在SQL Management Studio中启用“显示预计执行计划” - 执行计划显示您在哪里花费时间?它会引导您使用优化查询的启发式(或不在这种情况下)。一般来说,“更胖”的线是需要关注的线 - 它们是产生大量I/O的线。

不幸的是,即使您告诉我们表模式,只有您将能够实际看到SQL如何选择优化查询。最后一件事 - 你有tblSearches上的聚集索引吗?

1
  1. 什么是tblSearches上的聚集索引?如果聚集索引不在主键上,则数据库可能花费大量时间重新排序。
  2. 你有多少其他指标?
  3. 你有触发器吗?
  4. 执行计划表明时间花费在哪里?