ความแตกต่างระหว่างการค้นหาคำกริยาและคำกริยา


12

ฉันพยายามปรับแต่งคำถามที่เรามีใน SQL Server 2014 Enterprise

ฉันได้เปิดแผนแบบสอบถามจริงใน SQL Sentry Plan Explorer และฉันสามารถดูบนโหนดเดียวว่ามีSeek PredicateและPredicate

ข้อแตกต่างระหว่างSeek PredicateและPredicateคืออะไร

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุ: ฉันสามารถเห็นได้ว่ามีปัญหามากมายกับโหนดนี้ (เช่นแถวโดยประมาณ vs จริง, IO ที่เหลือ) แต่คำถามไม่เกี่ยวข้องกับสิ่งใด ๆ


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

5
Rob Farley กล่าวต่อไปนี้ในความคิดเห็นที่นี่ :The Seek Predicate can be used to find the start of the RangeScan and then when to stop, while the Predicate is the "check" that is applied to every row in the Range.
Aaron Bertrand

คำตอบ:


18

ลองโยนหนึ่งล้านแถวไปยังตารางชั่วคราวพร้อมกับคอลัมน์สองสาม:

CREATE TABLE #174860 (
PK INT NOT NULL, 
COL1 INT NOT NULL,
COL2 INT NOT NULL,
PRIMARY KEY (PK)
);

INSERT INTO #174860 WITH (TABLOCK)
SELECT RN
, RN % 1000
, RN % 10000
FROM 
(
    SELECT TOP 1000000 ROW_NUMBER () OVER (ORDER BY (SELECT NULL)) RN
    FROM   master..spt_values v1,
           master..spt_values v2
) t;

CREATE INDEX IX_174860_IX ON #174860 (COL1) INCLUDE (COL2);

ที่นี่ฉันมีดัชนีคลัสเตอร์ (โดยค่าเริ่มต้น) ในPKคอลัมน์ มีดัชนีที่ไม่เป็นคลัสเตอร์COL1ซึ่งมีคอลัมน์สำคัญCOL1และรวมCOL2อยู่ด้วย

พิจารณาคำถามต่อไปนี้:

SELECT *
FROM #174860
WHERE PK >= 15000 AND PK < 15005
AND COL2 = 5000;

ที่นี่ฉันไม่ได้ใช้BETWEENเพราะ Aaron Bertrand แขวนอยู่กับคำถามนี้

เครื่องมือเพิ่มประสิทธิภาพเซิร์ฟเวอร์ SQL ควรถามคำถามนั้นอย่างไร ฉันรู้ว่าตัวกรองบนPKจะลดผลลัพธ์ที่ตั้งค่าเป็นห้าแถว เซิร์ฟเวอร์ SQL สามารถใช้ดัชนีคลัสเตอร์เพื่อข้ามไปยังห้าแถวเหล่านั้นแทนที่จะอ่านผ่านแถวทั้งหมดล้านแถวในตาราง อย่างไรก็ตามดัชนีคลัสเตอร์มีคอลัมน์ PK เป็นคอลัมน์สำคัญเท่านั้น COL2เมื่อแถวที่ถูกอ่านในหน่วยความจำที่เราจำเป็นต้องใช้ตัวกรองบน ที่นี่PKคือการค้นหาคำกริยาและCOL2เป็นคำกริยา

ป้อนคำอธิบายรูปภาพที่นี่

เซิร์ฟเวอร์ SQL ค้นหาห้าแถวโดยใช้การค้นหาคำกริยาและลดห้าแถวเหล่านั้นเป็นหนึ่งแถวด้วยเพรดิเคตปกติ

ถ้าฉันกำหนดดัชนีคลัสเตอร์แตกต่างกัน:

CREATE TABLE #174860 (
PK INT NOT NULL, 
COL1 INT NOT NULL,
COL2 INT NOT NULL,
PRIMARY KEY (COL2, PK)
);

และเรียกใช้แบบสอบถามเดียวกันฉันได้รับผลลัพธ์ที่แตกต่าง:

ป้อนคำอธิบายรูปภาพที่นี่

ในกรณีนี้ SQL Server สามารถค้นหาการใช้ทั้งสองคอลัมน์ในWHEREข้อ อ่านหนึ่งแถวจากตารางโดยใช้คอลัมน์สำคัญ

สำหรับอีกตัวอย่างหนึ่งให้พิจารณาคำถามนี้:

SELECT *
FROM #174860
WHERE COL1 = 500
AND COL2 = 3545;

ดัชนี IX_174860_IX เป็นดัชนีที่ครอบคลุมเนื่องจากมีคอลัมน์ทั้งหมดที่จำเป็นสำหรับการสืบค้น อย่างไรก็ตามมีเพียงCOL1คอลัมน์สำคัญ SQL Server สามารถค้นหาด้วยคอลัมน์นั้นเพื่อค้นหา 1,000 แถวด้วยCOL1ค่าที่ตรงกัน สามารถกรองแถวเหล่านั้นลงในCOL2คอลัมน์เพิ่มเติมเพื่อลดผลลัพธ์สุดท้ายที่กำหนดเป็น 0 แถว

ป้อนคำอธิบายรูปภาพที่นี่

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