अरे, मेरे पास SQL Server 2000 (अभी अपडेट करने के लिए संभव नहीं है) के तहत संग्रहीत प्रक्रिया में एक कर्सर है जो सभी तालिका अपडेट करता है लेकिन इसे पूरा होने में आमतौर पर कुछ मिनट लगते हैं। मुझे इसे तेज बनाने की जरूरत है। यहां एक मनमानी उत्पाद आईडी द्वारा फ़िल्टर की गई उदाहरण तालिका है; Example table http://img231.imageshack.us/img231/9464/75187992.jpg जबकि जीडीईपीओ: प्रवेश डिपो, सीडीईपीओ: बाहर निकलें डिपो, एडेट: मात्रा, ई_CIKAN मात्रा जिसका उपयोग किया जाता है।टी-एसक्यूएल कर्सर को तेज़ी से कैसे बनाया जाए?
रिकार्ड explainations:
1: 10 इकाई छोड़ देता है 01 3: 5 यूनिट छोड़ देता है 01 (अब 1 रिकार्ड के लिए E_CIKAN 15 हो जाएगा) 4: 10 और इकाई में प्रवेश करती है डिपो 20 यूनिट डिपो 01, 2 में प्रवेश करती है 01. 5: 3 यूनिट 1 रिकॉर्ड से 01 छोड़ देता है। अब ध्यान दें कि 1 रिकॉर्ड में E_CIKAN 18 पर सेट है। 6: यह वह जगह है जहां समस्या आती है: 3 यूनिट को डिपो 01 छोड़ने की आवश्यकता होती है। इसमें 1 रिकॉर्ड से 2 यूनिट और 5 यूनिट से 1 इकाई होती है। मेरा एसपी तस्वीर में देखा गया यह जुर्माना संभाल सकता है, सिवाय इसके कि यह वास्तव में धीमा है।
यहां संग्रहित प्रक्रिया अंग्रेजी में अनुवादित है;
CREATE PROC [dbo].[UpdateProductDetails]
as
UPDATE PRODUCTDETAILS SET E_CIKAN=0;
DECLARE @ID int
DECLARE @SK varchar(50),@DP varchar(50) --SK = STOKKODU = PRODUCTID, DP = DEPOT
DECLARE @DEMAND float --Demand=Quantity, We'll decrease it record by record
DECLARE @SUBID int
DECLARE @SUBQTY float,@SUBCK float,@REMAINS float
DECLARE SH CURSOR FAST_FORWARD FOR
SELECT [ID],PRODUCTID,QTY,EXITDEPOT FROM PRODUCTDETAILS WHERE (EXITDEPOT IS NOT NULL) ORDER BY [DATE] ASC
OPEN SH
FETCH NEXT FROM SH INTO @ID, @SK,@DEMAND,@DP
WHILE (@@FETCH_STATUS = 0)
BEGIN
DECLARE SA CURSOR FAST_FORWARD FOR
SELECT [ID],QTY,E_CIKAN FROM PRODUCTDETAILS WHERE (QTY>E_CIKAN) AND ([email protected]) AND ([email protected]) ORDER BY [DATE] ASC
OPEN SA
FETCH NEXT FROM SA INTO @SUBID, @SUBQTY,@SUBCK
WHILE (@@FETCH_STATUS = 0) AND (@DEMAND>0)
BEGIN
SET @[email protected]@SUBCK
IF @DEMAND>@REMAINS --current record isnt sufficient, use it and move on
BEGIN
UPDATE PRODUCTDETAILS SET E_CIKAN=QTY WHERE [email protected];
SET @[email protected]@REMAINS
END
ELSE
BEGIN
UPDATE PRODUCTDETAILS SET [email protected] WHERE [email protected];
SET @DEMAND=0
END
FETCH NEXT FROM SA INTO @SUBID, @SUBAD,@SUBCK
END
CLOSE SA
DEALLOCATE SA
FETCH NEXT FROM SH INTO @ID, @SK,@DEMAND,@DP
END
CLOSE SH
DEALLOCATE SH
आपकी क्वेरी कॉलम का एक समूह उपयोग कर रही हैं जो आपके स्क्रीन शॉट में सूचीबद्ध नहीं हैं। यदि आप कॉलम के वास्तविक विवरण के साथ तालिका के लिए डीडीएल शामिल करते हैं तो यह शायद बेहतर होगा। –
टॉम, मैंने अंग्रेजी में क्वेरी का अनुवाद किया है और कहा है कि 'जहां जीडीईपीओ: प्रवेश डिपो, सीडीईपीओ: बाहर निकलें डिपो, एडेट: मात्रा, ई_CIKAN मात्रा जिसका उपयोग किया जाता है।' इसके लिए स्क्रीनशॉट के बाद। –
E_CIKAN मात्रा से दिखाए गए राशि (रिकॉर्ड का पालन करके) दिखाता है। पहले 3 रिकॉर्ड, 20 प्रविष्टि, 10 + 5 प्रस्थान की जांच करें। पहले रिकॉर्ड के लिए E_CIKAN 15 होगा। संग्रहीत प्रक्रिया यह ठीक है, समस्या यह वास्तव में धीमी है। –