मेरे पास एक संग्रहीत प्रक्रिया है जहां एक मुख्य फ़ील्ड के साथ आधार तालिका को पॉप्युलेट करता है और फिर उस तालिका के माध्यम से लूप करता है ताकि उन महत्वपूर्ण फ़ील्ड को विस्तृत गणना प्राप्त करने के लिए स्रोत डेटा तालिका की आवश्यकता हो। मेरे पास जो मुद्दा है वह यह है कि जब बेस टेबल में बहुत सारी पंक्तियाँ होती हैं, तो एसपी को चलने में लंबा समय लगता है। मैंने स्रोत डेटा को अस्थायी तालिकाओं में लोड किया है और सूचकांक बनाया है और आधार तालिका को एक सूचकांक के साथ एक अस्थायी तालिका भी बनाया है।
CREATE TABLE #SupplementalData1
(
ROWID int IDENTITY(1, 1),
LOB varchar(100),
Program varchar(100),
Project varchar(100),
Container varchar(255),
RPTNG_Week date,
Scheduled_Open int,
Still_Open int,
Scheduled_Closed int,
Actual_Closed int
);
CREATE INDEX t1
ON #SupplementalData1 (LOB, Program, Project, Container, RPTNG_Week);
INSERT INTO #SupplementalData1 (LOB, Program, Project, Container, RPTNG_Week)
SELECT DISTINCT
a.LOB_CODE,
a.PRGRM_NAME,
a.PRJCT_NAME,
a.CNTNR_NAME,
b.Monday
FROM
#data a,
Schedule_Date_Lookup b
WHERE
b.Monday >= @MinMonday
AND b.Monday <= @MaxMonday
ORDER BY
a.LOB_CODE,
a.PRGRM_NAME,
a.PRJCT_NAME,
b.Monday;
DELETE FROM #SupplementalData1
WHERE RPTNG_Week > @EndDate;
-- Get the number of rows in the looping table
DECLARE @RowCount int;
SET @RowCount = (SELECT COUNT(ROWID)FROM #SupplementalData1);
-- Declare an iterator
DECLARE @I int;
-- Initialize the iterator
SET @I = 1;
--Declare Common Variables
DECLARE @iLOB varchar(MAX),
@iProgram varchar(MAX),
@iProject varchar(MAX),
@iContainer varchar(MAX),
@iRPTNG_Week date,
@Value int;
-- Loop through the rows of a table @myTable
WHILE (@I <= @RowCount)
BEGIN
-- Declare variables to hold the data which we get after looping each record
-- Get the data from table and set to variables
SELECT @iLOB = LOB,
@iProgram = Program,
@iProject = Project,
@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
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;
-- -- Increment the iterator
SET @I = @I + 1;
END;
क्या कोई वैकल्पिक तरीका है जो गति में सुधार करेगा?
1 उत्तर
नमूना डेटा, वांछित आउटपुट और आपके तर्क के बिना निम्नलिखित का परीक्षण नहीं किया गया था, लेकिन आपको सही दिशा में आगे बढ़ना चाहिए।
पूरे समय के बयान से दूर रहें और एक सेट आधारित दृष्टिकोण के साथ जाएं।
यहाँ जबकि लूप को 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];
फिर एक बार जब आप सत्यापित कर लेते हैं कि यह सही है तो आप आसानी से फिर से लिख सकते हैं जिसमें एक अपडेट है। जो आपके लूप को बदल देगा।
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];
संबंधित सवाल
नए सवाल
sql
संरचित क्वेरी भाषा (एसक्यूएल) डेटाबेस को क्वेरी करने के लिए एक भाषा है। प्रश्नों में कोड उदाहरण, तालिका संरचना, नमूना डेटा और DBMS कार्यान्वयन के लिए एक टैग (जैसे MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, आदि) का उपयोग किया जाना चाहिए। यदि आपका प्रश्न केवल एक विशिष्ट DBMS (विशिष्ट एक्सटेंशन / सुविधाओं का उपयोग करता है) से संबंधित है, तो इसके बजाय उस DBMS के टैग का उपयोग करें। एसक्यूएल के साथ टैग किए गए सवालों के जवाब में आईएसओ / आईईसी मानक एसक्यूएल का उपयोग करना चाहिए।
JOIN
सिंटैक्स से बदल दिया गया था >92 SQL मानक (लगभग 30 वर्ष पहले) और इसके उपयोग को हतोत्साहित किया जाता है