MS SQL SERVER索引优化相关查询
查找缺失索引
-- =============================================
-- Description: 查询当前数据库中缺失的索引,知道你进行优化的参考。
-- =============================================
SELECT
user_seeks * avg_total_user_cost * ( avg_user_impact * 0.01 )
AS
[index_advantage] ,
migs.last_user_seek ,
--上一次访问时间
mid.[statement]
AS
[
Database
.
Schema
.
Table
] ,
--表
mid.equality_columns ,
--等式判断列
mid.inequality_columns ,
--不等式判断列
mid.included_columns ,
--于查询的涵盖列的逗号分隔列表。有关涵盖列或包含列的详细信息
migs.unique_compiles ,
--将从该缺失索引组受益的编译和重新编译数。许多不同查询的编译和重新编译可影响该列值
migs.user_seeks ,
--由可能使用了组中建议索引的用户查询所导致的查找次数
migs.avg_total_user_cost ,
-- 可通过组中的索引减少的用户查询的平均成本
migs.avg_user_impact
--实现此缺失索引组后,用户查询可能获得的平均百分比收益。该值表示如果实现此缺失索引组,则查询成本将按此百分比平均下降。
FROM
sys.dm_db_missing_index_group_stats
AS
migs
WITH
( NOLOCK )
INNER
JOIN
sys.dm_db_missing_index_groups
AS
mig
WITH
( NOLOCK )
ON
migs.group_handle = mig.index_group_handle
INNER
JOIN
sys.dm_db_missing_index_details
AS
mid
WITH
( NOLOCK )
ON
mig.index_handle = mid.index_handle
WHERE
mid.database_id = DB_ID()
--默认当前数据库。如果自己定义的数据库则使用DB_ID ( [ 'database_name' ] )
ORDER
BY
index_advantage
DESC
后续说明:
具有较高的 index_advantage 的索引那些 SQL 服务器认为会产生最大的积极影响,减少工作量,基于查询的成本和预期他们会使用索引的次数减少。
查看现有索引的使用情况
-- =============================================
-- Description: 查询当前数据库中所有堆表、 聚集的索引和非聚集索引、 读取、 写入和每个索引的填充因子的数量,知道你进行优化的参考。
--Index Read/Write stats (all tables in current DB)
-- =============================================
SELECT
OBJECT_NAME(s.[object_id])
AS
[ObjectName] ,
i.
name
AS
[IndexName] , i.index_id ,
user_seeks + user_scans + user_lookups
AS
[Reads] ,
user_updates
AS
[Writes] ,
i.type_desc
AS
[IndexType] ,
i.fill_factor
AS
[FillFactor]
--填充因子
FROM
sys.dm_db_index_usage_stats
AS
s
INNER
JOIN
sys.indexes
AS
i
ON
s.[object_id] = i.[object_id]
WHERE
OBJECTPROPERTY(s.[object_id],
'IsUserTable'
) = 1
AND
i.index_id = s.index_id
AND
s.database_id = DB_ID()
ORDER
BY
OBJECT_NAME(s.[object_id]) ,
writes
DESC
,
reads
DESC
;
这是一个有用的查询,为更好地了解数据库的工作负荷。它可以帮助您确定某个特定的索引的波动性和写入数据的读取的比率。这可以帮助您改进和优化您的索引策略。例如,如果您有一个表,是相当静态 (很少写入任何索引),你可能会更有信心有关添加更多的索引在你失踪的索引查询中列中。
如果您使用的是 SQL Server 2008 企业版,此查询可以帮助您决定是否会启用数据压缩 (页或行) 的好主意。具有很少写活动的索引很可能是更合适数据压缩比波动性更大的索引。
查询未使用的索引
-- =============================================
-- Description: 查询当前数据库中所有未使用的索引,知道你进行优化的参考。本sql的意思是,表的索引在数据库中未被使用,作为你进行下一步删除的依据。其中也可以加入时间判断
--List unused indexes
-- =============================================
SELECT
OBJECT_NAME(i.[object_id])
AS
[
Table
Name
] ,
i.
name
FROM
sys.indexes
AS
i
INNER
JOIN
sys.objects
AS
o
ON
i.[object_id] = o.[object_id]
WHERE
i.index_id
NOT
IN
(
SELECT
s.index_id
FROM
sys.dm_db_index_usage_stats
AS
s
WHERE
s.[object_id] = i.[object_id]
AND
i.index_id = s.index_id
AND
database_id = DB_ID()
--下列条件作为时间判断,查看在某个时间之后未使用的索引列表,如果不需要可删除
AND
(
last_user_seek>=
'@DateTime'
or
--用户上次执行搜索时间
last_user_scan>=
'@DateTime'
or
--用户上次执行扫描时间
last_system_seek>=
'@DateTime'
or
--系统上次执行搜索的时间
last_system_scan>=
'@DateTime'
--系统上次执行扫描的时间
)
)
AND
o.[type] =
'U'
ORDER
BY
OBJECT_NAME(i.[object_id])
ASC
查询当前数据库中使用较少的索引或者写入次数大于读取次数的索引
-- =============================================
-- Description: 查询当前数据库中使用较少的索引或者写入次数大于读取次数的索引,
--此查询会寻找有大量的零的读取和写入的任何索引。任何属于此类别的索引是删除 (在充分调查) 的合适选择,指导你进行优化的参考。
--Possible Bad NC Indexes (writes > reads)
-- =============================================
SELECT
OBJECT_NAME(s.[object_id])
AS
[
Table
Name
] ,
i.
name
AS
[
Index
Name
] ,
--索引名称
i.index_id ,
user_updates
AS
[Total Writes] ,
--写入次数
user_seeks + user_scans + user_lookups
AS
[Total Reads] ,
--读取次数
user_updates - ( user_seeks + user_scans + user_lookups )
AS
[Difference]
--写入与读取只差
FROM
sys.dm_db_index_usage_stats
AS
s
WITH
( NOLOCK )
INNER
JOIN
sys.indexes
AS
i
WITH
( NOLOCK )
ON
s.[object_id] = i.[object_id]
AND
i.index_id = s.index_id
WHERE
OBJECTPROPERTY(s.[object_id],
'IsUserTable'
) = 1
AND
s.database_id = DB_ID()
AND
user_updates > (user_seeks + user_scans + user_lookups )
AND
i.index_id > 1
--聚集索引和非聚集索引
ORDER
BY
[Difference]
DESC
,
[Total Writes]
DESC
,
[Total Reads]
ASC
;
MS SQL SERVER索引优化相关查询的更多相关文章
- sql server Service Broker 相关查询
sql server Service Broker 相关查询 -- 查看传输队列中的消息 --如果尝试从队列中移除时,列将表明哪里出现了问题 select * from sys.transmissio ...
- SQL Server 索引优化-----数据库引擎优化顾问
本文将根据“数据库引擎优化顾问”(DTA)来发现无用或缺失的索引. 要使用“数据库引擎优化顾问”,首先需要对数据库负载进行监控,为数据库负载分析准备数据.从SSMS的工具中,打开SQL Server ...
- 补充:sql server 中的相关查询、case函数
相关查询(在同一个表中) 相关查询类似子查询,但是又不同于子查询:子查询中的子条件可以单独查出数据,但是相关查询的子条件不能查处数据.(可以理解成C#中for的穷举法,第一个for走一个,第二个for ...
- SQL Server 索引优化 ——索引缺失
本文我们将重点给出动态视图法发现数据库中缺失的索引.对于索引的调整和新建将不在本文阐述范围,后续将陆续分享相关经验. sys.dm_db_missing_index_details 缺失索引明细,包括 ...
- SQL Server 索引优化——无用索引
我们知道,合理的索引能大幅提升性能,但冗余的索引也会降低数据库性能.随着我们业务的发展,数据库的中的表.表结构.查询的内容都有可能发生变化.这样,有的索引就可能不再使用了,需要删除(因为维护索引即浪费 ...
- sql server 索引优化
查询实际执行计划,看走的是那种查询 要根据需求,建立合适的索引 经常需要汇总的,可以建立包含索引 --drop index ix_smssend_created on smssent_1 ; crea ...
- sql server 索引碎片相关问题
1.查看表的索引碎片情况 --改成当前库 use DB_Name --创建变量 指定要查看的表 declare @table_id int set @table_id=object_id('Table ...
- sql server 索引分析相关sql
select object_id('dbo.FT_CFP_TRADE_SUBACCOUNT') select * from sys.partitions where [object_id]=14672 ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
随机推荐
- Sql Server 复制表
SELECT INTO 和 INSERT INTO SELECT 两种表复制语句 1.INSERT INTO SELECT语句 语句形式为:Insert into Table2(field1,fiel ...
- UWP深入学习六:Build better apps: Windows 10 by 10 development series
Promotion in the Windows Store In this article, I walk through how to Give your Store listing a mak ...
- Floyd 求最短路(poj 1161)
Floyd-Warshall算法介绍: Floyd-Warshall算法的原理是动态规划. 设为从到的只以集合中的节点为中间节点的最短路径的长度. 若最短路径经过点k,则: 若最短路径不经过点k,则. ...
- JavaScript-创建新数组
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- CSS3中的Transition属性详解(贝赛尔曲线)
transition语法: transition : [<'transition-property'> || <'transition-duration'> || <'t ...
- fgetc和fputc函数
1.输入函数 以下三个函数可用于一次读一个字符. #include <stdio.h> int getc( FILE *fp ); int fgetc( FILE *fp ); int g ...
- c# 后台弹出对话框 和前台弹出新页面
前台: window.showModalDialog("daoru.aspx", "NPOI_daoru_window", "status:false ...
- JBoss 系列四十八:JBoss 7/WildFly 使用TCP构建集群
我知道JBoss 集群Default 的设定就是UDP(JGroups),但在实际环境中的网络环境时常不允许UDP,在这种情况下,我们就需要使用TCP. JBoss 7/WildFly 中负责集群的主 ...
- SymmetricDS 3.5.0 发布,数据同步和复制
SymmetricDS 3.5.0 关闭 53 个问题,新增对 SQLite on Android.Sybase ASE 和 Sybase ASA 的支持:增加了文件同步功能,可同步目录.文件过滤和脚 ...
- .NET Socket TCP 50W在线连接交互测试
在平常的交流中经常有人问.net socket能支持多少在线?和C++或linux下比起来应该差很远吧?其实产生这样问题的主要原因是.net很少人去做这方面的测试,而在linux下则经常听到什么100 ...