向 CROSS APPLY 添加查询提示

Bre*_*zar 4 sql-server hints t-sql cross-apply

我需要将查询提示(如NOWAITNOLOCK)应用于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
Run Code Online (Sandbox Code Playgroud)

我无权访问函数内容(出于显而易见的原因。)

我继续从问题中删除了repro,以使其更清楚。我不太关心重现阻塞的能力。(它也发生在客户环境中,以及第 2548 期的 First Responder Kit 中。)

Pau*_*ite 5

你不能,据我所知。

人们可能会尝试这样的事情:

OPTION (TABLE HINT (sp, READUNCOMMITTED))
Run Code Online (Sandbox Code Playgroud)

...但是对于不是真正表格的东西,这将失败。

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

它也会失败,因为所需的提示会影响语义。

如果您需要访问的东西对设置隔离级别没有响应,您将不得不报告缺陷并希望得到修复。

有一个关于 DMV 和什么不尊重隔离级别的 Connect 项目,据我所知,官方说法是系统功能不保证隔离级别。

亚伦伯特兰说:

有一些内置函数根本不遵守隔离级别,无论提示如何到达那里(例如OBJECT_SCHEMA_NAME().


此外,正如马丁·史密斯所说:

问题实际上是如何将其应用于 TVF - 而不是 CROSS APPLY

SELECT * FROM sys.dm_db_stats_properties(1,1) WITH (NOLOCK)
Run Code Online (Sandbox Code Playgroud)

也失败了。但相反,这成功了:

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)
Run Code Online (Sandbox Code Playgroud)