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

yizhihongxing

我来为您详细讲解一下“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日

相关文章

  • redis-ha手动切换slave节点为master

    仅做个人记录,请慎重参考!! 问题描述:使用redis-ha启动了3个pod,现在还有一个pod正常运行,并且为slave(理论上第一个起来的pod应该为master) 通过info命令查看下图     尝试修复 使用 slaveof NO ONE 命令  

    Redis 2023年4月13日
    00
  • AIX系统中删除指定目录、指定后缀、指定天数以前的历史文件

    在AIX系统中,可以使用find命令和rm命令来实现删除指定目录、指定后缀、指定天数以前的历史文件功能。 使用find命令实现删除指定目录、指定后缀、指定天数以前的历史文件 可以使用以下命令来实现: find /path/to/directory -name "*.suffix" -type f -mtime +N -exec rm {}…

    database 2023年5月22日
    00
  • SQL查询效率注意事项小结

    SQL查询效率注意事项小结 在进行SQL查询时,我们都希望能够尽可能地提高查询效率,以便更快地获取需要的数据。以下是一些需要注意的事项,可以帮助提高SQL查询效率: 1. 尽量减少查询中使用的子查询 由于子查询涉及多次查询和计算,因此会对查询速度产生负面影响。如果能够通过表连接或临时表来替换子查询,则可以加快查询速度。 示例1:使用子查询进行查询 SELEC…

    database 2023年5月21日
    00
  • Docker部署安装Redash中文版的方法详解

    下面就来详细讲解部署安装Redash中文版的方法。 环境准备 在开始部署安装Redash中文版之前,需要先准备好以下环境: Docker环境(版本>=17.06.0-ce) Docker Compose工具(版本>=1.18.0) 如果还没有安装Docker和Docker Compose,可以先参考官方文档进行安装。 下载Redash中文版安装包…

    database 2023年5月18日
    00
  • Django数据库迁移报错InconsistentMigrationHistory

    当你在使用Django进行数据库迁移时,有时候会遇到”InconsistentMigrationHistory”错误,这是因为在你的Django项目中数据库记录了先前的迁移记录,但是当前执行的迁移记录的依赖关系与之前记录不一致,解决这个问题的方法有以下几个步骤: 1. 确定数据库状态 首先,在终端中输入以下命令来查看数据库中已经执行的迁移记录: python…

    database 2023年5月18日
    00
  • CentOS安装MySQL5.5的完整步骤

    下面我为您详细讲解 CentOS 安装 MySQL 5.5 的完整步骤,具体如下: 1. 环境准备 在开始安装之前,请确保您的 CentOS 系统已经安装了 wget 和 tar 工具。 如果您的系统中没有安装这些工具,您可以使用以下命令安装: yum install -y wget tar 2. 下载 MySQL 使用以下命令下载 MySQL 5.5: w…

    database 2023年5月21日
    00
  • redis开发使用规范

    1、冷热数据分离,不要将所有数据全部都放在Redis中     根据业务只将高频热数据存储到Redis中【QPS大于5000】,对于低频冷数据可以使用mysql等基于磁盘的存储方式。     不仅节省内存成本,而且数据量小操作时速度更快,效率更高。 2、不同的业务数据要分开存储     不要将不相关的业务数据都放到一个Redis实例中,建议新业务申请新的单独…

    Redis 2023年4月13日
    00
  • mybatis中Oracle参数为NULL错误问题及解决

    问题描述: 在使用MyBatis操作Oracle数据库时,如果Mapper文件中的参数值为NULL,则会出现SQL异常,例如: Error querying database. Cause: java.sql.SQLSyntaxErrorException: ORA-00936: 缺失表达式 The error may exist in com/exampl…

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