我正在执行一个 select 语句来检索索引的碎片百分比并面临以下错误。
SELECT A.NAME,B.NAME,C.avg_fragmentation_in_percent
FROM SYS.TABLES A
INNER JOIN SYS.INDEXES B ON A.OBJECT_ID=B.object_id
CROSS APPLY SYS.DM_DB_INDEX_PHYSICAL_STATS(DB_ID(),
A.OBJECT_ID,B.INDEX_ID,0,DEFAULT) C
WHERE B.NAME IS NOT NULL
错误是
消息 413,级别 16,状态 1,行 1
内联函数“SYS.DM_DB_INDEX_PHYSICAL_STATS”不支持相关参数或子查询。
消息 413,级别 16,状态 1,行 1
内联函数“SYS.DM_DB_INDEX_PHYSICAL_STATS”不支持相关参数或子查询。
如果您处于 80 兼容模式,则需要:
对于 100,您需要:
另一个答案中发布的功能看起来不错且方便,得到正确的答案,当您仅衡量估计成本时,它显然是赢家,但要小心 - 当您实际继续使用时,多语句 TVF 中有很多隐藏成本它们(在这种情况下,您不能使用内联 TVF,原因与 OP 收到内置函数的错误消息相同)。以下是费用对比:
(并且只是为了显示单个查找的成本以及没有过滤器):
顺便说一句,请注意大小写(不要大写系统对象或列名),使用合理的别名,并养成使用语句终止符的习惯。
在您的数据库中创建这样的函数:
现在运行您的主要查询:
我已经在我的 SQL 2012 环境中对此进行了测试,它运行良好。
参考:http ://sqlblogcasts.com/blogs/simons/archive/2006/11/28/dmvs-and-CROSS-APPLY.aspx