循环访问SQL表并执行多个查询的最快方法

时间:2012-04-03 15:36:27

标签: sql database

我正在使用其中一个成员提供的解决方案来遍历所有记录(目前大约1000个),并为每个记录执行大约60个SELECT查询。这大约有60,000次计算。这是每天一次。我担心的是,在这种情况下,所有记录的“循环”是否是最有效和最快的。

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

3 个答案:

答案 0 :(得分:1)

重写存储过程以处理集合或不使用它。

答案 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

答案 2 :(得分:0)

在您提供的代码示例中,您只有一个循环,所以我不确定我是如何帮助您的。

以下是一些避免冗余查询的提示:

如果内部查询依赖于外部查询(游标循环或其他内容),请尝试在外部查询上尽可能多地进行过滤。

包括'DISTINCT'或日期范围。 即)

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

使用if语句来避免您不一定需要进行的查询。

最后,当所有其他方法都失败时,请尽可能使用索引来加速查询。