इस परिदृश्य में किस सूचकांक का उपयोग किया जाएगा?


11

SQL सर्वर 2014 मानक संस्करण

मुझे कुछ महीनों के लिए विशिष्ट शहरों से आने और जाने वाली उड़ानों की संख्या का पता लगाने की आवश्यकता है। उदाहरण के लिए

select count(*) 
from flights 
where flightTo_AirportCode = 'aaaa' 
and flightFrom_Airportcode = 'bbbb' 
and flightdate < '2016-04-01' 
and flightdate > '2016-02-28' ;

तालिका स्कीमा नीचे है।

मैं अनुमान लगाने की कोशिश कर रहा हूं कि क्या इंडेक्स मॉडलए या इंडेक्स मॉडलबी (नीचे) बेहतर है (इंडेक्स को बनाने में कई घंटे लगते हैं, और डिस्क स्पेस एक समय में केवल एक ही मौजूद है, इसलिए मैं लीप से पहले देखने की कोशिश कर रहा हूं)।

मेरे अनुभव से, या तो सूचकांक करेगा। क्या मैं सही हू?

  create index [modelA] on flights (flightTo_AirportCode, flightFrom_AirportCode, flightDate)

  create index [modelB] on flights (flightDate, flightTo_AirportCode, flightFrom_AirportCode)

(या, बेहतर है, क्या कोई द्विआधारी सूचकांक या उन्नत तंत्र है जो मैं इसका उपयोग करने के लिए उपयोग कर सकता हूं?)

CREATE TABLE [dbo].[flights](
    [flightId] [uniqueidentifier] NOT NULL,
    [accountId] [uniqueidentifier] NULL,
    [flightDate] [datetime] NULL,
    [flightTo_AirportCode] [nvarchar](30) NULL,
    [flightFrom_AirportCode] [nvarchar](30) NULL,
    -- ... 45 more fields
    CONSTRAINT [PK_flight] PRIMARY KEY CLUSTERED 
(
    [flightId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 70) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

जवाबों:


18

इस क्वेरी के लिए इंडेक्स A बेहतर है। जब किसी स्तंभ पर WHEREश्रेणी स्थिति या INऑपरेटर का उपयोग कर रहे एक को छोड़कर सभी में समानता की जाँच होती है , तो उस अंतिम स्तंभ को अनुक्रमणिका जाँच के बाद वाले सभी स्तंभों में अंतिम होना चाहिए।

यह ऑप्टिमाइज़र को पहली पंक्ति के लिए एक इंडेक्स सीक का उपयोग करने की अनुमति देता है जो शर्तों से मेल खाता है और तब तक इंडेक्स को ट्रैस करता है जब तक कि यह एक पंक्ति नहीं मिलती जो इसे मेल नहीं खाती। बीच की सभी पंक्तियाँ एक मेल भी हैं।

तो, इस क्वेरी के लिए सबसे अच्छा सूचकांक या तो (to, from, date)(आपका मॉडल ए) होगा या (from, to, date)

मॉडल बी इंडेक्स में पहले तारीख है इसलिए यह सबसे अच्छा नहीं है, हालांकि यह अभी भी क्वेरी के लिए एक कवरिंग इंडेक्स है। यदि इसका उपयोग किया गया था, तो क्वेरी योजना लगभग समान होगी। एक सूचकांक पहली पंक्ति को खोजने की कोशिश करता है जो सीमा स्थिति ( date > '2016-02-28') से मेल खाता है और तब तक अनुक्रमणिका को पार करता है जब तक कि वह एक पंक्ति नहीं मिलती जो मेल नहीं खाती date < '2016-04-01'। लेकिन बीच की सभी पंक्तियाँ आवश्यक रूप से 2 अन्य स्थितियों से मेल नहीं खाती हैं, इसलिए उन्हें इन स्थितियों के खिलाफ जाँच करनी होगी और (संभवतः उनमें से कई) अस्वीकार कर दी जाएँगी।

इसलिए जब योजनाएं समान होंगी, मॉडल A योजना को केवल उस सूचकांक के हिस्से के माध्यम से जाना होगा जिसमें सभी आवश्यक पंक्तियां और केवल उन्हें है, जबकि मॉडल B योजना एक (संभवतः बहुत) बड़े हिस्से के माध्यम से जाएगी सूचकांक।


  • तिथियों ( YYYYMMDD) के लिए 100% सुरक्षित प्रारूप का उपयोग करना भी सबसे अच्छा होगा ।

  • और यदि आप मार्च में तारीखें चाहते हैं, तो आपको एक समावेशी-अनन्य चेक का उपयोग करना चाहिए:

    AND flightdate >= '20160301' AND flightdate < '20160401' 

    तारीख और डेटाइम प्रकार के साथ काम करने की गारंटी। आपकी वर्तमान क्वेरी में ऐसी कोई भी पंक्ति शामिल होगी जिसमें '2016-02-28'एक समय अलग हो '00:00:00'( लेकिन क्या आप गारंटी दे सकते हैं कि कोई भी नहीं है?) जो मुझे लगता है कि आप नहीं चाहते हैं। समावेशी-अनन्य विधि लीप वर्षों में भी काम करेगी (यह याद दिलाते हुए कि 2016 एक लीप वर्ष है, इसलिए 29 फरवरी की तारीख थी और साथ ही आपकी क्वेरी वापस आ जाएगी)।

आरोन बर्ट्रेंड द्वारा ये ब्लॉग पोस्ट भी पढ़ें:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.