查找缺失索引sql
-- =============================================
-- 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
後續說明:chrome
具備較高的 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 企業版,此查詢能夠幫助您決定是否會啓用數據壓縮 (頁或行) 的好主意。具備不多寫活動的索引極可能是更合適數據壓縮比波動性更大的索引。url
查詢未使用的索引 spa
-- =============================================
-- 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
查詢當前數據庫中使用較少的索引或者寫入次數大於讀取次數的索引 3d
-- =============================================
-- 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
;