ปัจจัยใดบ้างที่เข้าสู่ดัชนีแบบกลุ่มของดัชนีการดูที่ถูกเลือก?


19

โดยสังเขป
ปัจจัยใดที่พวกเขาค้นหาการเลือกดัชนีของมุมมองที่จัดทำดัชนีไว้ของเครื่องมือเพิ่มประสิทธิภาพ

สำหรับฉันการดูที่จัดทำดัชนีดูเหมือนจะท้าทายสิ่งที่ฉันเข้าใจเกี่ยวกับวิธีที่เครื่องมือเพิ่มประสิทธิภาพเลือกดัชนี ฉันเคยเห็นสิ่งนี้ถามมาก่อนแต่ OP ไม่ได้รับการตอบรับดีเกินไป ฉันกำลังมองหาป้ายบอกทางแต่ฉันจะปรุงตัวอย่างหลอกแล้วโพสต์ตัวอย่างจริงด้วย DDL, เอาท์พุท, ตัวอย่างมากมาย

สมมติว่าฉันใช้ Enterprise 2008+ เข้าใจ with(noexpand)

ตัวอย่างหลอก

ใช้ตัวอย่างปลอมนี้: ฉันสร้างมุมมองที่มี 22 ตัวกรองตัวกรอง 17 ตัวและม้าวงเวียนที่ตัดแถวตารางจำนวน 10 ล้านแถว มุมมองนี้มีราคาแพง (ใช่ด้วยทุน E) ที่จะทำให้เป็นจริง ฉันจะวางแผนและสร้างดัชนีมุมมอง SELECT a,b FROM AnIndexedView WHERE theClusterKeyField < 84จากนั้น ในตรรกะของเครื่องมือเพิ่มประสิทธิภาพที่ทำให้ฉันมีการเชื่อมต่อที่ขีดเส้นใต้

ผลลัพธ์:

  • ไม่มีคำแนะนำ: 4825 อ่าน 720 แถว 47 cpu มากกว่า 76ms และราคาต้นไม้ย่อยโดยประมาณ 0.30523
  • ด้วยคำแนะนำ: 17 การอ่าน, 720 แถว, 15 ซีพียูในระยะ 4 มิลลิวินาที, และค่าใช้จ่ายทรีย่อยโดยประมาณ 0.007253

แล้วเกิดอะไรขึ้นที่นี่? ฉันได้ลองใช้ในEnterprise 2008, 2008-R2 และ 2012 โดยทุกเมตริกฉันคิดได้ว่าการใช้ดัชนีของมุมมองนั้นมีประสิทธิภาพมากกว่าอย่างมาก ฉันไม่มีปัญหาในการดมกลิ่นพารามิเตอร์หรือข้อมูลที่เอียงเนื่องจากนี่คือโฆษณา

ตัวอย่างจริง (ยาว)

คุณอาจไม่จำเป็นต้องหรือต้องการอ่านส่วนนี้เว้นเสียแต่ว่าคุณจะเป็นคนที่ชอบการสัมผัส

เวอร์ชัน
Yep, องค์กร

Microsoft SQL Server 2012 - 11.0.2100.60 (X64) 10 กุมภาพันธ์ 2555 19:39:15 ลิขสิทธิ์ (c) Microsoft Corporation รุ่นองค์กร (64 บิต) บน Windows NT 6.2 (รุ่น 9200:) (Hypervisor)

มุมมอง

