ここでは、すべてのレコード(現在は約1000)をループし、各レコードに対して約60のSELECTクエリを実行するために、それはおよそ6万回の計算になります。これは1日に1回行われます。私の懸念は、すべてのレコードのこの「ループスルー」がこのケースで最も効率的で最速であるかどうかです。SQLテーブルをループして複数のクエリを実行する最も速い方法
DECLARE @LastCustomerID CHAR(10)
SET @LastCustomerID = 0
-- define the customer ID to be handled now
DECLARE @CustomerIDToHandle CHAR(10)
-- select the next customer to handle
SELECT TOP 1 @CustomerIDToHandle = bl_id
FROM dbo.bl
WHERE bl_id > @LastCustomerID AND status = 'a'
ORDER BY bl_id
-- as long as we have customers......
WHILE @CustomerIDToHandle IS NOT NULL
BEGIN
-- call your sproc. this is where i have the 60 SQL SELECT queries defined
-- in another stored procedure called myStoredProc. it just takes the parameter
-- @CustomerIDToHandle provided here and uses it in the where clauses
EXEC myStoredProc @CustomerIDToHandle
-- set the last customer handled to the one we just handled
SET @LastCustomerID = @CustomerIDToHandle
SET @CustomerIDToHandle = NULL
-- select the next customer to handle
SELECT TOP 1 @CustomerIDToHandle = bl_id
FROM dbo.bl
WHERE bl_id > @LastCustomerID AND status = 'a'
ORDER BY bl_id
END
これは、上記のシナリオを実行する最も効率的な方法であるかどうかです。私は何かがある場合、代替案を探しています... – dido
"最も効率的で最速の"方法は、 'myStoredProc'を書き直して、そこに' dbo.bl'との結合で行っていることを何でもします。 –
ほとんど確かではありません。あなたはうまくいきましたが、60,000の選択クエリを実行しています。これらのクエリの出力で何をしているのですか?一度にこの1人の顧客を実行する必要がありますか? SQLはベースに設定されており、可能な限りループは避けなければなりません。ほとんどの場合、より効率的なセットベースのソリューションが存在します。 – GarethD