分享:查询索引碎片SQL调整

dongsheng10101 2016-07-28 03:26:17
原查询索引碎片SQL如下:
SELECT object_name(dt.object_id) Tablename,si.name IndexName,
dt.avg_fragmentation_in_percent AS ExternalFragmentation,
dt.avg_page_space_used_in_percent AS InternalFragmentation FROM
( SELECT object_id,index_id,avg_fragmentation_in_percent,avg_page_space_used_in_percent
FROM sys.dm_db_index_physical_stats (db_id(‘数据库名’),null,null,null,’DETAILED’ )
WHERE index_id <> 0) AS dt INNER JOIN sys.indexes si ON si.object_id=dt.object_id
AND si.index_id=dt.index_id
AND dt.avg_fragmentation_in_percent>10 AND
dt.avg_page_space_used_in_percent<75 ORDER BY avg_fragmentation_in_percent DESC

-------------------------------------------------------
以上SQL,存在一点小问题:
在SQL2008中附加SQL2000数据库,然后执行上面或下面SQL语句,会报错:')' 附近有语法错误。
select object_name([object_id]) 表名,* from sys.dm_db_index_physical_stats(db_id(),null,null,null,null)

请问这是为什么?
(在SQL2008中,直接新建数据库,然后执行上面SQL,是正常的)
--------------------------------------------------

针对上面问题,
本人对最上面的SQL语句做了两次调整,问题解决了,SQL如下:

declare @databaseName varchar(50),@dbid int
set @databaseName='barcodeXuTai'
select @dbid=db_id(@databaseName)

SELECT object_name(dt.object_id) 表名,
si.name 索引名,
dt.avg_fragmentation_in_percent AS 索引外部碎片,
dt.avg_page_space_used_in_percent AS 索引内部碎片
FROM
( SELECT object_id,index_id,avg_fragmentation_in_percent,avg_page_space_used_in_percent
FROM master.sys.dm_db_index_physical_stats(@dbid,null,null,null,'DETAILED')
WHERE index_id <> 0
) AS dt INNER JOIN sys.indexes si ON si.object_id=dt.object_id
AND si.index_id=dt.index_id
AND dt.avg_fragmentation_in_percent>10
AND dt.avg_page_space_used_in_percent<75
ORDER BY avg_fragmentation_in_percent DESC
...全文
201 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongsheng10101 2016-07-29
  • 打赏
  • 举报
回复
看了下数据库兼容性,确定是这个问题, SQL2000:80 SQL2005:90 SQL2008:100 SQL2000数据库附加到2008,其兼容性还是80,得改成100,这样最初SQL就不会报错了。 这样就不用如我之前那般,调整SQL(虽然也可以正确执行)来解决此问题了。 谢谢<roy_88>版主
中国风 2016-07-28
  • 打赏
  • 举报
回复
还原SQL2000默认兼容性为80,要人为改动100,才支持用你以上语句 应该是这样问题引起的报错
中国风 2016-07-28
  • 打赏
  • 举报
回复
USE [master] GO ALTER DATABASE [数据库名] SET COMPATIBILITY_LEVEL = 100 GO 改兼容性再执行语句试试

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