首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DMV查找丢失的索引

DMV查找丢失的索引
EN

Stack Overflow用户
提问于 2011-09-14 21:20:21
回答 2查看 4.8K关注 0票数 2

我发现以下SQL旨在帮助识别缺少的索引。我想更好地理解输出。

代码语言:javascript
复制
   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个字段的输出做出反应,这对我来说可能过多了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-14 21:37:17

SQLServers允许您“包含”非键列(请参阅详细信息here)。索引中键列和非键列之间的主要区别在于,与存储在所有级别的键列相比,非键列仅存储在索引的叶级别。

我不建议从字面上遵循你的脚本输出的建议(你的脚本很好,不要误会我的意思),也就是说,你真的不必创建所有建议的索引,并包含它想要从你那里得到的所有列。根据我的经验,SQLServer希望您的所有查询都有一个覆盖索引,这可能会影响更新/插入的性能,并增加数据库大小。

票数 1
EN

Stack Overflow用户

发布于 2011-09-14 21:27:00

非聚集索引既包含已编制索引的列的列表,也包含为快速引用而“包含”的列的列表。

例如,假设您有一个包含100列的表,但是您几乎独占地查询了其中的5列,并根据日期进行了预测。例如:

代码语言:javascript
复制
select col1, col2, col3, col4, YourDate from YourTable where YourDate = '???'

如果只对date列进行索引,则必须执行称为RowID查找(或书签查找)的操作。您将有效地找到所需的行集,但您需要返回到物理表以获取要选择的其他4列(col1-col4)。

如果使用包含的列列表创建索引,则这些列将完全出于该目的而存储在索引中。

代码语言:javascript
复制
create nonclustered index ix_YourTable on YourTable (
     YourDate)
include (
     col1, col2, col3, col4)

现在你不需要返回到表中去获取col1-4,而是直接从索引中读取它们。显然,这增加了该索引所需的存储量。

您还应该知道,如果频繁的查询更改为

代码语言:javascript
复制
select col1, col2, col3, col4, col5, YourDate from YourTable where YourDate = '???'

您仍将使用索引,但为了获得col5的数据,您将执行RID查找。您需要将col5添加到索引的包含列表中,以便有效地引用它。

希望这能有所帮助!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7416972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档