ดัชนีใดที่จะใช้ในสถานการณ์นี้


11

SQL Server 2014 Standard Edition

ฉันต้องการค้นหาจำนวนเที่ยวบินที่ไปและกลับจากบางเมืองในบางเดือน เช่น

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

ตารางสคีมาอยู่ด้านล่าง

ฉันพยายามที่จะประเมินว่าดัชนี modelA หรือ index modelB (ด้านล่าง) เป็นที่นิยมหรือไม่ (ใช้เวลาหลายชั่วโมงในการสร้างดัชนีและพื้นที่ดิสก์อนุญาตให้มีอยู่ครั้งละหนึ่งรายการเท่านั้นดังนั้นฉันจึงพยายามมองก่อนที่จะกระโดด)

จากประสบการณ์ของฉันทั้งดัชนีจะทำ ฉันถูกไหม?

  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)หรือ

ดัชนีโมเดล B มีวันที่ก่อนดังนั้นจึงไม่ใช่สิ่งที่ดีที่สุดแม้ว่าจะยังคงเป็นดัชนีที่ครอบคลุมสำหรับแบบสอบถาม หากมีการใช้แผนแบบสอบถามจะใกล้เคียงกัน ดัชนีพยายามที่จะหาแถวแรกที่ตรงกับเงื่อนไขขอบเขต ( date > '2016-02-28') date < '2016-04-01'แล้วสำรวจดัชนีจนกว่าจะพบแถวที่ไม่ตรงกับที่ แต่แถวทั้งหมดในระหว่างไม่จำเป็นต้องตรงกับเงื่อนไขอื่น ๆ 2 ดังนั้นพวกเขาจะต้องมีการตรวจสอบกับเงื่อนไขเหล่านี้และ (อาจจะหลายคน) ปฏิเสธ

ดังนั้นในขณะที่แผนจะคล้ายกันแผนรุ่น A จะต้องผ่านเฉพาะส่วนของดัชนีที่มีแถวที่จำเป็นทั้งหมดและมีเฉพาะพวกเขาเท่านั้นในขณะที่แผนรุ่น B จะผ่านส่วนที่ใหญ่กว่า (อาจมาก) ของ ดัชนี.


  • นอกจากนี้ยังเป็นการดีที่สุดที่จะใช้รูปแบบที่ปลอดภัย 100% สำหรับวันที่ ( YYYYMMDD)

  • และหากคุณต้องการวันที่ในเดือนมีนาคมคุณควรใช้การตรวจสอบแบบครอบคลุม

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

    รับประกันว่าจะทำงานกับวันที่และประเภทวันที่และเวลา แบบสอบถามปัจจุบันของคุณจะรวมแถวที่มี'2016-02-28'แต่เวลาแตกต่างกันไปด้วย'00:00:00'(คุณสามารถรับประกันได้ว่าไม่มีหรือไม่) ซึ่งฉันคิดว่าคุณไม่ต้องการ วิธีการแบบเอกสิทธิ์เฉพาะบุคคลแบบรวมยังจะทำงานในปีอธิกสุรทิน (เตือนว่า 2016 เป็นปีอธิกสุรทินดังนั้นจึงมีวันที่ 29 กุมภาพันธ์ซึ่งแบบสอบถามของคุณจะกลับมา)

อ่านโพสต์บล็อกเหล่านี้โดย Aaron Bertrand:

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.