2010-08-18 16 views
10

मैं बस सोच रहा हूं कि एसक्यूएल (विशेष रूप से SQL सर्वर) में तेज़ क्या है।क्या यह जांचना तेज़ है कि दिनांक (नहीं) पूर्ण है या थोड़ा सा 1/0 से तुलना करें?

मैं के प्रकार दिनांक एक व्यर्थ स्तम्भ हो सकता था और NULL है कि तुलना, या मैं गैर-व्यर्थ तिथि कॉलम और एक अलग bit स्तंभ हो सकता था, और 1/0 को bit स्तंभ की तुलना करें।

bit कॉलम की तुलना तेजी से होने जा रही है?

+0

मुझे अक्सर यह आश्चर्य हुआ है कि यह – TimS

उत्तर

12

यह जांचने के लिए कि एक कॉलम IS NULL SQL सर्वर वास्तव में बस थोड़ा सा जांच करेगा। प्रत्येक पंक्ति के लिए एक पूर्ण बिटमैप संग्रहीत किया जाता है जो दर्शाता है कि प्रत्येक कॉलम में न्यूल है या नहीं।

+1

उस बिट कॉलम से पूछताछ करेगा जिसमें एक इंडेक्स डेटाटाइम पर शून्य से तेज है? – Omu

+2

@ChuckNorris - जब तक इंडेक्स वास्तव में इंडेक्स से पूछताछ की गई थी, तब तक तेजी से बढ़ेगा क्योंकि SQL सर्वर सिर्फ रुचि की पंक्तियों को सीधे खोज सकता था। यह भी सच होगा यदि 'डेटाटाइम 'स्तंभ स्वयं को अनुक्रमित किया गया था। –

1

थोड़ा तेज़ हो जाएगा क्योंकि स्मृति में थोड़ा सा लोड करना केवल 1 बाइट लोड करेगा और तिथि लोड करने से 8 बाइट्स लगेगा। तुलना में एक ही समय लगेगा, लेकिन डिस्क से लोड होने में अधिक समय लगेगा। जब तक आप एक बहुत पुराने सर्वर का उपयोग नहीं करते हैं या अधिक लोड करने की आवश्यकता नहीं है तो 10^8 पंक्तियां आपको कुछ भी नहीं दिखाई देगी।

+0

SQL सर्वर केवल पूरे 8 केबी पृष्ठों को स्मृति में और बाहर लोड करेगा। –

2

अन्य सभी चीजें बराबर होती हैं, मैं कहूंगा कि बिट तेज होगा क्योंकि यह एक "छोटा" डेटा प्रकार है। हालांकि, यदि प्रदर्शन यहां बहुत महत्वपूर्ण है (और मुझे लगता है कि यह प्रश्न के कारण है) तो आपको हमेशा परीक्षण करना चाहिए, क्योंकि इंडेक्स जैसे अन्य कारक भी हो सकते हैं, जो इसे प्रभावित करते हैं।

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

2

संक्षिप्त उत्तर, यदि आपके पास केवल 1s और 0s हैं जैसे बिट-मैप इंडेक्स 1,0 उबेर तेज़ है। नल को कुछ स्क्लेन्गिन पर अनुक्रमित नहीं किया जाता है, इसलिए 'शून्य है' और 'शून्य नहीं' धीमा है। हालांकि, इसे खत्म करने से पहले इकाई अर्थशास्त्र के बारे में सोचें। यदि आप जानते हैं कि मेरा क्या मतलब है, तो अर्थपूर्ण तालिका परिभाषा हमेशा बेहतर होती है।

गति इस मामले में डेटा आकार से सूचकांक का उपयोग करने की क्षमता से आता है।

संपादित
कृपया मार्टिन स्मिथ के जवाब का संदर्भ लें। इससे एसक्लसरवर के लिए और अधिक समझदारी होती है, मुझे ऑरकल डीबी द्वारा यहां ले जाया गया, मेरी गलती यहाँ है।

DECLARE @d DATETIME 
     ,@b BIT = 0 

SELECT 1 
WHERE @d IS NULL 

SELECT 2 
WHERE @b = 0 

वास्तविक कार्य योजना लागू करके परिणाम के रूप में बैच के लिए बिल्कुल वैसा ही लागत के सापेक्ष गणना दिखाने:

+2

प्रश्न SQL सर्वर के बारे में है। नल को SQL सर्वर में अनुक्रमित किया जाता है जब तक कि आप उन्हें अनदेखा करने के लिए फ़िल्टर किए गए इंडेक्स को सेट करना चुनते हैं। नल का उपयोग नल बिटमैप का उपयोग करके भंडारण में भी किया जाता है, इसलिए मुझे यकीन नहीं है कि कोई अंतर आएगा। –

9

मैं सिर्फ इस बात के लिए एक साधारण परीक्षण किया था।

Actual Execution Plan

हो सकता है कि किसी को इस के अलावा आंसू सकता है, लेकिन मेरे लिए यह वहाँ कोई अंतर नहीं है लगता है।


और अधिक परीक्षण

SET DATEFORMAT ymd; 

CREATE TABLE #datenulltest 
(
    dteDate datetime NULL 
) 

CREATE TABLE #datebittest 
(
    dteDate datetime NOT NULL, 
    bitNull bit DEFAULT (1) 
) 

INSERT INTO #datenulltest (dteDate) 
SELECT CASE WHEN CONVERT(bit, number % 2) = 1 THEN '2010-08-18' ELSE NULL END 
FROM master..spt_values 

INSERT INTO #datebittest (dteDate, bitNull) 
SELECT '2010-08-18', CASE WHEN CONVERT(bit, number % 2) = 1 THEN 0 ELSE 1 END 
FROM master..spt_values 


SELECT 1 
FROM #datenulltest 
WHERE dteDate IS NULL 

SELECT 2 
FROM #datebittest 
WHERE bitNull = CONVERT(bit, 1) 


DROP TABLE #datenulltest 
DROP TABLE #datebittest 

Actual Execution Plan

dteDate IS NULL परिणाम:

IS NULL tooltip

bitNull = 1 परिणाम:

bitNull = 1

ठीक है, तो इस विस्तारित परीक्षण एक ही प्रतिक्रियाओं फिर से साथ आता है।
हम इसे पूरे दिन कर सकते हैं - यह औसत पर तेज़ी से पता लगाने के लिए कुछ जटिल प्रश्न लेगा।

+0

क्वेरी ऑप्टिमाइज़र कई रणनीतियों के आधार पर निष्पादन योजना का उपयोग करने का निर्धारण करता है। गतिशील नमूना उनमें से एक है। यदि यह निर्णय लेता है कि प्रत्यक्ष तालिका पहुंच (पूर्ण तालिका स्कैन) fetch इंडेक्स आधारित fetch से कुशल है, तो यह इसका उपयोग करता है। यह बहुत सच है यदि डेटा की मात्रा कम है, लेकिन यदि डेटा की एक बड़ी मात्रा है, तो आंकड़े अलग-अलग होंगे। – questzen

+0

@questzen विशाल – Omu

+1

परिभाषित करना कठिन है, लेकिन यदि हम मानते हैं कि दोनों परिदृश्य एक ही तालिका से फ़िल्टर के लिए डेटा लाएंगे, तो अधिकांश गणना उसी तरह निष्पादित की जाएगी। मैं भी इसका परीक्षण कर सकता हूं, मेरे साथ भालू। – Codesleuth

संबंधित मुद्दे

 संबंधित मुद्दे