最初に掲載された質問は、私は事前に虚偽のことをお詫び申し上げます。 テーブルにはチームに割り当てられたレコードが含まれており、最初の割り当ては別のプロセスで行われます。しばしば、エージェントのレコードを再割り当てし、他のチームに均等に分散させる必要があります。私たちは手でこれを一つずつ行ってきましたが、それは面倒でした。だから私はこの解決策を思いついた:SQL Server 2008この更新プログラムループを効率的に行う方法はありますか?
DECLARE @UpdtAgt TABLE (ID INT, Name varchar(25))
INSERT INTO @UpdtAgt
VALUES (1, 'Gandalf')
,(2,'Hank')
,(3,'Icarus')
CREATE TABLE #UpdtQry (TblID varchar(25))
INSERT INTO #UpdtQry
SELECT ShtID
FROM TestUpdate
DECLARE @RowID INT
DECLARE @AgtID INT
DECLARE @Agt varchar(25)
DECLARE @MaxID INT
SET @MaxID = (SELECT COUNT(*) FROM @UpdtAgt)
SET @AgtID = 1
--WHILE ((SELECT COUNT(*) FROM #UpdtQry) > 0)
WHILE EXISTS (SELECT TblID FROM #UpdtQry)
BEGIN
SET @RowID = (SELECT TOP 1 TblID FROM #UpdtQry)
SET @Agt = (SELECT Name FROM @UpdtAgt WHERE ID = @AgtID)
UPDATE TestUpdate
SET Assignment = @Agt
WHERE ShtID = @RowID
DELETE #UpdtQry WHERE TblID = @RowID
IF @AgtID < @MaxID
SET @AgtID = @AgtID + 1
ELSE
SET @AgtID = 1
END
DROP TABLE #UpdtQry
これは本当にこの何かを行うに私の最初の試みです。 100行の更新には約30秒かかります。 UPDATEテーブルのTestUpdateには、CLUSTEREDインデックスのみがあります。これをより効率的にするにはどうすればいいですか?
EDIT:私の説明では、@UpdtAgtと#UpdtQryテーブルをよく定義していませんでした。 @UpdtAgtはレコードを再割り当て中のエージェントを保持し、これが使用されるたびに変更される可能性があります。 #UpdtQryには、どのエージェントレコードを再割り当てするかを定義するWHERE句がありますが、これは使用ごとに変わります。私はこれがもう少し明確になることを願っています。再び、最初に正しいことをしてくれないことに対する謝罪。
EDIT 2:古いWHILE節をコメントアウトし、HABOが提案したものを挿入しました。もう一度ありがとうございます。
どこ 'TestUpdate'テーブル構造のですか? 'CTE'が仕事をすることができるようだ – Sami
1つ以上の行が存在するかどうかを確認するときは、[' EXISTS'](https://msdn.microsoft.com/en-us/library/ms188336)を使う方が効率的です.aspx)でなく、正確に['COUNT'](https://msdn.microsoft.com/en-us/library/ms175997.aspx)を取得し、それがゼロより大きいかどうかをチェックするだけです。原則として、 'ORDER BY'を伴わないで' TOP'を使うことは威嚇されます。 – HABO
HOLY CRAP!それはそれをした! SELECT COUNT(*)の代わりにWHILEでEXISTSを使用すると、30秒から1秒以下になります。どうもありがとうございました! – EFrost