SqlServer-索引

年老小白一第二条
SqlServer-索引

(生产上的数据查询突然变得超慢,遂查询诸多,在此简单总结)
缘由:表的增删改会造成索引碎片,碎片率达到一定程度,会造成索引无用,所以会慢,故:需重建索引!
两种方法:dbcc dbreindex/indexdefrag(重建【锁表】/整理)和alert index reorganize/rebuild(重组/重建)

一、DBCC DBREINDEX/INDEXDEFRAG

此方法一般在SqlServer2000中使用,重建索引(单个或多个)。(官方文档:后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 改用 ALTER INDEX。)

使用:
DBCC SHOWCONTIG(表名)
查看碎片使用情况—(注意)—扫描密度[最佳计数/实际计数]:最佳计数与实际计数相当时说明索引是比较好的,如相差太多,就需要重新建或组织索引。
DBCC DBREINDEX(表名,’’,填充因子)
第一个参数是要重建索引的表名;第二个参数指定索引名称;空着就表示所有;第三个参数叫填充因子,是指索引页的数据填充程度,0表示使用先前的值,100表示每个索引页都填满,这时查询效率最高,但插入索引时会移动其它索引,可根据实际情况来设置。
DBCC INDEXDEFRAG(0,表名,索引名)
整理索引碎片,不更新表的统计信息

通过sql server 代理创建定时任务定期来重建索引

DECLARE @TABLENAME NVARCHAR(MAX)
IF(CURSOR_STATUS('global','TABLE_CURSOR')<>'-3')
	BEGIN
		CLOSE TABLE_CURSOR
		DEALLOCATE TABLE_CURSOR
	END
DECLARE TABLE_CURSOR CURSOR FOR SELECT NAME FROM SYS.objects WHERE TYPE = 'U' AND name LIKE 'T_HIS%' ORDER BY modify_date DESC
OPEN TABLE_CURSOR
FETCH NEXT FROM TABLE_CURSOR INTO @TABLENAME
WHILE (@@FETCH_STATUS = 0) 
	BEGIN 
		dbcc dbreindex (@TABLENAME,'',80)
		FETCH NEXT FROM TABLE_CURSOR INTO @TABLENAME
	END
CLOSE TABLE_CURSOR
DEALLOCATE TABLE_CURSOR

二、ALERT INDEX REORGANIZE/REBUILD

SqlServer2005语法。

使用:
alter index all on table_name rebuild with (online=on)
重建表上的所有索引
alter index index_name on table_name rebuild with (online=on)
重建表上的某个索引
alter index all on table_name reorganize
重组表上的所有索引
alter index index_name on table_name reorganize
重组表上的某个索引

总结:
1.重组索引是在线重整Index,不会对Table锁定,重新生成索引会对Table进行锁定;重建索引期间加上>
2.重组索引的100%进度可以通过sys.dm_exec_requests的字段percent_complete来查看

完整代码(根据碎片率选择重组或重建)

--1.查看碎片
SELECT  DB_NAME() 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值