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
4

4 回答 4

2

在 SQL Management Studio 中启用“显示估计的执行计划” - 执行计划在哪里显示您花费的时间?它将指导您使用启发式方法来优化查询(或者在这种情况下不是)。通常,“较胖”的行是需要关注的——它们会产生大量的 I/O。

不幸的是,即使您告诉我们表模式,也只有您才能真正看到 SQL 是如何选择优化查询的。最后一件事——你在 tblSearches 上有一个聚集索引吗?

于 2008-09-23T13:32:03.840 回答
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

这应该是相当有效的并且(除非我遗漏了什么)在语义上是等效的。

于 2008-09-23T13:44:35.337 回答
1

触发器!

他们确实很阴险。

于 2008-09-23T13:26:41.700 回答
1
  1. tblSearches 上的聚集索引是什么?如果聚集索引不在主键上,则数据库可能会花费大量时间重新排序。
  2. 你还有多少其他索引?
  3. 你有什么触发器吗?
  4. 执行计划在哪里指示花费的时间?
于 2008-09-23T13:51:03.310 回答