Sql Server 索引使用情况及优化的相关Sql语句分享

我来为您详细讲解一下“Sql Server 索引使用情况及优化的相关Sql语句分享”的攻略。

一、索引使用情况的查看

1.1 查看表索引的使用情况

使用以下命令可以查看表的索引使用情况:

SELECT OBJECT_NAME(s.[object_id]) AS [Object Name], 
       i.name AS [Index Name], 
       s.user_seeks,
       s.user_scans,
       s.user_lookups,
       s.user_updates,
       s.last_user_seek,
       s.last_user_scan,
       s.last_user_lookup,
       s.last_user_update
FROM sys.dm_db_index_usage_stats s
INNER JOIN sys.indexes i 
    ON s.object_id = i.object_id
    AND s.index_id = i.index_id
WHERE OBJECTPROPERTY(s.[object_id],'IsUserTable') = 1
ORDER BY [Object Name], [Index Name];

该脚本可以列出每个表的索引及其使用情况,其中包括 user_seeksuser_scansuser_lookups 三个指标:

  • user_seeks:索引被使用进行精确查找的次数;
  • user_scans:索引被扫描的次数;
  • user_lookups:所有表查询中使用该索引进行查找的次数。

使用此脚本,可以了解哪些索引很少使用或几乎没被使用,进而优化这些索引。

1.2 查看每个索引最近使用的时间

使用以下命令可以查看每个索引在数据库中最近一次被使用的时间:

SELECT OBJECT_NAME(s.object_id) AS [Table Name], 
       i.name AS [Index Name], 
       s.last_user_seek,
       s.last_user_scan,
       s.last_user_lookup
FROM sys.dm_db_index_usage_stats s
INNER JOIN sys.indexes i 
    ON s.object_id = i.object_id
    AND s.index_id = i.index_id
WHERE OBJECTPROPERTY(s.object_id,'IsUserTable') = 1;

该脚本查看了每个表的索引的最近使用情况,包括 last_user_seeklast_user_scanlast_user_lookup 三个指标,这些指标可以告诉我们,每个索引实际上最近一次被查找的时间是什么,这对于我们优化索引至关重要。

二、索引优化的方法

2.1 索引优化的方法

使用以下命令可以查看索引的建议及数据库的实际情况:

SELECT
    OBJECT_NAME(s.object_id) AS [Table Name],
    i.name AS [Index Name],
    i.type_desc AS [Index Type],
    i.is_primary_key AS [Primary Key?],
    i.is_unique AS [Unique?],
    i.fill_factor AS [Fill Factor],
    s.avg_fragmentation_in_percent AS [Avg Fragmentation %],
    s.page_count AS [Page Count]
FROM sys.dm_db_index_physical_stats(DB_ID(),NULL,NULL,NULL,NULL) s
INNER JOIN sys.indexes i ON s.object_id = i.object_id AND s.index_id = i.index_id
ORDER BY [Avg Fragmentation %] DESC OPTION (RECOMPILE);

该脚本可以查询数据库中所有表的索引的平均碎片化度、索引页数等信息,根据这些信息,可以确定哪些索引需要优化,比如:

  • 平均碎片化度过高的索引需要进行重建或重新组织;
  • 页面数量过大的索引可能会影响查询的性能,需要考虑拆分或优化索引等。

2.2 慢查询的优化

使用以下命令可以查询慢查询的情况:

SELECT TOP 20
    total_worker_time/execution_count AS [Avg CPU Time],
    total_elapsed_time/execution_count AS [Avg Duration],
    (SELECT TOP 1 [text]
        FROM sys.dm_exec_sql_text([sql_handle])) AS [Query Text],
    creation_time AS [Cached Time],
    execution_count,
    total_worker_time,
    total_elapsed_time
FROM sys.dm_exec_query_stats 
WHERE total_elapsed_time/execution_count > 300000 -- 只查看执行时间超过5分钟的查询
ORDER BY [Avg Duration] DESC;

