怎样让索引的扫描密度达到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%左右)。