Sql-Server
向 CROSS APPLY 添加查詢提示
我需要在此查詢中應用查詢提示(如
NOWAIT
或NOLOCK
)CROSS 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)