一个表,A,B,C 三字段,A 和B 是关键字,聚集索引。6000多笔记录,索引重建N次,扫描密度仍然不变:表: 'AAA' (1762925452);索引 ID: 1,数据库 ID: 16
已执行 TABLE 级别的扫描。
- 扫描页数................................: 17
- 扫描区数..............................: 9
- 区切换次数..............................: 8
- 每个区的平均页数........................: 1.9
- 扫描密度 [最佳计数:实际计数].......: 33.33% [3:9]
- 逻辑扫描碎片 ..................: 41.18%
- 区扫描碎片 ..................: 77.78%
- 每页的平均可用字节数........................: 349.5
- 平均页密度(满).....................: 95.68%
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。求解,如何将碎片处理让他接近100%?记录删除后是100%扫描密度

解决方案 »

  1.   

    有没其他高手能给予帮助下呀。
    现在 系统出问题比较急,查到是这个表,跟踪有语句INSERT到这个表,将这表清空的话程序是正常的,这个表没清空有6000多笔记录,程序就卡死在那边
      

  2.   

    扫描页数................................: 17
    总共17个page,是否可认定有一部分数据是在混合区存储
    此时你重建索引什么的,后面的密度啊什么的是不会有太大变化的吧
    不知道是不是这样。
    通常从混合区向新表或索引分配页。当表或索引增长到 8 页时,将变成使用统一区进行后续分配。如果对现有表创建索引,并且该表包含的行足以在索引中生成 8 页,则对该索引的所有分配都使用统一区进行。
      

  3.   

    这个不算大吗?执行时有看到死锁的语句就是在INSERT INTO 这个表上
    填充因子设置的是0
      

  4.   

    你A,B,C三列的数据类型是什么?
      

  5.   

    进程中看到的其中一个进程上的语句就是INSERT INTO 这个表。这个表同时应该不会有其他客户端在操作。
    ABC都是INT 类型。不管怎样,要怎样让密度接近100%?
      

  6.   

    方便把语句提出来看看吗?死锁的话系统会直接报错的,阻塞是程序比较常见的问题。另外如果阻塞的那个执行运行不会非长久的话,把阻塞和顺利完成的两个查询的执行计划贴出来看看,使用ctrl+m就可以获取执行计划。
      

  7.   

    是不是条件查询比较慢,把INSERT阻塞了,先尝试优化查询。
    数据量很少,不应该是索引碎片的问题,除非是N久没整理过的堆表。
    不行就把所有SELECT里加WITH(NOLOCK)。
      

  8.   

    重建一下表,你试试看:
    alter table 表名
    rebuild 
      

  9.   

    如果只是因为你觉得碎片率太大,可以通过上面的重建索引来最小化碎片,提高扫描效率。像你说的你已经重建索引N次了,但是扫描密度仍然不变,那有可能是这个表的数据变化非常大,你刚重建完成,一会又有插入大量数据,这样你再次看扫描密度时,又发现这个表的碎片很大。另外,你可以试试再新建一个表,把这个源表的数据,导入到这个新的表,然后再把这个新表的表名改为源表的表名,看看情况会怎么样。我觉得程序卡住了,也有可能是有锁,因为这个表上有锁,会导致select 这个表的时候很慢,
    而一旦把这个表的数据清空了后,锁也没有了,等一段时间后这个表又会insert数据,又会再次有锁定,而且有数据插入,又会导致碎片化。