我为佣金报告写了这个光标。发生的事情是佣金出现在一张表中,记录在另一张表中。我根据某些标准匹配两个(没有完全匹配可用)。问题是存在记录的地方存在重复。当我将佣金与records
表格匹配时,可能会导致拾取这些重复项。因此,代表得到了更多的报酬。另一方面,佣金表中也有重复,但这些是有效的,因为它们简单地意味着一个帐户获得了 2 个月的付款。
我写了这个查询,但运行需要 5 分钟以上。我在记录表中有 50,000 条记录,在佣金表中有 100,000 条记录。有什么办法可以改进这个光标吗?
/* just preparation of cursor, this is not time consuming */
CREATE TABLE #result
(
repid INT,
AccountNo VARCHAR(100),
supplier VARCHAR(15),
CompanyName VARCHAR(200),
StartDate DATETIME,
EndDate DATETIME,
Product VARCHAR(25),
commodity VARCHAR(25),
ContractEnd DATETIME,
EstUsage INT,
EnrollStatus VARCHAR(10),
EnrollDate DATETIME,
ActualEndDate DATETIME,
MeterStart DATETIME,
MeterEnd DATETIME,
ActualUsage INT
)
DECLARE @AccountNo VARCHAR(100)
DECLARE @supplier VARCHAR(10)
DECLARE @commodity VARCHAR(15)
DECLARE @meterstart DATETIME
DECLARE @meterEnd DATETIME
DECLARE @volume FLOAT
DECLARE @RepID INT
DECLARE @Month INT
DECLARE @Year INT
SET @repID = 80
SET @Month = 1
SET @year = 2012
/* the actual cursor */
DECLARE commission_cursor CURSOR FOR
SELECT AccountNo,
supplier,
commodity,
meterStart,
MeterEnd,
Volume
FROM commission
WHERE Datepart(m, PaymentDate) = @Month
AND Datepart(YYYY, PaymentDate) = @Year
OPEN commission_cursor
FETCH next FROM commission_cursor INTO @AccountNo, @supplier, @commodity, @MeterStart, @MeterEnd, @Volume;
WHILE @@fetch_status = 0
BEGIN
IF EXISTS (SELECT id
FROM Records
WHERE AccountNo = @AccountNo
AND supplier = @supplier
AND Commodity = @commodity
AND RepID = @repID)
INSERT INTO #result
SELECT TOP 1 RepID,
AccountNo,
Supplier,
CompanyName,
[Supplier Start Date],
[Supplier End Date],
Product,
Commodity,
[customer end date],
[Expected Usage],
EnrollStatus,
ActualStartDate,
ActualEndDate,
@meterstart,
@MeterEnd,
@volume
FROM Records
WHERE AccountNo = @AccountNo
AND supplier = @supplier
AND Commodity = @commodity
AND RepID = @repID
AND @MeterStart >= Dateadd(dd, -7, ActualStartDate)
AND @meterEnd <= Isnull(Dateadd(dd, 30, ActualEndDate), '2015-12-31')
FETCH next FROM commission_cursor INTO @AccountNo, @supplier, @commodity, @MeterStart, @MeterEnd, @Volume;
END
SELECT *
FROM #result
/* clean up */
CLOSE commission_cursor
DEALLOCATE commission_cursor
DROP TABLE #result
我已经阅读了如何使 T-SQL 游标更快的答案?,为此我得到的是用表格形式重写这个查询。但我确实有另一个使用连接的查询,并且速度很快。问题是,它无法区分我records
表中的副本。
有什么我可以做的更快。这是首要问题。如果没有,你有没有其他方法可以做到这一点。
我特别需要帮助
- 将使用视图或存储过程帮助
- 我有一种方法可以在 Cursor 中使用缓存以使其更快
- 语法中的任何其他选项