SQL SEVER数据库重建索引的方法 |
一.查询思路 1.想要判断数据库查询缓慢的问题,可以使用如下语句,可以列出查询语句的平均时间,总时间,所用的CPU时间等信息 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_offsetEND - 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_offsetEND - qs.statement_start_offset)/2) + 1) not like%fetch% ORDER BY total_elapsed_time / execution_count DESC;
3.查看表碎片的情况,可以使用命令 DBCC SHOWCONTIG 可以看到该表扫描密度只有33.52%(最佳状态是100%,每个表页都写满数据),远远低于最佳计数,也就是说这个表的利用率很低,本来扫描一页 就能出结果,现在可能需要扫描三页,增加了查询时间;而逻辑碎片和区碎片都很多(一般认为超过30%就需要优化了),也就是说同样一页,数据很少而碎片很 多,占用了过多的数据库资源 。 use[数据库名] 重建后,同样的一张表NWME_Company_Index,再次查询表碎片情况的结果如下: 可以看到密度已经变为96.9%,而逻辑碎片几乎没有了 。 5.现在可以看一下整理碎片后,是否真的对查询性能优化了,再次运行第一点列出的命令查看可以发现,大部分查询语句所用的平均时间都下降了接近一半: 现在可以到前台实际体验优化后的效果了 。 |