我有一個存盤程序,用關鍵欄位填充一個基表,然后通過該表進行回圈,以獲得這些關鍵欄位來查詢一個源資料表,以獲得詳細的計數。我遇到的問題是,當基表中有很多行時,存盤程序需要很長時間才能運行。 我已經將源資料加載到臨時表,并創建了索引,還將基表變成了帶有索引的臨時表。
CREATE TABLE #SupplementalData1
(
ROWID int IDENTITY(1, 1) 。
LOB varchar(100)。
計劃 varchar(100)。
專案 varchar(100) 。
Container varchar(255)。
RPTNG_Week date,
Scheduled_Open int,
Still_Open int,
Scheduled_Closed int,
實際關閉 intCREATE INDEX t1
ON #SupplementalData1 (LOB, Program, Project, Container, RPTNG_Week);
INSERT INTO #SupplementalData1 (LOB, Program, Project, Container, RPTNG_Week)
SELECTDISTINCT
a.LOB_CODE,
a.PRGRM_NAME,
a.PRJCT_NAME,
a.CNTNR_NAME。
b.星期一
FROM[/span
#data a,
時間表_日期_查詢b
WHERE
b.星期一 >= @MinMonday
and b.Monday <= @MaxMonday
ORDER BY
a.LOB_CODE。
a.PRGRM_NAME,
a.PRJCT_NAME。
b.星期一。
DELETE FROM #SupplementalData1
WHERE RPTNG_Week >/span> @EndDate;
--獲取回圈表的行數。
DECLARE @RowCount int;
SET @RowCount =(SELECT COUNT(ROWID)FROM #SupplementalData1)。)
--宣告一個迭代器。
DECLARE @I int;
--初始化迭代器
SET @I = 1;
--宣告常用變數
DECLARE @iLOB varchar(MAX)。
@iProgram varchar(MAX)。
@iProject varchar(MAX)。
@iContainer varchar(MAX)。
@iRPTNG_Week date,
@Value int;
-- 回圈查看表@myTable的行數。
WHILE (@I <= @RowCount)
BEGIN
--宣告變數以保存我們在回圈每條記錄后得到的資料。
--從表中獲取資料并設定為變數。
SELECT @iLOB = LOB,
@iProgram = Program,
@iProject = 專案。
@iContainer = Container,
@iRPTNG_Week = RPTNG_Week
FROM #SupplementalData1
WHERE ROWID = @I;
SET @Value = (SELECT COUNT(CNTNR_NAME) AS Scheduled_Open_Sum
FROM #data c
WHERE (c.NEED_DATE >= @iRPTNG_Week)
and c.LOB_CODE = @iLOB_Week
AND c.PRGRM_NAME = @iProgram
AND c.PRJCT_NAME = @iProject
AND c.CNTNR_NAME = @iContainer)。)
UPDATE #SupplementalData1
SET Scheduled_Open = @Value
WHERE LOB = @iLOB
AND Program = @iProgram
and Project = @iProject
and Container = @iContainer
and RPTNG_Week = @ iRPTNG_Week;
-- -- 遞增迭代器
SET @I = @I 1;
END。
是否有另一種方法可以提高速度?
uj5u.com熱心網友回復:
在沒有樣本資料、所需輸出和你的邏輯的情況下,以下內容沒有經過測驗,但應該能讓你朝著正確的方向前進。
取消整個 while 陳述句,采用基于集合的方法。
這里是將 while 回圈改寫為 SELECT 的程序。我通常會先這樣做,以仔細檢查和驗證資料。
SELECT *
FROM [#SupplementalData1] [supdata]
CROSS APPLY (
SELECT COUNT([CNTNR_NAME]) AS [Scheduled_Open_Sum]
FROM [#data] [c] 。
WHERE [c].[NEED_DATE] >= [supdata].[RPTNG_Week]
and [c].[LOB_CODE] = [supdata].[LOB]
and [c].[PRGRM_NAME] = [supdata].[Program] 。
and [c].[PRJCT_NAME] = [supdata].[Project] 。
AND [c].[CNTNR_NAME] = [supdata].[Container]
) AS [cd];
一旦你驗證了這一點是正確的,你就可以很容易地重寫,有一個更新。 這將是取代你的while回圈的東西。
UPDATE [supdata]
SET [Scheduled_Open] = [cd].[Scheduled_Open_Sum]
FROM [#SupplementalData1] [supdata]。
CROSS APPLY (
SELECT COUNT([CNTNR_NAME]) AS [Scheduled_Open_Sum]
FROM [#data] [c] 。
WHERE [c].[NEED_DATE] >= [supdata].[RPTNG_Week]
and [c].[LOB_CODE] = [supdata].[LOB]
and [c].[PRGRM_NAME] = [supdata].[Program] 。
and [c].[PRJCT_NAME] = [supdata].[Project] 。
AND [c].[CNTNR_NAME] = [supdata].[Container]
) AS [cd];
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/311040.html
標籤:
下一篇:在多個日期范圍內對行進行分組
