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日

相关文章

  • python之PyMongo使用总结

    Python之PyMongo使用总结 介绍 PyMongo 是 Python 程序员使用的最受欢迎的 MongoDB 驱动程序之一。该驱动程序提供了一组工具,使得编写 Python 应用程序与 MongoDB 数据库交互变得容易。PyMongo 可帮助您在 Python 中创建和使用 MongoDB 数据库、集合和文档。 下面是 PyMongo 的一些常用功…

    database 2023年5月22日
    00
  • 用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化

    什么是Django框架中的QuerySet Django框架中的QuerySet是一种延迟执行的查询,它包含了符合查询条件的所有数据库实例。当我们在代码中对QuerySet进行一系列的操作后,Django会在最终需要用到QuerySet的时候才会将查询结果从数据库中调取。 QuerySet和数据库查询的关系 因为QuerySet是一种类似于数组的数据结构,在…

    database 2023年5月19日
    00
  • 分发服务器 系统抛出18483错误,未能连接服务器,因为’distributor_admin’未定义远程登陆

    这个错误是指当应用程序尝试使用 SQL Server 分发服务时,未能连接到分发服务器并且’ distributor_admin ‘远程登录未被定义的情况下发生的错误。这种情况可能是由于以下一种或多种原因造成的: 版本不兼容。应用程序和SQL Server版本可能不匹配,造成无法连接到分发服务器。 权限不足。用户没有足够的权限来连接分发服务器或对分发服务器进…

    database 2023年5月21日
    00
  • 2019 PHP面试题与常用技巧大全

    2019 PHP面试题与常用技巧大全 背景 本文将介绍2019 PHP面试题与常用技巧大全,包括PHP基础知识、算法、框架等方面的内容。通过本文,读者可全面掌握PHP相关知识,并参考面试经验和技巧,提高自己的面试表现。 PHP基础知识 PHP变量作用域 在PHP中,变量的作用域有全局变量和局部变量两种。 全局变量:在函数外定义的变量,可以在函数内部和外部使用…

    database 2023年5月21日
    00
  • Java try catch finally异常处理组合详解

    Java try-catch-finally异常处理组合详解 在Java编程中,异常处理是非常重要的一部分。异常是指程序执行过程中出现的错误情况,也就是程序无法正常运行。这时候我们需要对异常进行处理,以保证程序的正确性和稳定性。Java中提供了try-catch-finally组合来处理异常。 try-catch-finally语法 try-catch-fi…

    database 2023年5月21日
    00
  • Redis Cluster集群动态扩容的实现

    Redis Cluster集群动态扩容的实现攻略 Redis是一种高性能的键值数据库,也是一个开源的、基于内存的数据结构服务,同时还支持多种数据结构。Redis集群能够提供高可用性、扩展性以及容错性。在Redis集群中,增加或减少节点都是需要进行动态调整的,下面就介绍如何实现Redis Cluster的动态扩容。 1. 构建Redis Cluster 首先,…

    database 2023年5月22日
    00
  • Centos7使用yum安装Mysql5.7.19的详细步骤

    下面我将详细讲解“CentOS7使用yum安装MySQL5.7.19”的详细步骤,包含以下几个步骤: 1. 更新yum源 在进行任何软件安装之前,都要先更新系统的yum源,以避免因为使用旧版本的软件源而导致安装失败或是存在安全漏洞的情况。在终端中输入以下命令: sudo yum update 2. 添加MySQL Yum Repository 由于CentO…

    database 2023年5月22日
    00
  • MySQL 事务概念与用法深入详解

    MySQL 事务概念与用法深入详解 什么是MySQL事务? 在MySQL中,事务指的是一系列对数据库进行读写的操作,并被看做处理单元,必须保证这一系列操作全部成功执行,才能对数据库进行修改。 将一系列操作作为单个单元,保证整体操作的完整性和一致性。 MySQL事务通过ACID属性来保证操作的一致性和原子性。 原子性:是指事务中一系列操作要么都执行,要么全部不…

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