এই দৃশ্যে কোন সূচকটি ব্যবহৃত হবে?


11

এসকিউএল সার্ভার 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

সূচক এ এই প্রশ্নের জন্য আরও ভাল better যখন সমস্ত কন্ডিশন WHEREসমতা যাচাই করে ব্যতীত যে INকোনও কলামে একটি ব্যাপ্তি শর্ত বা অপারেটর ব্যবহার করে , তখন সেই শেষ কলামটি সূচীতে সর্বশেষ হওয়া উচিত, সমস্ত কলামের সমতা যাচাইয়ের পরে।

এটি অপটিমাইজারকে শর্তগুলির সাথে মেলে এমন প্রথম সারিতে অনুসন্ধানের জন্য একটি সূচক ব্যবহার করার অনুমতি দেয় এবং তারপরে এটি সাদৃশ্য না পাওয়া সীমাটি খুঁজে না পাওয়া পর্যন্ত সূচকে অতিক্রম করে। এর মধ্যে থাকা সমস্ত সারিও একটি ম্যাচ।

সুতরাং, এই প্রশ্নের জন্য সেরা সূচকটি হয় (to, from, date)(আপনার মডেল এ) বা (from, to, date)

মডেল বি সূচকটির তারিখটি প্রথম রয়েছে তাই এটি সেরা নয়, যদিও এটি এখনও ক্যোয়ারির জন্য একটি আচ্ছাদন সূচক। এটি ব্যবহার করা হলে, ক্যোয়ারী পরিকল্পনাটি প্রায় একই রকম হবে। একটি সূচক প্রথম সারিটি সীমাবদ্ধ শর্ত ( date > '2016-02-28') এর সাথে মেলে এবং এটি সন্ধান না করে ততক্ষণ সূচকটি অতিক্রম করবে যা এটির সাথে মেলে না date < '2016-04-01'। তবে এর মধ্যে থাকা সমস্ত সারি অপরিহার্যভাবে অন্যান্য 2 শর্তগুলির সাথে মেলে না তাই তাদের এই শর্তগুলির বিরুদ্ধে পরীক্ষা করতে হবে এবং (সম্ভবত তাদের বেশিরভাগই) প্রত্যাখ্যান করা হবে।

পরিকল্পনাগুলি একই রকম হওয়ার পরে, মডেল এ পরিকল্পনায় কেবল সূচকের যে অংশে প্রয়োজনীয় সমস্ত সারি রয়েছে কেবল সেই অংশটিই অতিক্রম করতে হবে এবং মডেল বি পরিকল্পনাটি (সম্ভবত অনেকগুলি) বৃহত্তর অংশের মধ্য দিয়ে যাবে plan সূচি।


  • তারিখের জন্য 100% নিরাপদ ফর্ম্যাট ব্যবহার করা ভাল YYYYMMDD

  • এবং আপনি যদি মার্চের তারিখগুলি চান, আপনার একটি সমেত-এক্সক্লুসিভ চেক ব্যবহার করা উচিত:

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

    তারিখ এবং তারিখের সময় ধরণের সাথে কাজ করার গ্যারান্টিযুক্ত। আপনার বর্তমান ক্যোয়ারিতে এমন কোনও সারিও অন্তর্ভুক্ত থাকবে যা এর '2016-02-28'চেয়ে আলাদা সময় আছে '00:00:00'(আপনি কি গ্যারান্টি দিতে পারবেন যে সেখানে নেই?) যা আমি ধরে নিই যে আপনি চান না। ইনক্লুসিভ-এক্সক্লুসিভ পদ্ধতিটি লিপ বছরগুলিতেও কাজ করবে (মনে করিয়ে দেবে যে 2016 একটি লিপ বছর তাই 29 শে ফেব্রুয়ারির তারিখও ছিল যা আপনার জিজ্ঞাসা ফিরে আসবে)।

অ্যারন বারট্র্যান্ডের এই ব্লগ পোস্টগুলি পড়ুন:

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.