ทำไมคำใบ้ READPAST ทำให้มุมมองที่จัดทำดัชนีถูกละเว้น?


10

ฉันกำลังตรวจสอบโดยใช้READPASTคำแนะนำเพื่อลดการล็อกทรัพยากรในระบบย่อยทางการเงินของแอปพลิเคชันของเรา

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

อย่างไรก็ตามฉันสังเกตเห็นประสิทธิภาพการทำงานแย่ลงสำหรับการค้นหาที่ใช้มุมมองที่จัดทำดัชนีซึ่งฉันได้ใส่READPASTคำใบ้ไว้ เปรียบเทียบแผนแบบสอบถามมันดูเหมือนกับคำใบ้เครื่องมือเพิ่มประสิทธิภาพแบบสอบถามเลือกที่จะไม่ใช้มุมมองที่จัดทำดัชนีและแทนที่จะกลับไปที่การรักษามันเหมือนมุมมองปกติ

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

SELECT TOP 1 isa.InvoiceId
FROM Financial_InvoiceSummaryAmounts isa WITH (READPAST)
WHERE isa.TotalOwedAmount = 0.0

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

SELECT TOP 1 isa.InvoiceId
FROM Financial_InvoiceSummaryAmounts isa
WHERE isa.TotalOwedAmount = 0.0

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

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

คำตอบ:


7

การใช้ตารางตัวอย่างซ้ำและมุมมองที่จัดทำดัชนีจากบทความของฉันอีกเหตุผลในการใช้NOEXPANDคำแนะนำใน Enterprise Edition :

CREATE TABLE dbo.T
(
    col1 integer NOT NULL
);
GO
INSERT dbo.T WITH (TABLOCKX)
    (col1)
SELECT 
    SV.number
FROM master.dbo.spt_values AS SV
WHERE 
    SV.type = N'P';
GO
CREATE VIEW dbo.VT
WITH SCHEMABINDING
AS
SELECT T.col1 
FROM dbo.T AS T;

Repro

แบบสอบถามนี้ตรงกับมุมมองที่จัดทำดัชนี (แม้ว่าจะมีการรวมซ้ำซ้อน):

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT;

จับคู่มุมมองที่จัดทำดัชนีไว้

การเพิ่มREADPASTคำใบ้ในการเข้าถึงตารางฐาน:

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT 
    WITH (READPAST);

มุมมองที่จัดทำดัชนีไม่ตรงกัน

คำอธิบาย

READPASTคำใบ้คือความหมายของผลกระทบต่อ เครื่องมือเพิ่มประสิทธิภาพต่อต้านการเขียนแบบสอบถามใหม่เพื่อให้ผลการเปลี่ยนแปลง เพื่อแสดง:

แบบสอบถามต่อไปนี้ดำเนินการโดยไม่มีปัญหา:

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT 
    WITH (READPAST);

อย่างไรก็ตาม:

SELECT DISTINCT
    VT.col1 
FROM dbo.VT AS VT 
    WITH (READPAST)
OPTION 
    (TABLE HINT (VT, FORCESCAN));

สร้างข้อผิดพลาด:

ข่าวสารเกี่ยวกับ 8722 ระดับ 16 สถานะ 1 สาย 42
ไม่สามารถดำเนินการค้นหา
ความหมายที่มีผลต่อคำใบ้ 'readpast' ปรากฏใน 'กับ' ส่วนของวัตถุ 'VT'
แต่ไม่อยู่ในข้อ 'TABLE HINT' ที่สอดคล้องกัน
เปลี่ยนประโยค OPTION (Table HINTS ... ) เพื่อให้ semantic มีผลต่อคำใบ้
ตรงกับส่วนคำสั่ง

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

เมื่อREADPASTไม่มีNOEXPANDการใช้คำใบ้จะแพร่กระจายไปยังตารางฐานเพื่อป้องกันการจับคู่มุมมอง (ซีแมนทิกส์ต่างกัน)

ด้วยNOEXPANDคำใบ้นั้นใช้กับมุมมองโดยตรงดังนั้นจึงไม่มีปัญหา

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