พิจารณาคำถามและแผนการดำเนินการของAdventureWorks ที่แสดงด้านล่าง AND
แบบสอบถามประกอบด้วยภาคการเชื่อมต่อกับ การประเมินความสำคัญของเครื่องมือเพิ่มประสิทธิภาพคือแถวที่41,211 :
-- Estimate 41,211 rows
SELECT COUNT_BIG(*)
FROM Production.TransactionHistory AS TH
WHERE
TH.TransactionID BETWEEN 100000 AND 168336
AND TH.TransactionDate BETWEEN '2007-09-01' AND '2008-03-13';
ใช้สถิติเริ่มต้น
เมื่อได้รับสถิติคอลัมน์เดียวเท่านั้นโปรแกรมเพิ่มประสิทธิภาพจะสร้างการประมาณนี้โดยการประเมินความสำคัญเชิงหัวใจสำหรับแต่ละภาคแยกจากกันและคูณผลการคัดเลือกที่ได้ ฮิวริสติกนี้สันนิษฐานว่าภาคแสดงมีความเป็นอิสระอย่างสมบูรณ์
การแยกคิวรีออกเป็นสองส่วนทำให้การคำนวณง่ายขึ้นที่จะเห็น:
-- Estimate 68,336.4 rows
SELECT COUNT_BIG(*)
FROM Production.TransactionHistory AS TH
WHERE
TH.TransactionID BETWEEN 100000 AND 168336;
ตารางประวัติการทำธุรกรรมประกอบด้วยจำนวน 113,443 แถวดังนั้นการประมาณการ 68,336.4 จึงเป็นตัวเลือกที่ 68336.4 / 113443 = 0.60238533สำหรับภาคแสดงนี้ การประมาณนี้ได้มาโดยใช้ข้อมูลฮิสโตแกรมสำหรับTransactionID
คอลัมน์และค่าคงที่ที่ระบุในแบบสอบถาม
-- Estimate 68,413 rows
SELECT COUNT_BIG(*)
FROM Production.TransactionHistory AS TH
WHERE
TH.TransactionDate BETWEEN '2007-09-01' AND '2008-03-13';
กริยานี้มีการคัดสรรประมาณ 68,413.0 / 113,443 = 0.60306056 อีกครั้งมันถูกคำนวณจากค่าคงที่ของภาคแสดงและฮิสโตแกรมของTransactionDate
วัตถุสถิติ
สมมติว่าภาคแสดงมีความเป็นอิสระอย่างสมบูรณ์เราสามารถประเมินการเลือกของภาคแสดงทั้งสองด้วยกันโดยการคูณพวกมันเข้าด้วยกัน การประเมินค่าความสำคัญเชิงหัวใจสุดท้ายนั้นได้มาจากการคูณการเลือกที่เกิดขึ้นจาก 113,443 แถวในตารางฐาน:
0.60238533 * 0.60306056 * 113443 = 41210.987
หลังการปัดเศษนี่เป็นประมาณการ 41,211 ที่เห็นในแบบสอบถามต้นฉบับ (เครื่องมือเพิ่มประสิทธิภาพยังใช้คณิตศาสตร์จุดลอยภายใน)
ไม่ใช่การประเมินที่ยอดเยี่ยม
TransactionID
และTransactionDate
คอลัมน์มีความสัมพันธ์ใกล้ชิดในข้อมูล AdventureWorks ที่กำหนด (เป็นกุญแจ monotonically เพิ่มขึ้นและคอลัมน์วันมักจะทำ) ความสัมพันธ์นี้หมายความว่ามีการละเมิดสมมติฐานที่เป็นอิสระ ดังนั้นแผนการสืบค้นข้อมูลหลังการประมวลผลจะแสดงแถว 68,095 มากกว่าระดับ 41,211 โดยประมาณ:
ติดตามสถานะ 4137
การเปิดใช้งานการตั้งค่าสถานะการติดตามนี้เปลี่ยนแปลงฮิวริสติกที่ใช้ในการรวมเพรดิเคต แทนที่จะใช้ความเป็นอิสระอย่างสมบูรณ์เครื่องมือเพิ่มประสิทธิภาพจะพิจารณาว่าการเลือกของภาคแสดงทั้งสองอยู่ใกล้พอที่จะทำให้มีความสัมพันธ์กันได้:
-- Estimate 68,336.4
SELECT COUNT_BIG(*)
FROM Production.TransactionHistory AS TH
WHERE
TH.TransactionID BETWEEN 100000 AND 168336
AND TH.TransactionDate BETWEEN '2007-09-01' AND '2008-03-13'
OPTION (QUERYTRACEON 4137);
จำได้ว่าTransactionID
คำกริยาเพียงอย่างเดียวประมาณ 68,336.4 แถวและเพรดิเคตTransactionDate
เพียงอย่างเดียวประมาณ 68,413 แถว เครื่องมือเพิ่มประสิทธิภาพได้เลือกค่าประมาณสองค่านี้ต่ำกว่าการเลือกแบบทวีคูณ
นี่เป็นเพียงวิธีแก้ปัญหาที่แตกต่างกัน แต่เป็นวิธีที่สามารถช่วยปรับปรุงการประมาณการสำหรับข้อความค้นหาที่เกี่ยวข้องกับภาคAND
แสดงได้ เพรดิเคตแต่ละตัวจะพิจารณาความสัมพันธ์ที่เป็นไปได้และมีการปรับอื่น ๆ ที่ทำขึ้นเมื่อมีหลายAND
ประโยคที่เกี่ยวข้อง แต่ตัวอย่างนั้นทำหน้าที่แสดงพื้นฐานของมัน
สถิติหลายคอลัมน์
สิ่งเหล่านี้สามารถช่วยในการสืบค้นด้วยความสัมพันธ์ แต่ข้อมูลฮิสโตแกรมยังคงยึดตามคอลัมน์นำของสถิติเท่านั้น สถิติผู้สมัครหลายคอลัมน์ต่อไปนี้จึงแตกต่างกันในวิธีที่สำคัญ:
CREATE STATISTICS
[stats Production.TransactionHistory TransactionID TransactionDate]
ON Production.TransactionHistory
(TransactionID, TransactionDate);
CREATE STATISTICS
[stats Production.TransactionHistory TransactionDate TransactionID]
ON Production.TransactionHistory
(TransactionDate, TransactionID);
การรับหนึ่งในนั้นเราสามารถเห็นได้ว่าข้อมูลพิเศษเพียงอย่างเดียวคือระดับความหนาแน่นที่เพิ่มขึ้นของ 'ทั้งหมด' ฮิสโตแกรมยังคงมีข้อมูลรายละเอียดเกี่ยวกับTransactionDate
คอลัมน์เท่านั้น
DBCC SHOW_STATISTICS
(
'Production.TransactionHistory',
'stats Production.TransactionHistory TransactionDate TransactionID'
);
ด้วยสถิติหลายคอลัมน์เหล่านี้ในสถานที่ ...
SELECT COUNT_BIG(*)
FROM Production.TransactionHistory AS TH
WHERE
TH.TransactionID BETWEEN 100000 AND 168336
AND TH.TransactionDate BETWEEN '2007-09-01' AND '2008-03-13';
... แผนการดำเนินการแสดงการประมาณการที่เหมือนกับเมื่อมีสถิติคอลัมน์เดียวเท่านั้นที่มีอยู่:
Statistics objects on multiple columns also store statistical information about the correlation of values among the columns