Sql-Server

是否可以使用查詢提示強制進行自適應聯接?

  • October 8, 2021

是否可以強制查詢使用自適應聯接?當作為 SELECT 執行時,有問題的查詢會產生自適應連接,但當作為 SELECT INTO 執行時,它不會。

我有一個參數化查詢,它有一個子查詢,通常幾乎不選擇行(0 到 4),但偶爾會選擇 100k。

我相信這正是自適應連接設計的場景類型,但 SQL Server 並沒有選擇它作為查詢計劃。

always-hash-join 的查詢計劃會破壞伺服器,所以我目前唯一的辦法是強制連接成為嵌套循環,並接受個別最壞情況的請求將需要多幾秒鐘才能執行。

我有一個 Azure SQL 數據庫compatability 150,並且BATCH_MODE_ON_ROWSTORE=1

更多細節

由於某種原因,粘貼計劃認為此查詢的 XML 不合法。

有問題的查詢是:

with
hashes as (select h.[ContactHash]
   FROM HashTable h
       join someTable p on h.id=p.id
   group by [ContactHash]
   having count(distinct key) >1 
       and count(distinct p.thing) between 1 and 20),
dupeContacts as 
   (select distinct c.key,c.ContactHash from someTable c 
   where c.[ContactHash] in (select t.[ContactHash] from hashes t ) and c.key =  @id 
   )
   insert  into @MyTableVar
select * from dupeContacts

涉及的兩個表類似於:

HashTable (
   int id ,
   ContactHash varbinary(16)
) -- millions, typically 4:1 to someTable by ID

SomeTable (
   int id Primary Key , 
   varchar(100) thing
)

正如它在文件中所說,自適應連接目前SELECT僅支持語句:

自適應連接合格語句

有幾個條件使邏輯連接符合批處理模式自適應連接的條件:

  • 數據庫兼容級別為 140 或更高。
  • 查詢是SELECT語句(數據修改語句目前不合格)。
  • 該連接可以通過索引嵌套循環連接或雜湊連接物理算法執行。
  • Hash join 使用 Batch 模式,通過在查詢中存在 Columnstore 索引、連接直接引用 Columnstore 索引表或通過在 rowstore 上使用 Batch 模式來啟用
  • 生成的嵌套循環連接和雜湊連接的替代解決方案應該具有相同的第一個孩子(外部引用)。

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