问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何检查sql数据库索引填充因子是否产生碎片以及如何处理??

发布网友 发布时间:2022-04-26 19:02

我来回答

3个回答

热心网友 时间:2022-04-09 12:11

这是收藏的一些资料:

SQLServer提供了一个数据库命令――DBCC SHOWCONTIG――来确定一个指定的表或索引是否有碎片。
示例:
显示数据库里所有索引的碎片信息
DBCC SHOWCONTIG WITH ALL_INDEXES

显示指定表的所有索引的碎片信息
DBCC SHOWCONTIG (authors) WITH ALL_INDEXES

显示指定索引的碎片信息
DBCC SHOWCONTIG (authors,aunmind)

DBCC 执行结果:
扫描页数:如果你知道行的近似尺寸和表或索引里的行数,那么你可以估计出索引里的页数。看看扫描页数,如果明显比你估计的页数要高,说明存在内部碎片。

扫描扩展盘区数:用扫描页数除以8,四舍五入到下一个最高值。该值应该和DBCC SHOWCONTIG返回的扫描扩展盘区数一致。如果DBCC SHOWCONTIG返回的数高,说明存在外部碎片。碎片的严重程度依赖于刚才显示的值比估计值高多少。

扩展盘区开关数:该数应该等于扫描扩展盘区数减1。高了则说明有外部碎片。

每个扩展盘区上的平均页数:该数是扫描页数除以扫描扩展盘区数,一般是8。小于8说明有外部碎片。

扫描密度[最佳值:实际值]:DBCC SHOWCONTIG返回最有用的一个百分比。这是扩展盘区的最佳值和实际值的比率。该百分比应该尽可能靠近100%。低了则说明有外部碎片。

逻辑扫描碎片:无序页的百分比。该百分比应该在0%到10%之间,高了则说明有外部碎片。

扩展盘区扫描碎片:无序扩展盘区在扫描索引叶级页中所占的百分比。该百分比应该是0%,高了则说明有外部碎片。

每页上的平均可用字节数:所扫描的页上的平均可用字节数。越高说明有内部碎片,不过在你用这个数字决定是否有内部碎片之前,应该考虑fill factor(填充因子)。

平均页密度(完整):每页上的平均可用字节数的百分比的相反数。低的百分比说明有内部碎片。

解决碎片问题 :
1.删除并重建索引
2.使用DROP_EXISTING子句重建索引
3.执行DBCC DBREINDEX
4.执行DBCC INDEXDEFRAG

删除并重建索引 :

用DROP INDEX和CREATE INDEX或ALTER TABLE来删除并重建索引有些缺陷包括在删除重建期间索引会消失。在索引删除重建时,对于查询它不在可用,查询性能也许会受到明显的影响,直到重建索引为止。另一个潜在的缺陷是当都请求索引的时候会引起阻塞,直到重建索引为止。通过其他的处理也能解决阻塞,就是索引被使用的时候不删除索引。另一个主要的缺陷是在用DROP INDEX和CREATE INDEX重建聚集索引时会引起非聚集索引重建两次。删除聚集索引时非聚集索引的行指针会指向数据堆,聚集索引重建时非聚集索引的行指针又会指回聚集索引的行位置。

删除并重建索引的确有一个好处就是通过重新排序索引页,使索引页紧凑并删除不需要的索引页来完全重建索引。你也许需要考虑那些内部和外部碎片都很高的情况下才使用,以使那些索引回到它们应该在的位置。

使用DROP_EXISTING子句重建索引 :

为了避免在重建聚集索引时表上的非聚集索引重建两次,可以使用带DROP_EXISTING子句的CREATE INDEX语句。这个子句会保留聚集索引键值,以避免非聚集索引重建两次。和删除并重建索引一样,该方法也可能会引起阻塞和索引消失的问题。该方法的另一个缺陷是也强迫你去分别发现和修复表上的每一个索引。

除了和上一个方法一样的好处之外,该方法的好处是不必重建非聚集索引两次。这样可以对那些带约束的索引提供正确的索引定义以符合约束的要求。

执行DBCC DBREINDEX :

DBCC DBREINDEX类似于第二种方法,但它物理地重建索引,允许SQLServer给索引分配新页来减少内部和外部碎片。DBCC DBREINDEX也能动态的重建带约束的索引,不象第二种方法。

DBCC DBREINDEX的缺陷是会遇到或引起阻塞问题。DBCC DBREINDEX是作为一个事务来运行的,所以如果在完成之前中断了,那么你会丢失所有已经执行过的碎片。

