สถิติ. ฮิสโทแกรมหลายสีเป็นไปได้หรือไม่


13

ฉันกำลังคิดถึงสถานการณ์ที่ฉันมีสองคอลัมน์ที่มีความหนาแน่นสูง แต่คอลัมน์เหล่านี้ไม่ได้เป็นอิสระ

คำนิยาม

นี่คือคำจำกัดความของตารางที่ฉันสร้างขึ้นเพื่อวัตถุประสงค์ในการทดสอบ

CREATE TABLE [dbo].[StatsTest](
    [col1] [int] NOT NULL,  --can take values 1 and 2 only
    [col2] [int] NOT NULL,  --can take integer values from 1 to 4 only
    [col3] [int] NOT NULL,  --integer. it has not relevance just to ensure that each row is different
    [col4]  AS ((10)*[col1]+[col2])  --a computed column ensuring that if two rows have different values in col1 or col2 have different values in col4 
) ON [PRIMARY]

ข้อมูล

ข้อมูลสำหรับการทดสอบมีดังนี้

col1    col2    col3    col4
1       1       1       11
1       2       2       12
1       2       3       12
1       3       4       13
1       3       5       13
1       3       6       13
1       4       7       14
1       4       8       14
1       4       9       14
1       4       10      14
2       1       11      21
2       1       12      21
2       1       13      21
2       1       14      21
2       2       15      22
2       2       16      22
2       2       17      22
2       3       18      23
2       3       19      23
2       4       20      24

ขั้นตอนที่ 1: การกรองโดย col1

SELECT * FROM StatsTest WHERE col1=1

ตามที่คาดไว้เครื่องมือเพิ่มประสิทธิภาพข้อความค้นหาจะคาดเดาจำนวนแถวที่แน่นอน จำนวนแถวจริง = 10 และจำนวนแถวโดยประมาณ = 10

ขั้นตอนที่ 2: การกรองโดย col2

SELECT * FROM StatsTest WHERE col2=1

อีกครั้งเรามีการประเมินที่สมบูรณ์แบบ

จำนวนแถวจริง = 5 และจำนวนแถวโดยประมาณ = 5

ขั้นตอนที่ 3: การกรองโดย col1 และ col2

SELECT * FROM StatsTest WHERE col1=1 AND col2=1

การประมาณนี้อยู่ไกลจากการใกล้เคียงกับจำนวนแถวจริง จำนวนแถวจริง = 1 และจำนวนแถวโดยประมาณ = 3,53553

ปัญหาคือความเกี่ยวเนื่องของตัววิเคราะห์แบบสอบถามถือว่า col1 และ col2 นั้นมีความเป็นอิสระ แต่ไม่เป็นเช่นนั้น

ขั้นตอนที่ 4: การกรองโดย col4

SELECT * FROM StatsTest WHERE col4 = 11

ฉันสามารถกรองโดย col4 = 11 เพื่อให้ได้ผลลัพธ์เช่นเดียวกับแบบสอบถามในขั้นตอนที่ 3 เนื่องจาก col4 เป็นคอลัมน์ที่คำนวณและตามวิธีที่กำหนดไว้col1 = 1 และ col2 = 1เท่ากับcol4 = 11 ที่ นี่อย่างไรก็ตาม ตามที่คาดไว้การประเมินนั้นสมบูรณ์แบบ

จำนวนแถวจริง = 1 และจำนวนแถวโดยประมาณ = 1

สรุป / คำถาม

artificial โซลูชันประดิษฐ์และไม่เหมาะสมนี้เป็นตัวเลือกเดียวที่มีเพื่อให้ได้การประเมินที่ถูกต้องเมื่อจัดการกับการกรองโดยคอลัมน์สองคอลัมน์หรือมากกว่านั้นไม่เป็นอิสระหรือไม่? ¿คอลัมน์ที่คำนวณและตัวกรองโดยคอลัมน์ที่คำนวณจำเป็นอย่างยิ่งสำหรับการได้รับความแม่นยำจริงหรือไม่?

ตัวอย่างในsqlfiddle


ทำไมไม่สร้างบางดัชนีใน col1 / 2
LowlyDBA

ในความเป็นจริงฉันทำ แต่ฉันไม่ได้รวมไว้ที่นี่เพราะมันไม่ทำงาน สำหรับฮิสโตแกรมจะพิจารณาเฉพาะคอลัมน์แรกและความหนาแน่นจะพิจารณาเฉพาะค่าที่แตกต่างเท่านั้นไม่ใช่การกระจาย
JGA

คำตอบ:


15

ฮิสโทแกรมหลายสีเป็นไปได้หรือไม่

ไม่ใช่ฮิสโทแกรมหลายมิติที่แท้จริงไม่ใช่

นี่เป็นวิธีประดิษฐ์และไม่เหมาะสมตัวเลือกเดียวที่มีอยู่เพื่อให้ได้การประเมินที่ถูกต้องเมื่อจัดการกับการกรองโดยคอลัมน์สองคอลัมน์ที่ไม่ขึ้นกับอิสระหรือไม่?

SQL Server สนับสนุนสถิติ "หลายคอลัมน์"แต่จะเก็บเฉพาะข้อมูลความหนาแน่น (ความสัมพันธ์) โดยเฉลี่ยนอกเหนือจากฮิสโตแกรมในคอลัมน์ที่มีชื่อแรก มันมีประโยชน์สำหรับการเปรียบเทียบความเท่าเทียมกันเท่านั้น

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

คุณอาจสามารถใช้ดัชนีที่กรองแล้วและสถิติที่กรองขึ้นอยู่กับรุ่นของ SQL Server :

-- Filtered statistics example
CREATE STATISTICS stats_StatsTest_col2_col1_eq_1
ON dbo.StatsTest (col2)
WHERE col1 = 1;

CREATE STATISTICS stats_StatsTest_col2_col1_eq_2
ON dbo.StatsTest (col2)
WHERE col1 = 2;

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

คอลัมน์จากการคำนวณและตัวกรองโดยคอลัมน์ที่คำนวณนั้นจำเป็นสำหรับการได้รับความแม่นยำจริงหรือไม่?

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

นอกจากนี้ยังมีแฟล็กการติดตามที่เปลี่ยนสมมติฐานที่ทำเกี่ยวกับความสัมพันธ์หลายคอลัมน์ นอกจากนี้สมมติฐานความสัมพันธ์เริ่มต้นใน SQL Server 2014 (เมื่อเปิดใช้งานการประมาณค่า cardinality ใหม่) จะเปลี่ยนจาก Independence เป็น Backoff แบบเอ็กซ์โปเนนเชียล (รายละเอียดเพิ่มเติมที่นี่และที่นี่ ) ในท้ายที่สุดนี่เป็นเพียงข้อสันนิษฐานที่ต่างออกไป จะดีกว่าในหลาย ๆ กรณีและแย่ลงในบางกรณี

ความแม่นยำที่แน่นอนในการประมาณค่า cardinality ไม่จำเป็นเสมอไปเพื่อให้ได้แผนปฏิบัติการที่ดี มีการแลกเปลี่ยนระหว่างการสร้างแผนที่สามารถนำมาใช้ใหม่สำหรับค่าพารามิเตอร์ที่แตกต่างกันและแผนที่เหมาะสมที่สุดสำหรับการดำเนินการเฉพาะ แต่ไม่นำกลับมาใช้ใหม่

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