0

あなたが元気であることを願っています。SQL Server クエリに問題があります。

534,000 行のテーブルのレコードを更新したいと考えています。すべてのレコードを更新するためのwhileループを作成すると、時間がかかります。

次に、更新レコードのカーソルを作成する必要があります。この後、Fetch を使用して更新用のカーソルを作成します。このカーソルは10,000行で更新プロセスをすばやく完了しますが、30,000行を超えるテーブルを使用すると、クエリの実行に5分かかります。何が問題なのかわからない。

その私のコード

DECLARE @RNo INT --Declaring the Variable @id
DECLARE @id INT --Declaring the Variable @id
set @RNo=1

DECLARE @MyCursor CURSOR -- Declaring the Cursor
SET @MyCursor = CURSOR --Assigning the cursor
FOR
SELECT Col1 FROM MyTable  --Query related to Cursor
for update of Col2

OPEN @MyCursor -- Opening the Created cursor
FETCH NEXT FROM @MyCursor --Retrieving the record one by one
INTO @id --Assigning the value in declared Variable
    WHILE @@FETCH_STATUS = 0 
    BEGIN

        update MyTable
        set Col2=@RNo
         where current of @MyCursor

        set @RNo=@rno+1
        print @id
FETCH NEXT
    FROM @MyCursor INTO @id
END
CLOSE @MyCursor -- Closing the Cursor
DEALLOCATE @MyCursor -- Deallocating the Cursor Memory

注: 私のクエリは正しいデータで実行されますが、問題は 5 分かかることです。このクエリを 10 秒以内に実行したいだけです。

前もって感謝します

4

1 に答える 1

3

SQL Server の専門家は、カーソルを使用する必要がある場合は、必ず LOCAL STATIC カーソルを使用するようにと言っていました。それはさておき、このクエリはデータを 1 回で更新します。

;WITH TMP AS (
  SELECT *, ROW_NUMBER() OVER (ORDER BY Col1) RN
  FROM MyTable
)
UPDATE TMP SET Col2 = RN;

に基づいて行番号を生成するように任意に選択しましたがORDER BY Col1、これは微調整できます。カーソルにはORDER BY句がなかったので、とにかく疑似ランダムでした。

于 2012-10-26T05:32:24.577 に答える