执行DBCC INDEXDEFRAG :

DBCC INDEXDEFRAG(在SQLServer2000中可用)按照索引键的逻辑顺序,通过重新整理索引里存在的叶页来减少外部碎片,通过压缩索引页里的行然后删除那些由此产生的不需要的页来减少内部碎片。它不会遇到阻塞问题但它的结果没有其他几个方法彻底。这是因为DBCC INDEXDEFRAG跳过了锁定的页且不使用任何新页来重新排序索引。如果索引的碎片数量大的话你也许会发现DBCC INDEXDEFRAG比重建索引花费的时间更长。DBCC INDEXDEFRAG比其他方法的确有好处的是在其他过程访问索引时也能进行碎片整理,不会引起其他方法的阻塞问题。

热心网友 时间:2022-04-09 13:29

    外部碎片对于性能的影响,主要是在于需要进行更多的跨区扫描,从而造成更多的IO操作.而内部碎片会造成数据行分布在更多的页中,从而加重了扫描的页树,也会降低查询性能.

    通过查看碎片,发现这时碎片已经达到了一个比较高的程度:

    通过查看对碎片整理之前和之后的IO,可以看出,IO大大下降了:

   

 

对于碎片的解决办法

    基本上所有解决办法都是基于对索引的重建和整理,只是方式不同

    1.删除索引并重建

       这种方式并不好.在删除索引期间,索引不可用.会导致阻塞发生。而对于删除聚集索引,则会导致对应的非聚集索引重建两次(删除时重建,建立时再重建).虽然这种方法并不好,但是对于索引的整理最为有效

    2.使用DROP_EXISTING语句重建索引

       为了避免重建两次索引,使用DROP_EXISTING语句重建索引,因为这个语句是原子性的,不会导致非聚集索引重建两次,但同样的,这种方式也会造成阻塞

    3.如前面文章所示,使用ALTER INDEX REBUILD语句重建索引

       使用这个语句同样也是重建索引,但是通过动态重建索引而不需要卸载并重建索引.是优于前两种方法的,但依旧会造成阻塞。可以通过ONLINE关键字减少锁,但会造成重建时间加长.

    4.使用ALTER INDEX REORGANIZE

       这种方式不会重建索引,也不会生成新的页,仅仅是整理,当遇到加锁的页时跳过,所以不会造成阻塞。但同时,整理效果会差于前三种.

热心网友 时间:2022-04-09 15:04

sqlserver吗? dbcc 系列系统存储过程, 可以重建索引。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
找专业防水队做完还漏水怎么维权 法院会受理房屋漏水造成的纠纷吗? 巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 sql索引碎片如何自动整理?用代码可以实现吗? 判断MS SQL是否有索引碎片及解决方法 gc 什么意思?? gc什么意思? 肚子的肉软软的请问怎么减 为什么我很瘦但肉软软的? 13岁女炏的肉为什么会软软的 是不是女生的肉都是摸起来软软的 ugc pgc pugc是什么意思? 为什么有些人的肉那么软 为什么我到肉都是软软的,像面包一样? 减肥了几天,发现腿上的肉软软的,是怎么回事 为什么肉比较软 男生不胖,为什么全身肉都软软的, 有些人身上的肉是软的有些人是硬的这是为什么? 我一朋友的身上的肉摸起来很软很软的,为什么 为什么我的身体肉软,为什么肉肉会软 买的猪肉为什么太软? 自己身上的肉软趴趴的,是脾虚的表现吗? 干锅的制作方法 mssql索引怎么创建 不知道MSSQL怎么创建索引,也不懂什么是索引 请大家... 请教个mssql2005的数据查询优化问题 软水器加盐的好还是不加盐的好? mssql 视图能不能创建索引,带子查询的视图能不能创建索引,如何创建? 请教mssql 数据表 如何合理创建索引,是分开建还是合在一起建,见下面... 家用软水机中为什么要加软水盐 MSSQL 中,怎么批量删除 _WA _sys 开头自动创建的索引 软水机必须要加盐吗 sql server有哪些查询优化方法 哪位大哥告诉我:MSSQL全文索引后为啥网站变慢了? 谁来说说软水机加多少盐合适 mssql大数据检索问题 软水机加盐后需要重新设置吗 mssql数据库在磁盘阵列运行慢 MSSQL Server 自定义的函数 软水机多长时间加一次盐,加多少比较合适 mssql千万级数据update怎么优化 mssql2008运行慢问题 镇江有那些好吃的特产? 丹阳特产有哪些?