SqlServer查找缺失索引和查找无效索引

SqlServer查找缺失索引

系统慢,卡,瓶颈在数据库,数据库服务器cpu飙升,但没发现死锁。

发现了一些慢查询,首先想到的加索引。

那么问题来了,怎么加,加哪些?

好在SQLSERVER提供了一些“自动”查找功能,比如 DMV,

附上sql代码:

SELECT
	avg_total_user_cost,
	avg_user_impact,
	migs.group_handle,
	mid.*
FROM
	sys.dm_db_missing_index_group_stats AS migs
INNER JOIN sys.dm_db_missing_index_groups AS mig ON (
	migs.group_handle = mig.index_group_handle
)
INNER JOIN sys.dm_db_missing_index_details AS mid ON (
	mig.index_handle = mid.index_handle
)

SELECT
	avg_total_user_cost,
	avg_user_impact,
	avg_total_user_cost * avg_user_impact * (user_scans + user_seeks) AS PossibleImprovement,
	[statement] AS TableName,
	equality_columns,
	'CREATE INDEX [IDX_' + CONVERT (
		VARCHAR (32),
		GS.group_handle
	) + '_' + CONVERT (VARCHAR(32), D.index_handle) + '_' + REPLACE(
		REPLACE(
			REPLACE([STATEMENT], ']', ''),
			'[',
			''
		),
		'.',
		''
	) + ']' + ' ON ' + [statement] + ' (' + ISNULL(equality_columns, '') + CASE
WHEN equality_columns IS NOT NULL
AND inequality_columns IS NOT NULL THEN
	','
ELSE
	''
END + ISNULL(inequality_columns, '') + ')' + ISNULL(
	' INCLUDE (' + included_columns + ')',
	''
) AS Create_Index_Syntax,
 last_user_seek,
 last_user_scan
FROM
	sys.dm_db_missing_index_groups AS G
INNER JOIN sys.dm_db_missing_index_group_stats AS GS ON G.index_group_handle = GS.group_handle
INNER JOIN sys.dm_db_missing_index_details AS D ON G.index_handle = D.index_handle
ORDER BY
	avg_user_impact DESC 
-- PossibleImprovement desc

 

可能一些无效索引

SELECT
	ind.index_id,
	obj.name AS TableName,
	ind.name AS IndexName,
	ind.type_desc,
	indUsage.user_seeks,
	indUsage.user_scans,
	indUsage.user_lookups,
	indUsage.user_updates,
	indUsage.last_system_seek,
	indUsage.last_user_scan,
	'drop index [' + ind.name + '] ON [' + obj.name + ']' AS DropIndexCommand
FROM
	sys.indexes AS ind
INNER JOIN sys.objects AS obj ON ind.object_id = obj.object_id
LEFT JOIN sys.dm_db_index_usage_stats indUsage ON ind.object_id = indUsage.object_id
AND ind.index_id = indUsage.index_id
WHERE
	ind.type_desc <> 'HEAP'
AND obj.type <> 'S'
AND OBJECTPROPERTY(
	obj.object_id,
	'isusertable'
) = 1
AND (
	ISNULL(indUsage.user_seeks, 0) = 0
	AND ISNULL(indUsage.user_scans, 0) = 0
	AND ISNULL(indUsage.user_lookups, 0) = 0
)
ORDER BY
	obj.name,
	ind.name

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值