我发现以下SQL旨在帮助识别缺少的索引。我想更好地理解输出。
SELECT migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS ExpectedImprovement
, DB_NAME(mid.database_id) AS DBName
, mid.[object_id] AS ObjectID
, mid.statement AS FullyQualifiedObjectName
, ISNULL (mid.equality_columns,'') +
CASE WHEN mid.equality_columns IS NOT NULL AND mid.inequality_columns IS NOT NULL THEN
','
ELSE
''
END +
ISNULL (mid.inequality_columns, '') AS IndexColumns
, ISNULL (mid.included_columns, '') AS IncludeColumns
, migs.user_seeks
, migs.user_scans
, migs.last_user_seek
, migs.last_user_scan
FROM sys.dm_db_missing_index_groups mig
INNER JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
INNER JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 10
ORDER BY migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) DESC返回的列之一是"Include Columns“。
我想知道这是否意味着应该将提到的列名添加到索引中的列列表中,或者是否有其他一些功能可以返回那些可能高访问的列值,而不将它们添加到索引本身。(也许我想象过听到这样一个特性,或者它可能是另一个供应商的数据库)
输出是否只是建议通过"Include Columns“返回值中提到的列来扩展索引中的列列表?我对建议我向索引添加15个字段的输出做出反应,这对我来说可能过多了。
发布于 2011-09-14 21:37:17
SQLServers允许您“包含”非键列(请参阅详细信息here)。索引中键列和非键列之间的主要区别在于,与存储在所有级别的键列相比,非键列仅存储在索引的叶级别。
我不建议从字面上遵循你的脚本输出的建议(你的脚本很好,不要误会我的意思),也就是说,你真的不必创建所有建议的索引,并包含它想要从你那里得到的所有列。根据我的经验,SQLServer希望您的所有查询都有一个覆盖索引,这可能会影响更新/插入的性能,并增加数据库大小。
发布于 2011-09-14 21:27:00
非聚集索引既包含已编制索引的列的列表,也包含为快速引用而“包含”的列的列表。
例如,假设您有一个包含100列的表,但是您几乎独占地查询了其中的5列,并根据日期进行了预测。例如:
select col1, col2, col3, col4, YourDate from YourTable where YourDate = '???'如果只对date列进行索引,则必须执行称为RowID查找(或书签查找)的操作。您将有效地找到所需的行集,但您需要返回到物理表以获取要选择的其他4列(col1-col4)。
如果使用包含的列列表创建索引,则这些列将完全出于该目的而存储在索引中。
create nonclustered index ix_YourTable on YourTable (
YourDate)
include (
col1, col2, col3, col4)现在你不需要返回到表中去获取col1-4,而是直接从索引中读取它们。显然,这增加了该索引所需的存储量。
您还应该知道,如果频繁的查询更改为
select col1, col2, col3, col4, col5, YourDate from YourTable where YourDate = '???'您仍将使用索引,但为了获得col5的数据,您将执行RID查找。您需要将col5添加到索引的包含列表中,以便有效地引用它。
希望这能有所帮助!
https://stackoverflow.com/questions/7416972
复制相似问题