首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

怎样让索引的扫描密度达到100% (无碎片)解决方案

2012-01-29 
怎样让索引的扫描密度达到100% (无碎片)已知表eat_info中有索引PK_EAT_INFO,使用dbccshowcontig扫描碎片信

怎样让索引的扫描密度达到100% (无碎片)
已知表   eat_info   中有   索引   PK_EAT_INFO   ,使用dbcc   showcontig   扫描碎片信息:
declare   @table_id   int
set   @table_id=object_id( 'eat_info ')
dbcc   showcontig(@table_id)
扫描结果如下:

DBCC   SHOWCONTIG   正在扫描   'EAT_INFO '   表...
表:   'EAT_INFO '(2134298663);索引   ID:   0,数据库   ID:   13
已执行   TABLE   级别的扫描。
-   扫描页数.....................................:   274
-   扫描扩展盘区数...............................:   120
-   扩展盘区开关数...............................:   119
-   每个扩展盘区上的平均页数.....................:   2.3
-   扫描密度[最佳值:实际值]....................:   29.17%[35:120]
-   扩展盘区扫描碎片.............................:   96.67%
-   每页上的平均可用字节数.......................:   1476.5
-   平均页密度(完整)...........................:   81.76%
DBCC   执行完毕。如果   DBCC   输出了错误信息,请与系统管理员联系。

重建索引    
dbcc   dbreindex( 'EAT_INFO ',PK_EAT_INFO,100)

再扫描结果还是:
DBCC   SHOWCONTIG   正在扫描   'EAT_INFO '   表...
表:   'EAT_INFO '(2134298663);索引   ID:   0,数据库   ID:   13
已执行   TABLE   级别的扫描。
-   扫描页数.....................................:   274
-   扫描扩展盘区数...............................:   120
-   扩展盘区开关数...............................:   119
-   每个扩展盘区上的平均页数.....................:   2.3
-   扫描密度[最佳值:实际值]....................:   29.17%[35:120]
-   扩展盘区扫描碎片.............................:   96.67%
-   每页上的平均可用字节数.......................:   1476.5
-   平均页密度(完整)...........................:   81.76%
DBCC   执行完毕。如果   DBCC   输出了错误信息,请与系统管理员联系。

执行DBCC   INDEXDEFRAG(sjhy1,eat_info   ,   pk_eat_info)WITH   NO_INFOMSGS  

再扫描,还是一样。

执行如下语句,重建表

select   *   into   info_bak   from   eat_info  

if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N '[dbo].[EAT_INFO] ')   and   OBJECTPROPERTY(id,   N 'IsUserTable ')   =   1)
drop   table   [dbo].[EAT_INFO]
GO


go

CREATE   TABLE   [dbo].[EAT_INFO]   (
[EAT_AUTOID]   [int]   NOT   NULL   ,
[EAT_ID]   [char]   (20)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[Eat_Sign]   [char]   (500)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[Eat_Company]   [int]   NULL   ,
[Eat_Room]   [int]   NULL   ,
[Eat_Mansum]   [int]   NULL   ,
[Eat_Phase]   [int]   NULL   ,
[EAT_ETIME]   [datetime]   NULL   ,
[EAT_BTIME]   [datetime]   NULL   ,
[EAT_Z_MONEY]   [money]   NULL   ,
[EAT_K_MONEY]   [money]   NULL   ,
[EAT_Y_MONEY]   [money]   NULL   ,
[EAT_W_MONEY]   [money]   NULL   ,
[EAT_STATE]   [int]   NULL   ,
[EAT_JDY]   [int]   NULL   ,
[Eat_Waiter]   [char]   (10)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[Eat_Bz]   [char]   (20)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[Yx]   [bit]   NOT   NULL   ,
[iccard_autoid]   [int]   NULL   ,
[cust_code]   [char]   (12)   COLLATE   Chinese_PRC_CI_AS   NULL   ,


[remark]   [varchar]   (50)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[eat_zkuser]   [varchar]   (60)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[eat_zkremark]   [varchar]   (20)   COLLATE   Chinese_PRC_CI_AS   NULL   ,
[invoicedyn]   [bit]   NULL  
)   ON   [PRIMARY]
GO

ALTER   TABLE   [dbo].[EAT_INFO]   WITH   NOCHECK   ADD  
CONSTRAINT   [DF_EAT_INFO_eat_zkuser]   DEFAULT   ( '0/0 ')   FOR   [eat_zkuser],
CONSTRAINT   [DF_EAT_INFO_eat_zkremark]   DEFAULT   (1)   FOR   [eat_zkremark],
CONSTRAINT   [PK_EAT_INFO]   PRIMARY   KEY     NONCLUSTERED  
(
[EAT_AUTOID]
)   WITH     FILLFACTOR   =   100     ON   [PRIMARY]  
GO


insert   into   eat_info   select   *   from   info_bak

再扫描
结果如下:

DBCC   SHOWCONTIG   正在扫描   'EAT_INFO '   表...
表:   'EAT_INFO '(370816383);索引   ID:   0,数据库   ID:   13
已执行   TABLE   级别的扫描。
-   扫描页数.....................................:   272
-   扫描扩展盘区数...............................:   40
-   扩展盘区开关数...............................:   39
-   每个扩展盘区上的平均页数.....................:   6.8
-   扫描密度[最佳值:实际值]....................:   85.00%[34:40]
-   扩展盘区扫描碎片.............................:   17.50%
-   每页上的平均可用字节数.......................:   1427.8
-   平均页密度(完整)...........................:   82.36%
DBCC   执行完毕。如果   DBCC   输出了错误信息,请与系统管理员联系。

不知扫描密度过低是否对数据库性能有大的影响,如果有如何提高。dbcc   dbreindex重建索引好像不起什么作用,恳请各位指点




[解决办法]
使用索引碎片整理就行了
[解决办法]
填充因子呢?
[解决办法]
look look~~~
[解决办法]
平均页密度(完整)这个也是非常关键的

有数据更新操作后,密度肯定会变的
[解决办法]
up
[解决办法]
我也遇到了同样的问题,出现这个现象的主要是“扩展盘区扫描碎片”此项值引起的,按照微软的说明“如果索引跨越多个文件,则此数字无意义。”,即会存在较多的扩展盘区,即使进行了碎片整理,此项值也会存在,故此现象可不需理会。只要定时整理索引碎片即可。另填充因子的设置也比较关键,若写多的话填充因子大写90%,若读多的话填充因子可相对小些(建议75%左右)。

热点排行