2012-04-03 2 views
0

ここでは、すべてのレコード(現在は約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 
+0

これは、上記のシナリオを実行する最も効率的な方法であるかどうかです。私は何かがある場合、代替案を探しています... – dido

+0

"最も効率的で最速の"方法は、 'myStoredProc'を書き直して、そこに' dbo.bl'との結合で行っていることを何でもします。 –

+2

ほとんど確かではありません。あなたはうまくいきましたが、60,000の選択クエリを実行しています。これらのクエリの出力で何をしているのですか?一度にこの1人の顧客を実行する必要がありますか? SQLはベースに設定されており、可能な限りループは避けなければなりません。ほとんどの場合、より効率的なセットベースのソリューションが存在します。 – GarethD

答えて

0

提供されたコードサンプルでは、​​ループが1つしかないため、どのように手伝ってもらえないか分かりません。ここで

は冗長なクエリを回避するためにいくつかのヒントがあります:

内部クエリは外側の1(カーソルループか何か)外1にできるだけ多くをフィルタリングしてみてくださいに依存している場合。

'DISTINCT'または日付範囲を含めます。 すなわち)

SELECT DISTINCT CUST_ID 
FROM TABLE 
WHERE CREATE_DATE BETWEEN cur_date - 100 and cur_date 

文はあなたが、必ずしもする必要はありませんクエリを避けるために、場合に使用します。

最後に他のすべてが失敗した場合は、インデックスを使用して可能な場合はクエリを高速化します。

1

ストアドプロシージャをセットを処理するか、使用しないように書き換えます。

1

GarethDのおかげで、私はセットベースのソリューションが動作しています。あなたは彼のSQL fiddle link hereを見ることができます。セットベースのソリューションは以下の通りですが、この種の問題を抱えている人にはリンクを見てください。

-- SET BASED SOLUTION 
INSERT INTO Results1 
SELECT CustomerID, COUNT(*) 
FROM Customer 
    LEFT JOIN CustomerRelation 
     ON CustomerID = CustomerFK 
GROUP BY CustomerID 
+0

修正のおめでとう!あなたができるときは、他の人があなたの成功から学ぶことができるように、あなたの答えに「受け入れられた」と記入してください。乾杯〜 –

関連する問題