该脚本可以查询执行时间超过5分钟的查询,并且按照平均持续时间排序。

使用此脚本,我们可以分析慢查询的执行计划,进而优化查询,例如增加或优化索引等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Sql Server 索引使用情况及优化的相关Sql语句分享 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • Linux 每天自动备份mysql数据库的方法

    Linux每天自动备份MySQL数据库的方法可以通过使用crontab和压缩包命令联合完成。下面是具体步骤: 1.使用crontab定时备份数据库 使用crontab可以指定在特定时间或隔一定时间执行某个命令或脚本。可以将备份脚本作为一个可执行文件,然后在crontab里面设置定时备份的时间。 首先,我们需要进入Linux系统,使用以下命令创建一个备份脚本 …

    database 2023年5月22日
    00
  • SQL 创建表

    下面是SQL创建表的完整攻略。 1. SQL创建表 1.1 语法结构 在使用SQL创建表的时候,需要使用CREATE TABLE语句。语法结构如下: CREATE TABLE table_name ( column1 datatype [ NULL | NOT NULL ], column2 datatype [ NULL | NOT NULL ], ……

    database 2023年3月27日
    00
  • Java源码解析之object类

    Java源码解析之Object类 Object类是Java中非常重要的一个类,它是所有Java类的顶级父类,所有Java类都直接或间接地继承自它。因此,深入了解Object类,可以对于我们更好地理解Java的继承机制和对象模型有所帮助。本篇文章将详细讲解Object类的各个方法及其实现原理。 toString()方法 Object类中最常用的方法之一就是to…

    database 2023年5月21日
    00
  • 在php 扩展中 调用mysql

    call_user_function_ex是php提供的一个c api,具体的参数也没有一个官方的文档。我给你一个例子并稍微说明一下吧。 C/C++ code zval *fname; zval **args[1]; zval *retval; zval *arg1; args[0]=&arg1; int arg_count=1; call_user…

    MySQL 2023年4月13日
    00
  • 高级MySQL数据库面试问题 附答案

    「高级MySQL数据库面试问题 附答案」指的是对MySQL数据库的深入研究和掌握,从而能够在面试中进行更加深层次的沟通,评估候选人的实际技能。以下是我们总结的完整攻略: 1.详细了解数据库的概念 数据库是一个用于存储数据的集合,可以是任何形式的数据结构,比如关系型数据库或者非关系型数据库。候选人需要了解数据库设计、管理和优化,以及各种查询语句的使用和性能分析…

    database 2023年5月22日
    00
  • mysql8.0.30安装配置最详细教程(windows 64位)

    下面是“mysql8.0.30安装配置最详细教程(windows 64位)”的完整攻略: 1. 下载mysql8.0.30安装文件 我们可以从MySQL官网下载对应版本的安装文件,地址为:https://dev.mysql.com/downloads/mysql/8.0.html#downloads 在页面中找到 Windows (x86, 64-bit),…

    database 2023年5月22日
    00
  • MySql获取当前时间并转换成字符串的实现

    下面是MySQL获取当前时间并转换成字符串的实现攻略。 方法一:使用DATE_FORMAT函数 MySQL中可以使用DATE_FORMAT函数将日期时间类型转换成指定格式的字符串。以下是使用DATE_FORMAT函数获取当前时间并转换成字符串的语句: SELECT DATE_FORMAT(NOW(), ‘%Y-%m-%d %H:%i:%s’); 执行此语句,…

    database 2023年5月22日
    00
  • SpringBoot项目如何连接MySQL8.0数据库

    下面是连接MySQL8.0数据库的完整攻略,步骤如下: 步骤一:准备工作 在开始连接MySQL8.0数据库之前,需要先准备好以下工作: 确保你已经安装了Java开发环境和SpringBoot框架; 确保你已经安装了MySQL8.0数据库; 确保你已经在MySQL中创建了需要的数据库和数据表。 步骤二:配置pom.xml文件 在SpringBoot项目中使用M…

    database 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部