मैं एमएस एसक्यूएल का उपयोग कर रहा हूं, और मुझे विभिन्न मानदंडों पर एक ही टेबल पर कई प्रश्न चलाने होंगे। पहले तो मैंने प्रत्येक क्वेरी को मूल तालिका पर चलाया, हालांकि वे सभी कुछ फ़िल्टरिंग (यानी दिनांक, स्थिति) साझा करती हैं। इसमें बहुत समय (लगभग 2 मिनट) लगा।
डेटा पंक्तियों में डुप्लिकेट हैं, और सभी अनुक्रम NON-CLUSTERED हैं। मुझे अपने मानदंड के लिए केवल 4 कॉलमों में दिलचस्पी है और परिणाम सभी प्रश्नों के लिए केवल गिनती का उत्पादन करना चाहिए।
स्तंभों की जरूरत: TABLE
, FIELD
, AFTER
, DATE
, और वहाँ से प्रत्येक पर एक सूचकांक है DATE
और TABLE
।
मुझे केवल उन क्षेत्रों के साथ एक अस्थायी तालिका बनाने के बाद, यह एक 1:40 मिनट तक नीचे चली गई, जो अभी भी बहुत खराब है।
CREATE TABLE #TEMP
(
TABLE VARCHAR(30) NULL,
FIELD VARCHAR(30) NULL,
AFTER VARCHAR(1000) NULL,
DATE DATETIME,
SORT_ID INT IDENTITY(1,1)
)
CREATE CLUSTERED INDEX IX_ADT ON #TEMP(SORT_ID)
INSERT INTO #TEMP (TABLE, FIELD, AFTER, DATE)
SELECT TABLE, FIELD, AFTER, DATE
FROM mytbl WITH (NOLOCK)
WHERE TABLE = 'OTB' AND
FIELD = 'STATUS'
रननिग इस -> (216598 पंक्ति)
चूंकि सभी प्रश्न दिनांक सीमा पर निर्भर नहीं हैं, इसलिए मैंने इसे क्वेरी में शामिल नहीं किया। समस्या यह है कि यह केवल डालने के लिए 1 मिनट से अधिक समय ले रहा है । उपरोक्त प्रविष्टि में 1:19 मिनट लगे
मैं कई प्रश्नों के लिए कुछ इस तरह चलाना चाहता हूं:
SELECT COUNT(*) AS COUNT
FROM #TEMP
WHERE AFTER = 'R' AND
DATE >= '2014-01-01' AND
DATE <= '2015-01-01'
यह चयन की तुलना में अधिक डालने के साथ एक समस्या है, लेकिन अस्थायी में मूल तालिका की तुलना में कम पंक्तियां हैं जो कई बार तालिका से गुजरने से बेहतर हो सकती हैं।
मैं इसे कैसे अनुकूलित कर सकता हूं?
संपादित करें
मैंने सॉर्ट आईडी को हटा दिया है, मुझे लगता है कि समस्या मुख्य रूप से चयन के साथ थी और सम्मिलित नहीं थी। यह एक अनुमान था।
मैं किसी भी सूचकांक पर एक अद्वितीय नहीं बना सकता क्योंकि कोई अद्वितीय क्षेत्र या पंक्तियाँ नहीं हैं।
मैं SQL Server 2012 का उपयोग कर रहा हूं।
तालिका जानकारी : यह एक ढेर है और इसमें निम्नलिखित स्थान का उपयोग है:
name rows reserved data index_size unused
mytbl 24869658 9204568 KB 3017952 KB 5816232 KB 370384 KB
SELECT COUNT(*) AS COUNT FROM original_table WHERE AFTER = 'R' AND DATE >= '2014-01-01' AND DATE < '2015-01-01'
, तो आप प्रत्येक (क्वेरी) को अलग से ऑप्टिमाइज़ करने का प्रयास क्यों नहीं करते? क्या आपको तालिका में अनुक्रमणिका जोड़ने की अनुमति नहीं है?
TABLE
और FIELD
कॉलम निकाल सकते हैं #temp
(सभी पंक्तियों के TABLE = 'OTB' AND FIELD = 'STATUS'
बाद सभी विशिष्ट अस्थायी तालिका के लिए है।)
CREATE TABLE
कथन)। डाउन वोट इसलिए था क्योंकि प्रश्न स्पष्ट नहीं था।