उसी दिन के लिए संचयी दैनिक योग या वर्तमान रिकॉर्ड से पहले SQL में दिनांक फ़ील्ड

Important: I need this to be SQL Server 2000 compatible.

मुझे एक संचयी योग की आवश्यकता है लेकिन वर्तमान दिनांक फ़ील्ड के आधार पर, एक अपडेट क्वेरी जो मैं अब उपयोग कर रहा हूं, लेकिन यह बहुत धीमी है (बदसूरत निहित आरबीएआर त्रिभुज शामिल है):

UPDATE #RPT 
SET DailySumAccum = 
      (SELECT SUM(COALESCE(CTACTE2.Amount,0))
       FROM #RPT_CTACTE CTACTE2
       WHERE CTACTE2.IsAvailable = #RPT_CTACTE.IsAvailable 
         AND CTACTE2.CodCustomer = #RPT_CTACTE.CodCustomer  
         AND CTACTE2.ItemType = #RPT_CTACTE.ItemType  
         AND CTACTE2.CodItem = #RPT_CTACTE.CodItem 
         AND EsCtaCorrienteMon = -1 
         AND DATEDIFF(day, CTACTE2.OrderDate, #RPT_CTACTE.OrderDate) >= 0) 
WHERE #RPT_CTACTE.EsSaldoAnterior = 0
  AND EsCtaCorrienteMon = -1

मैंने कुल योग चलाने के लिए कर्सर विधि का उपयोग करने का भी प्रयास किया है, लेकिन मैं इसके साथ आरबीएआर समस्या को ठीक नहीं कर सकता, देखें कि तिथि तुलना अभी भी है और यह अभी भी बहुत धीमी है:

-- this is inside the cursor

IF (@EsCtaCorrienteMon = -1)
BEGIN
    SELECT @NetoDiarioAcum = SUM(COALESCE(Amount,0))
    FROM #RPT_CTACTE
    WHERE IsAvailable = @IsAvailable
          AND CodCustomer = @CodCustomer
          AND ItemType = @ItemType
          AND CodItem = @CodItem
          AND EsCtaCorrienteMon = -1
          AND DATEDIFF(day, OrderDate, @OrderDate) >= 0
END IF

इसलिए, इस संचयी योग के साथ समस्या उस तारीख की तुलना है, यह क्वेरी को धीमा कर रही है (मैंने 10 मिनट तक चलने के बाद कोड को रोक दिया है, इस अद्यतन पर टिप्पणी करने के लिए कर्सर को केवल 3 सेकंड चलते हैं), पंक्ति पंक्ति मेरे पास है परीक्षण 28K है, ऐसा लगता है कि जब रिकॉर्ड गिनती बढ़ जाती है, तो समय लगता है कि समस्या यह है कि समस्या यह है कि यहां एक आरबीएआर चल रहा है (जिसका अर्थ है "पंक्ति-दर-एगोनिज़िंग-पंक्ति")।

EDIT: After some testing it looks the date is not the only problem, is there any way to make this Running total just by summing a variable inside a cursor or something like that?

EDIT2: I’m currently looking for a way to make what the first update does (a day running total based on 4 fields and date) but faster, I’ve been close to it yesterday adding the logic manually inside a cursor but the cursor went too big and hard to mantain, so what running total technique is the best (faster) for this case? And how would you implement that technique here? It’s not a simple running total, cuts should be made when any of those fields change. The field EsSaldoAnterior change can only be 0 or -1, the update only affect the outer table when this field is 0 but the inner running totals sum even when this field is -1. EsSaldoAnterior means something like "Its Previous Amount" and it means the running totals shounldn’t start at zero, they should start summing these amounts first (when they exist), this is the order if using ORDER BY:

ORDER BY IsAvailable, CodCustomer, ItemType, CodItem, OrderDate, EsSaldoAnterior
0
योजना को प्राप्त करना वास्तव में आसान नहीं है क्योंकि यह अस्थायी तालिका प्रत्येक निष्पादन के लिए रनटाइम पर बनाई गई है, मैं इसे एक वास्तविक तालिका बनाने की कोशिश कर सकता हूं, फिर योजना निष्पादित कर सकता हूं, लेकिन: आप सुनिश्चित कर सकते हैं कि यह एक नियमित टेम्पलेट तालिका है जिसमें कोई अनुक्रमणिका नहीं है, तो हम बदतर मान सकते हैं, क्या आपको लगता है कि अस्थायी तालिका में इंडेक्स बनाना (इस कोड को चलाने से पहले रनटाइम पर) चीजों को तेज़ी से बना देगा?
जोड़ा लेखक Jcis, स्रोत
कोई भी मदद करने की कोशिश कर रहा है कृपया पहले पोस्ट (नीचे) में EDIT2 पढ़ें
जोड़ा लेखक Jcis, स्रोत
कुल चलाने के लिए सर्वोत्तम दृष्टिकोण पर एक नज़र डालें हारून बर्ट्रेंड
जोड़ा लेखक Nikola Markovinović, स्रोत
तारीखों की तुलना करने के लिए डेटीफ का उपयोग न करें, क्योंकि इससे आपके पास मौजूद इंडेक्स को अमान्य कर दिया जाएगा। सरल तुलना का उपयोग करें: ऑर्डरडेट <@OrderDate
जोड़ा लेखक Nikola Markovinović, स्रोत

2 उत्तर

बदलने की कोशिश

AND DATEDIFF(day, CTACTE2.OrderDate, #RPT_CTACTE.OrderDate) >= 0) 

सेवा मेरे

CTACTE2.OrderDate

या

CTACTE2.OrderDate

In this case subquery should use index on CTACTE2.OrderDate

0
जोड़ा
खैर, वास्तव में अस्थायी तालिका में कोई अनुक्रमणिका नहीं है, लेकिन मैं उस क्षेत्र के लिए एक बनाउंगा और इसे आज़माएं, धन्यवाद।
जोड़ा लेखक Jcis, स्रोत
यह धीमा है, और ऐसा लगता है कि मेरा पूरा अपडेट धीमा है, न केवल तारीख तुलना भाग, क्या कर्सर के अंदर एक चर का उपयोग करने के लिए कोई तरीका है? मैंने पहले यह किया है लेकिन समस्या यह है कि वर्तमान दिनांक को खाते में कैसे लेना है।
जोड़ा लेखक Jcis, स्रोत
मैं वास्तव में उम्मीद कर रहा था कि कोई इसके लिए चल रहे कुल कोड दिखा सकता है लेकिन मुझे लगता है कि इसे मैन्युअल रूप से करना मुश्किल था (जैसे कर्सर के अंदर किया गया है, चर का उपयोग करके संक्षेप में)। लेकिन मैं यह जवाब दूंगा क्योंकि यह मेरे लिए सहायक और जानकारीपूर्ण था, धन्यवाद valex।
जोड़ा लेखक Jcis, स्रोत

आंतरिक उप-चयन को तेज़ी से बनाने के लिए आपको आंतरिक क्वेरी को मोहक से संबंधित करने के लिए उपयोग किए गए कॉलम पर एक अनुक्रमणिका जोड़ने की आवश्यकता है:

CodCustomer
ItemType
CodItem
EsCtaCorrienteMon
IsAvailable
OrderDate

कॉलम को सबसे अलग मानों के साथ जोड़ें (यानी उच्च चयनकता के साथ) - पहले उपलब्ध है नहीं है क्योंकि इसमें केवल दो अलग-अलग मान हैं।

तिथि तुलनात्मक कुशल बनाने के लिए समूह के भीतर तेज़ रेंज खोजों को सक्षम करने के लिए ऑर्डरडेट कॉलम को इंडेक्स में रखें। यदि प्रति समूह की कुछ तिथियां हैं तो यह तुलना एक समस्या नहीं होनी चाहिए।

इस इंडेक्स को क्लस्टर्ड करने का प्रयास करें ताकि उप-चयन बाहरी रोचक पंक्ति के नजदीक अपनी पंक्तियों को पा सके।

0
जोड़ा