Sql-Server

QueryStore 計劃強制限制

  • September 5, 2019

我有一個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了兩個刪除語句 在此處輸入圖像描述

重新實施計劃給了我們救贖:

在此處輸入圖像描述

並消除了NO_PLAN問題

在此處輸入圖像描述

對於具有全文索引的表也是如此,該表具有引用執行刪除查詢的主表的外鍵(帶有 on delete 級聯)。

關於高/低估計

如果刪除沒有執行那麼多,添加OPTION(RECOMPILE)可能有助於高行估計,因為優化器在執行時“看到”變數,這可以為您提供更好的估計。

使用查詢計劃發布不同的問題可能會帶來不同的解決方法/解決方案。

引用自:https://dba.stackexchange.com/questions/234020