3

約10回(実行するたびに約1秒)実行するのに10秒かかるSPがあります。プラットフォームは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
4

4 に答える 4

2

SQL Management Studio で「推定実行計画の表示」を有効にします - 実行計画はどこに時間を費やしていることを示していますか? クエリを最適化するために使用されているヒューリスティックについて説明します (この場合はそうではありません)。一般に、「より太い」行に注目する必要があります。これらの行は、大量の I/O を生成するものです。

残念ながら、テーブル スキーマを教えていただいても、実際に SQL がクエリを最適化するためにどのように選択したかを確認できるのはあなただけです。最後に 1 つ - tblSearches でクラスター化インデックスを取得しましたか?

于 2008-09-23T13:32:03.840 に答える
2

top 1 @SearchIDこのクエリの代わりに、max (SearchID)またはwhere existsこのクエリで 使用しているのはなぜですか? topクエリを実行し、結果セットから最初の行を取得する必要があります。結果セットが大きい場合、最終結果セットを取得する前にかなりのリソースを消費する可能性があります。

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 に答える