mssql sqlserver 如何重新数据库索引呢?


下文通过举例的方式讲述使用sql脚本重建数据库索引的方法分享,如下所示:
实验环境:sql server 2008 R2



一、使用sql脚本检索出消耗CPU时间最多的sql脚本,然后查阅此sql脚本所对应的数据表的索引情况

 SELECT creation_time N'脚本编译耗时'
,last_execution_time N'脚本上次执行时间'
,total_physical_reads N'脚本物理读取总次数'
,total_logical_reads/execution_count N'脚本每次逻辑读次数'
,total_logical_reads N'脚本逻辑读取总次数'
,total_logical_writes N'脚本逻辑写入总次数'
, execution_count N'脚本执行总次数'
, total_worker_time/1000 N'脚本所用的CPU总时间ms'
, total_elapsed_time/1000 N'脚本总花费时间ms'
, (total_elapsed_time / execution_count)/1000 N'脚本平均执行耗时ms'
,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) N'脚本语句内容'
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
where SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) not like'%fetch%'
ORDER BY total_elapsed_time / execution_count DESC;


二、获取指定表的索引碎片情况

    DBCC SHOWCONTIG ('数据表名称')


三、重建数据表索引

   use   [databaseName]  
    
     ALTER INDEX ALL ON [数据表名称] REBUILD;
     ----将数据库表下所有索引进行重建


重建数据库索引的工作,一定要放在非高峰期时间,因为数据库索引重建会锁表