0

1 つのステートメントが完了するまでに合計時間 (10 分) の 95% を費やしている SQL ストアド プロシージャがあります。#Records約 133,000 行あり、Records約 12,000 行あります。

  -- Check Category 1 first
  UPDATE #Records
    SET Id = (SELECT TOP 1 Id FROM Records WHERE Cat1=#Records.Cat1)
    WHERE Cat1 IS NOT NULL

Cat1inにインデックスを追加してみました#Recordsが、ステートメント時間は改善されませんでした。

CREATE CLUSTERED INDEX IDX_C_Records_Cat1 ON #Records(Cat1)

次の同様のステートメントは、わずかな時間しかかかりません。

  -- Check Category 2
  UPDATE #Records
    SET Id = (SELECT TOP 1 Id FROM Records WHERE Cat2=#Records.Cat2)
    WHERE ID IS NULL

なぜこれが起こっているのか、またはこの声明をより効果的にするために何ができるかについてのアイデアはありますか?

前もって感謝します。

これを Microsoft SQL Server 2005 で実行しています。

4

3 に答える 3

1

多分参加して更新

update t
set t.ID = r.ID
FROM (Select Min(ID) as ID,Cat1 From Records group by cat1) r 
INNER JOIN #Records t ON r.Cat1 = t.cat1 
Where t.cat1 is not null
于 2012-08-20T22:07:58.247 に答える
1

あなたの問題はおそらく、結合の代わりに相関サブクエリを使用していることだと思います。結合はセットで機能し、相関サブクエリは行ごとに実行され、基本的にカーソルです。

于 2012-08-20T21:53:43.200 に答える
0

私の経験では、多数のレコードを更新しようとしている場合、更新クエリを使用するよりも、カーソルを使用してレコード全体を反復処理する方が高速な場合があります。

多分これはあなたの場合に役立ちます。

于 2012-08-21T10:43:39.790 に答える