CREATE VIEW dbo.TimelineMaterialized    WITH SCHEMABINDING
AS
SELECT  TM.TimelineID,
        TM.TimelineTypeID,
        TM.EmployeeID,
        TM.CreateUTC,
        CUL.CultureCode,
        CASE 
           WHEN TM.CustomerMessageID    > 0 THEN TM.CustomerMessageID
           WHEN TM.CustomerSessionID    > 0 THEN TM.CustomerSessionID
           WHEN TM.NewItemTagID         > 0 THEN TM.NewItemTagID
           WHEN TM.OutfitID             > 0 THEN TM.OutfitID
           WHEN TM.ProductTransactionID > 0 THEN TM.ProductTransactionID
           ELSE 0 END  As HrefId,
        CASE 
          WHEN TM.CustomerMessageID    > 0 THEN IsNull(C.Name, 'N/A')   
          WHEN TM.CustomerSessionID    > 0 THEN IsNull(C.Name, 'N/A')
          WHEN TM.NewItemTagID         > 0 THEN IsNull(NI.Title, 'N/A')
          WHEN TM.OutfitID             > 0 THEN IsNull(O.Name, 'N/A')
          WHEN TM.ProductTransactionID > 0 THEN IsNull(PT_PL.NameLocalized, 'N/A')
                 END as HrefText

FROM       dbo.Timeline TM
INNER JOIN dbo.CustomerSession    CS    ON TM.CustomerSessionID    = CS.CustomerSessionID
INNER JOIN dbo.CustomerMessage    CM    ON TM.CustomerMessageID    = CM.CustomerMessageID
INNER JOIN dbo.Outfit             O     ON PO.OutfitID             = O.OutfitID
INNER JOIN dbo.ProductTransaction PT    ON TM.ProductTransactionID = PT.ProductTransactionID
INNER JOIN dbo.Product            PT_P  ON PT.ProductID            = PT_P.ProductID
INNER JOIN dbo.ProductLang        PT_PL ON PT_P.ProductID          = PT_PL.ProductID
INNER JOIN dbo.Culture            CUL   ON PT_PL.CultureID         = CUL.CultureID
INNER JOIN dbo.NewsItemTag        NIT   ON TM.NewsItemTagID        = NIT.NewsItemTagID
INNER JOIN dbo.NewsItem           NI    ON NIT.NewsItemID          = NI.NewsItemID
INNER JOIN dbo.Customer           C     ON  C.CustomerID = CASE 
                                             WHEN TM.TimelineTypeID = 1 THEN CM.CustomerID 
                                             WHEN TM.TimelineTypeID = 5 THEN CS.CustomerID
                                             ELSE 0 END

WHERE        CUL.IsActive = 1

ดัชนีแบบคลัสเตอร์

CREATE UNIQUE CLUSTERED INDEX PK_TimelineMaterialized  ON 
                   TimelineMaterialized (EmployeeID, CreateUTC, CultureCode, TimelineID)

ทดสอบ SQL

-- NO HINT - - -  - - -  - - -  - - -  - - - 
SELECT  *                 --yes yes, star is bad ...just a test example
FROM    TimelineMaterialized TM 
WHERE 
            TM.EmployeeID   = 2
        AND TM.CultureCode  = 'en-US'
        AND TM.CreateUTC    > '9/10/2012'
        AND TM.CreateUTC    < '9/11/2012'

-- WITH HINT - - -  - - -  - - -  - - -  - - - 
SELECT  *               
FROM    TimelineMaterialized TM with(noexpand)
WHERE 
            TM.EmployeeID   = 2
        AND TM.CultureCode  = 'en-US'
        AND TM.CreateUTC    > '9/10/2012'
        AND TM.CreateUTC    < '9/11/2012'

ผล = 11 แถวของเอาท์พุท

เอาต์พุต 11 แถว - เหมือนกันสำหรับทั้งเคียวรี

Profiler Output
4 บรรทัดแรกไม่มีคำใบ้ 4 บรรทัดด้านล่างกำลังใช้คำใบ้

Profiler

แผนการดำเนินการ
GitHub สรุปสาระสำคัญสำหรับแผนการดำเนินการทั้งสองในรูปแบบ SQLPlan

ไม่มีแผนการดำเนินการคำแนะนำ - ทำไมไม่ใช้ดัชนีที่จัดกลุ่มไว้ให้ฉันคุณมิสเตอร์ SQL? มันคือคลัสเตอร์ในฟิลด์ตัวกรอง 3 ตัว ลองคุณอาจชอบ
ไม่มีคำใบ้ - แผนการดำเนินการขนาดใหญ่

