Sql-Server

向 CROSS APPLY 添加查詢提示

  • August 27, 2020

我需要在此查詢中應用查詢提示(如NOWAITNOLOCKCROSS APPLY。我該怎麼做:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

SELECT *
FROM sys.objects obj WITH (NOLOCK) 
INNER JOIN sys.stats stat WITH (NOLOCK) ON stat.object_id = obj.object_id  
CROSS APPLY sys.dm_db_stats_properties(stat.object_id, stat.stats_id) sp

我無權訪問函式內容(出於顯而易見的原因。)

我繼續從問題中刪除了repro,以使其更清楚。我不太關心重現阻塞的能力。(這也發生在客戶環境和第 2548 期的第一響應者工具包中。)

據我所知,你不能。

一個人可能會嘗試這樣的事情:

OPTION (TABLE HINT (sp, READUNCOMMITTED))

…但是對於不是真實表格的東西,這將失敗。

OPENROWSET不能在TABLE HINT子句中指定表值或函式“sp”。

它也會失敗,因為所需的提示是語義影響的。

如果您需要訪問的東西沒有響應設置隔離級別,您將不得不報告缺陷並希望得到修復。

有一個關於 DMV 和不尊重隔離級別的 Connect 項目,據我所知,官方的說法是不能保證系統功能的隔離級別。

亞倫伯特蘭說:

無論提示如何到達那裡,有些內置函式根本不遵守隔離級別(例如OBJECT_SCHEMA_NAME().


此外,正如馬丁·史密斯所說:

問題實際上是如何將其應用於 TVF - 而不是CROSS APPLY

SELECT * FROM sys.dm_db_stats_properties(1,1) WITH (NOLOCK)

也失敗了。但反過來,這會成功:

SELECT *
FROM sys.objects obj WITH (NOLOCK) 
INNER JOIN sys.stats stat WITH (NOLOCK) ON stat.object_id = obj.object_id  
CROSS APPLY sys.objects obj2 WITH (NOLOCK)

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