我正在使用其中一个成员提供的解决方案来遍历所有记录(目前大约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
答案 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语句来避免您不一定需要进行的查询。
最后,当所有其他方法都失败时,请尽可能使用索引来加速查询。