SQL SERVER数据库重建索引的方法

 更新时间:2021年09月18日 10:04:32   投稿:mdxy-dxy  
Sql Server查询缓慢的原因有很多,比如服务器资源不足、网络故障、查询语句不够优化,I/O问题等等,以及本文要说的数据库索引问题

一.查询思路

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;


2.列出数据库每个表的数据量,并且需要运维人员对业务足够了解,知道大概哪些表是查询量最多的,可以查看“排在前面的表的磁盘使用情况”:

3.查看表碎片的情况,可以使用命令

DBCC SHOWCONTIG

可以看到该表扫描密度只有33.52%(最佳状态是100%,每个表页都写满数据),远远低于最佳计数,也就是说这个表的利用率很低,本来扫描一页 就能出结果,现在可能需要扫描三页,增加了查询时间;而逻辑碎片和区碎片都很多(一般认为超过30%就需要优化了),也就是说同样一页,数据很少而碎片很 多,占用了过多的数据库资源。
4.根据你对业务的了解,找出查询最多的表,对比他的数据,查询时间,和碎片程度可以判断出该表是否需要整理碎片,重建索引,以提高数据库性能。
重建索引的语句为:

use[数据库名]
ALTER INDEX ALL ON [表名称] REBUILD;

重建后,同样的一张表NWME_Company_Index,再次查询表碎片情况的结果如下:

可以看到密度已经变为96.9%,而逻辑碎片几乎没有了。

5.现在可以看一下整理碎片后,是否真的对查询性能优化了,再次运行第一点列出的命令查看可以发现,大部分查询语句所用的平均时间都下降了接近一半:

现在可以到前台实际体验优化后的效果了。

相关文章

  • SQL Server中JSON函数的用法详解

    SQL Server中JSON函数的用法详解

    本文详细讲解了SQL Server中JSON函数的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • SQLServer2019安装教程图文详解

    SQLServer2019安装教程图文详解

    这篇文章主要介绍了SQLServer2019安装教程图文详解,本文通过图文并茂的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 在sp_executesql中使用like字句的方法

    在sp_executesql中使用like字句的方法

    在sp_executesql中可以执行参数化的sql,但是如果sql中有like,那么一般都要拼字符串,下面的例子把两者结合了起来,既有拼sql的灵活性,又有参数化sql的优点。
    2009-06-06
  • freetds简介、安装、配置及使用介绍

    freetds简介、安装、配置及使用介绍

    简单的说FreeTDS是一个程序库,可以实现在Linux系统下访问微软的SQL数据库! FreeTDS是一个让SYBASE和Microsofte数据库客户端和其数据库服务通信的工具,其能够完成例如DB-Lib,CT-Lib,ODBC,JDBC和Perl DBI的工作。
    2014-08-08
  • SqlServer锁表如何解锁(模拟会话事务方式锁定一个表然后进行解锁)

    SqlServer锁表如何解锁(模拟会话事务方式锁定一个表然后进行解锁)

    SQL提供了强大而完备的锁机制来帮助实现数据库系统的并发性和高性能,本文主要介绍了SqlServer锁表如何解锁,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • SQL Server 2012  开窗函数

    SQL Server 2012 开窗函数

    这篇文章主要介绍了SQL Server 2012 开窗函数功能的实例代码,具体代码如下所示
    2017-01-01
  • SQLSERVER的排序问题结果不是想要的

    SQLSERVER的排序问题结果不是想要的

    同一个查询的结果集为什麽有时候是按他想要的顺序排列,有时候又不是,接下来将为你详细解答,感兴趣的你可以参考下哈,希望对你有所帮助
    2013-03-03
  • SQL Server中的文件和文件组介绍

    SQL Server中的文件和文件组介绍

    这篇文章介绍了SQL Server中的文件和文件组,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • SQLserver2014(ForAlwaysOn)安装图文教程

    SQLserver2014(ForAlwaysOn)安装图文教程

    这篇文章主要介绍了SQLserver2014(ForAlwaysOn)安装图文教程的相关资料,需要的朋友可以参考下
    2016-04-04
  • Spark SQL 中对 Map 类型的操作函数示例详解

    Spark SQL 中对 Map 类型的操作函数示例详解

    这篇文章主要介绍了SparkSQL中对Map类型的操作函数,包括创建、访问、修改、合并、键值操作等功能,通过这些函数,可以方便地进行复杂键值对数据的处理,感兴趣的朋友跟随小编一起看看吧
    2025-01-01

最新评论