QueryStore 計劃強制限制
我有一個
DELETE
針對具有全文索引列的表執行的語句,少數cascade
啟用的外鍵。它看起來像這樣:DELETE FROM dbo.STUDENTS WHERE STUDENTID=@STUDENTID
有時會編譯一個計劃,其中包括對所有索引操作的非常高的行估計,這樣會
DELETE
花費很長時間並導致鎖定。我試圖在 QueryStore 中強制執行一個好的計劃,但這實際上不起作用,顯示
last forced plan failure description
.NO_PLAN
我已確保沒有可能使計劃無效的架構更改。
查看執行計劃,我看到這
DELETE
涉及到一個包含 FT 索引的系統表的連接:加入 FT 索引是否意味著不支持計劃強制?
在查看計劃強制限制時,要點之一是:
分佈式查詢或全文操作
但是,此限制並不意味著刪除會導致計劃強制失敗。
考慮這 4 個查詢,兩個
SELECT
語句和兩個DELETE
語句,該表在列上具有全文索引val
:SELECT * FROM dbo.fulltextindexed; SELECT val FROM dbo.fulltextindexed WHERE CONTAINS(val, N'WOW'); DELETE top(1) FROM dbo.fulltextindexed; DELETE top(1) FROM dbo.fulltextindexed WHERE id <500 and id > -1;
唯一失敗的查詢是第二個查詢,它使用以下
CONTAINS
語句:以失敗的原因為
DQ_NO_FORCING_SUPPORTED
。兩個刪除語句的計劃也顯示了相同的
clustered index merge
運算符被強制執行:此來源提供了更多資訊
DQ_NO_FORCING_SUPPORTED
:無法執行查詢,因為計劃與分佈式查詢或全文操作的使用衝突
回答問題
加入 FT 索引是否意味著不支持計劃強制?
我的回答是,這不是你應該看到的原因,
DQ_NO_FORCING_SUPPORTED
而不是NO_PLAN
錯誤。原因可能是由於另一個限制導致計劃無效,索引更改,添加外鍵,……額外測試
添加表並使用 on delete 級聯創建外鍵時,該外鍵引用上述查詢中使用的表。我們預計刪除會失敗,因為我們不能再使用強制計劃。
CREATE TABLE dbo.fulltexreference(id int identity(1,1) primary key not null, t1id int, val varchar(max)); ALTER TABLE dbo.fulltexreference add constraint FK_test foreign key(t1id) REFERENCES dbo.fulltextindexed(id) ON DELETE CASCADE;
重新實施計劃給了我們救贖:
並消除了
NO_PLAN
問題對於具有全文索引的表也是如此,該表具有引用執行刪除查詢的主表的外鍵(帶有 on delete 級聯)。
關於高/低估計
如果刪除沒有執行那麼多,添加
OPTION(RECOMPILE)
可能有助於高行估計,因為優化器在執行時“看到”變數,這可以為您提供更好的估計。使用查詢計劃發布不同的問題可能會帶來不同的解決方法/解決方案。