コミッションレポート用にこのカーソルを書きました。何が起こるかというと、コミッションは 1 つのテーブルにあり、レコードは別のテーブルにあります。特定の基準に基づいて 2 つを一致させます (完全に一致するものはありません)。問題は、レコードが存在する場所に重複があることです。コミッションを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でキャッシュを使用して高速化する方法があります
- 構文のその他のオプション