首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sys.dm_db_index_physical_stats非常慢

sys.dm_db_index_physical_stats非常慢
EN

Database Administration用户
提问于 2014-09-12 08:13:20
回答 3查看 9K关注 0票数 9

我有一个大约4.5TB的数据库,因为我们在一个表(按月划分)上有并行插入(以减少每日负载时间),因此这个表上的聚集索引往往是严重分散的。当我从这个表上的sys.dm_db_index_physical_stats (Limited)中进行选择时,它需要时间(> 4-5小时)。有没有一种更快更好的方法来检查这个表的分区上的碎片级别,目前所花费的时间是完全不可接受的。

EN

回答 3

Database Administration用户

发布于 2014-09-12 08:38:52

不要为整个数据库运行DMV,而是为特定的表或索引运行它。由于数据库的规模很大,这肯定需要时间。

你必须读保罗·兰德尔的解释关于为什么这个车管所可能需要更多的时间。

DMV的思想是显示索引的物理属性(以及堆的特殊情况)--为了做到这一点,它必须扫描包含索引的页面,计算统计数据。许多DMV支持所谓的谓词下推,这意味着如果指定WHERE子句,DMV在准备信息时会考虑到这一点。这个DMV没有,如果你只要求数据库中逻辑碎片> 30%的索引,它会扫描所有的索引,然后告诉你那些符合你的标准的索引。它必须这样做,因为在分析这些标准之前,它无法知道哪些标准符合您的标准--因此不能支持谓词下推。

您是否尝试过用于索引重建的Ola Hallengren解决方案。

正如他在文章中提到的那样,你可以尝试多种模式。但正如你所说的,有限公司也花了4到5个小时,我想这就是车管所。它实际上是缓慢的,甚至MS对此也有同样的看法。

索引重建被认为是维护活动,应该在服务器负载相对较少或在维护窗口期间完成。

票数 8
EN

Database Administration用户

发布于 2020-09-29 11:15:35

今天看完这篇文章后,我做了一个测试。我在Server 2019上有一个非常零碎的表。

表本身是3GB,索引是6GB。我只使用查询检查了一个表:

代码语言:javascript
复制
SELECT OBJECT_NAME(ips.OBJECT_ID), 
       i.NAME, 
       ips.index_id, 
       index_type_desc, 
       avg_fragmentation_in_percent, 
       avg_page_space_used_in_percent, 
       page_count
FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'SAMPLED') ips
     INNER JOIN sys.indexes i ON(ips.object_id = i.object_id)
                                AND (ips.index_id = i.index_id)
    WHERE OBJECT_NAME(ips.OBJECT_ID) = 'MyTableName'
ORDER BY avg_fragmentation_in_percent DESC;

在一个不受压力的测试数据库上花了01:18h。

所以,是的,有时候它会非常慢

票数 1
EN

Database Administration用户

发布于 2020-12-04 03:13:59

试试这个:

代码语言:javascript
复制
SELECT dbschemas.[name] as 'Schema',
dbtables.[name] as 'Table',
dbindexes.[name] as 'Index',
indexstats.avg_fragmentation_in_percent,
indexstats.page_count
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, NULL) AS indexstats
INNER JOIN sys.tables dbtables on dbtables.[object_id] = indexstats.[object_id]
INNER JOIN sys.schemas dbschemas on dbtables.[schema_id] = dbschemas.[schema_id]
INNER JOIN sys.indexes AS dbindexes ON dbindexes.[object_id] = indexstats.[object_id]
AND indexstats.index_id = dbindexes.index_id
WHERE indexstats.database_id = DB_ID()
ORDER BY indexstats.avg_fragmentation_in_percent desc

信贷:https://www.se.com/ww/en/faqs/FA234246/

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/76374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档