โดยสังเขป
ปัจจัยใดที่พวกเขาค้นหาการเลือกดัชนีของมุมมองที่จัดทำดัชนีไว้ของเครื่องมือเพิ่มประสิทธิภาพ
สำหรับฉันการดูที่จัดทำดัชนีดูเหมือนจะท้าทายสิ่งที่ฉันเข้าใจเกี่ยวกับวิธีที่เครื่องมือเพิ่มประสิทธิภาพเลือกดัชนี ฉันเคยเห็นสิ่งนี้ถามมาก่อนแต่ 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 แถวของเอาท์พุท
Profiler Output
4 บรรทัดแรกไม่มีคำใบ้ 4 บรรทัดด้านล่างกำลังใช้คำใบ้
แผนการดำเนินการ
GitHub สรุปสาระสำคัญสำหรับแผนการดำเนินการทั้งสองในรูปแบบ SQLPlan
ไม่มีแผนการดำเนินการคำแนะนำ - ทำไมไม่ใช้ดัชนีที่จัดกลุ่มไว้ให้ฉันคุณมิสเตอร์ SQL? มันคือคลัสเตอร์ในฟิลด์ตัวกรอง 3 ตัว ลองคุณอาจชอบ
แผนง่าย ๆ เมื่อใช้คำใบ้