我从互联网搜索得到的一些“缺失索引”代码(见下文)列出了一个特定表的许多潜在的缺失索引。从字面上讲,我需要30个索引。在运行代码之前,我已经有了8个。大多数专家认为,一个表的平均值应该是5。我是否可以将这些缺失的大多数索引组合在一起,以使其涵盖索引所需的大多数表?
例如:这两个索引足够相似,似乎可以组合在一起。但他们能做到吗?
CREATE INDEX [NCI_12345] ON [DB].[dbo].[someTable]
([PatSample], [StatusID], [Sub1Sample])
INCLUDE ([PatID], [ProgID], [CQINumber])
CREATE INDEX [NCI_2535_2534] ON [DB].[dbo].[someTable]
([PatSample], [SecRestOnly])
INCLUDE ([CQINumber])如果我将它们组合在一起,它看起来就像这样:
CREATE INDEX [NCI_12345] ON [DB].[dbo].[someTable]
([PatSample], [StatusID], [Sub1Sample], [SecRestOnly])
INCLUDE ([PatID], [ProgID], [CQINumber])注意:我只是采用了第一个语句,并将[SecRestOnly]添加到其中。
问:将这些组合在一起会满足两种索引需求吗?如果没有,那么一个有很多字段的高使用率的表怎么可能只有5个索引呢?
下面是用于获取“缺失索引”的代码:
SELECT
migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) *
(migs.user_seeks + migs.user_scans) AS improvement_measure,
LEFT (PARSENAME(mid.STATEMENT, 1), 32) as TableName,
'CREATE INDEX [NCI_' + CONVERT (VARCHAR, mig.index_group_handle) + '_'
+ CONVERT (VARCHAR, mid.index_handle)
+ '_' + LEFT (PARSENAME(mid.STATEMENT, 1), 32) + ']'
+ ' ON ' + mid.STATEMENT
+ ' (' + 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, '')
+ ')'
+ ISNULL (' INCLUDE (' + mid.included_columns + ')', '') AS create_index_statement,
migs.*, mid.database_id, mid.[object_id]
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;```发布于 2019-10-10 08:23:26
你给的样品不会给你想要的结果。(PatSample,SecRestOnly)上的索引将优化搜索条件,如"PatSample = val1和SecRestOnly = val2“。组合索引不会,因为搜索条件中的两列之间还有其他段。要记住的关键是,当搜索中的列是索引的初始连续段时,多段索引只能用于优化多个“相等”搜索。
鉴于此,可以推断,假设您在(col1,col2)上有一个索引,在(col1,col2,col3)上有另一个索引,则不需要前者。
拥有多少索引是更新性能和搜索性能之间的权衡。更多的索引将减慢插入/更新/删除的速度,但将为查询优化器提供更多的选项来优化搜索。给定您的示例,您的应用程序是否需要频繁地单独搜索"SecRestOnly“,如果是这样,则使用包含"secRestOnly”的索引或作为多段索引的第一段会更好。如果很少在列上执行搜索,那么不使用这样的索引可能是合理的。
https://stackoverflow.com/questions/58312762
复制相似问题