存储过程;插入缓慢

3

我有一个存储过程,每次运行大约需要10秒钟(每次运行大约需要1秒钟)。平台是asp .net,服务器是SQL Server 2005。我已经对表进行了索引(不是在PK上),但这不是问题所在。以下是一些注意事项:

  • usp_SaveKeyword不是问题。我注释掉整个SP,没有任何改变。
  • 我将@SearchID设置为1,时间显著缩短,平均每个事务只需约15毫秒。
  • 我注释掉了整个存储过程,除了插入到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

知道该表上设置了哪些索引/触发器会有所帮助。 - Nikki9696
4个回答

2
在SQL管理工具中启用“显示估计执行计划” - 执行计划显示了你花费时间的位置,它会指导你使用的启发式算法来优化查询(或者在这种情况下不优化)。通常,“粗线条”是需要关注的部分 - 它们生成大量I/O。
不幸的是,即使您告诉我们表模式,只有您才能看到SQL选择如何优化查询。最后一件事 - 您是否在tblSearches上有一个聚集索引?

我正在运行它,我会在原问题中发布响应,感谢您的输入! - RyanKeeter

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个结果时,Top 1会停止,这是您所期望的。请查看查询计划。 - Amy B

1

触发器!

它们确实很难以捉摸。


我的猜测是触发器也有问题...如果没有留下任何东西,但速度仍然很慢,那一定还有其他问题 ;) - VVS
他说5小时前会更新问题并提供更多信息。只有触发器才能让他离开这么久。 - Amy B

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接