แผนง่าย ๆ เมื่อใช้คำใบ้

การใช้คำแนะนำ - แผนการดำเนินการอย่างง่าย


คำตอบ:


26

การจับคู่มุมมองที่มีการจัดทำดัชนีเป็นการดำเนินการที่ค่อนข้างแพง * ดังนั้นเครื่องมือเพิ่มประสิทธิภาพจึงพยายามเปลี่ยนรูปแบบอื่น ๆ อย่างรวดเร็วและง่ายดายก่อน หากสิ่งที่เกิดขึ้นเพื่อสร้างแผนราคาถูก (0.05 หน่วยในกรณีของคุณ) การเพิ่มประสิทธิภาพจะสิ้นสุดก่อน การเดิมพันคือการเพิ่มประสิทธิภาพอย่างต่อเนื่องจะใช้เวลามากกว่าที่บันทึกไว้ โปรดจำไว้ว่าเป้าหมายหลักของเครื่องมือเพิ่มประสิทธิภาพคือแผน 'ดีพอ' อย่างรวดเร็ว

การใช้ดัชนีแบบคลัสเตอร์บนมุมมองนั้นไม่ได้มีราคาแพงในตัวเอง แต่กระบวนการจับคู่แผนภูมิแบบสอบถามแบบโลจิคัลกับมุมมองแบบดัชนีที่เป็นไปได้ ดังที่ฉันพูดถึงในความคิดเห็นในคำถามอื่น ๆ การอ้างอิงมุมมองในแบบสอบถามจะถูกขยายก่อนที่จะปรับให้เหมาะสมดังนั้นเครื่องมือเพิ่มประสิทธิภาพไม่ทราบว่าคุณเขียนแบบสอบถามกับมุมมองในสถานที่แรก - มันเห็นเฉพาะต้นไม้ขยาย (เช่นถ้า มุมมองถูกเรียงกัน)

"Good Enough Plan" หมายถึงเครื่องมือเพิ่มประสิทธิภาพพบแผนการที่ดีและหยุดก่อนในช่วงการสำรวจ "TimeOut" หมายความว่าเกินจำนวนขั้นตอนการปรับให้เหมาะสมซึ่งตั้งค่าตัวเองเป็น 'งบประมาณ' ในช่วงเริ่มต้นของเฟสปัจจุบัน

งบประมาณถูกกำหนดตามต้นทุนของแผนที่ดีที่สุดที่พบในระยะก่อนหน้า ด้วยการค้นหาที่มีต้นทุนต่ำ (0.05) จำนวนการย้ายงบประมาณจะค่อนข้างเล็กและหมดลงอย่างรวดเร็วจากการแปลงปกติเนื่องจากจำนวนการเข้าร่วมที่เกี่ยวข้องในแบบสอบถามตัวอย่างของคุณ (มีหลายวิธีที่จะจัดเรียงการรวมภายในใหม่ได้) .

หากคุณสนใจที่จะทราบข้อมูลเพิ่มเติมเกี่ยวกับสาเหตุที่ตรงกับมุมมองการจัดทำดัชนีที่มีราคาแพงและซ้ายดังนั้นสำหรับขั้นตอนต่อมาของการเพิ่มประสิทธิภาพและ / หรือเฉพาะการพิจารณาสำหรับการสอบถามค่าใช้จ่ายเพิ่มเติมมีสองไมโครซอฟท์งานวิจัยในหัวข้อที่นี่ (PDF) และที่นี่ (Citeseer )

อีกปัจจัยที่เกี่ยวข้องคือการจับคู่มุมมองที่มีการจัดทำดัชนีไม่สามารถใช้ได้ในการปรับให้เหมาะสมระยะ 0 (การประมวลผลธุรกรรม)

อ่านเพิ่มเติม:

มุมมองที่จัดทำดัชนีและสถิติ

* และใช้ได้เฉพาะใน Enterprise Edition (หรือเทียบเท่า)

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