Sql server 2008 sqlserver索引的优化
我有一个表,其中有几个与PK无关的索引。不幸的是,有几个索引以相同的排序顺序引用同一列,这存在一些重复性。我通常为我的表创建覆盖索引,这些索引表示非PK相关索引的聚合,因为只要列被索引,它就会在查询期间使用它(如果合适的话)。我的问题很简单:是否以相同的排序顺序在多个索引中为同一列编制索引会浪费资源,或者SQL Server是否知道某一列已经编制了索引,只是为了优化而交叉引用?Sql server 2008 sqlserver索引的优化,sql-server-2008,indexing,Sql Server 2008,Indexing,我有一个表,其中有几个与PK无关的索引。不幸的是,有几个索引以相同的排序顺序引用同一列,这存在一些重复性。我通常为我的表创建覆盖索引,这些索引表示非PK相关索引的聚合,因为只要列被索引,它就会在查询期间使用它(如果合适的话)。我的问题很简单:是否以相同的排序顺序在多个索引中为同一列编制索引会浪费资源,或者SQL Server是否知道某一列已经编制了索引,只是为了优化而交叉引用? 更新:未来的一个问题是,如果索引重复且略有变化,是否会改善活动顺序。例如,如果我按A,B DESC,D排序,则具有该顺
更新:未来的一个问题是,如果索引重复且略有变化,是否会改善活动顺序。例如,如果我按A,B DESC,D排序,则具有该顺序的特殊索引实际上会比包含具有相同排序顺序的这些列的单个覆盖索引提高性能。我的印象是ORDER BY只依赖于索引,不需要出于性能原因而显示特殊索引。它将占用两次空间,但更重要的是,它会在更新所有索引时减慢插入速度。每次索引中包含一列,使用空间-即使您有其他类似的索引。每个索引都是独立的-没有交叉引用等等。是的,如果这些索引是重复的,你可能会浪费一些时间。但是:在多个索引中包含一个列是完全有意义的——像复合索引(几个字段)之类的东西并排出现也是有意义的 2005年的SQLServer有一个非常好的特性,叫做DMV(动态管理视图),它允许您检查
- 根本没有使用索引
- 缺少可能加快查询加载速度的索引
SELECT
object_name(object_id), d.*, s.*
FROM
sys.dm_db_missing_index_details d
INNER JOIN
sys.dm_db_missing_index_groups g ON d.index_handle = g.index_handle
INNER JOIN
sys.dm_db_missing_index_group_stats s ON g.index_group_handle = s.group_handle
WHERE
database_id = db_id()
ORDER BY
object_id
查找未使用的索引:
DECLARE @dbid INT
SELECT @dbid = DB_ID(DB_NAME())
SELECT
OBJECTNAME = OBJECT_NAME(I.OBJECT_ID),
INDEXNAME = I.NAME,
I.INDEX_ID
FROM
SYS.INDEXES I
JOIN
SYS.OBJECTS O ON I.OBJECT_ID = O.OBJECT_ID
WHERE
OBJECTPROPERTY(O.OBJECT_ID, 'IsUserTable') = 1
AND I.INDEX_ID NOT IN (SELECT S.INDEX_ID
FROM SYS.DM_DB_INDEX_USAGE_STATS S
WHERE S.OBJECT_ID = I.OBJECT_ID
AND I.INDEX_ID = S.INDEX_ID
AND DATABASE_ID = @dbid)
ORDER BY
OBJECTNAME, I.INDEX_ID, INDEXNAME ASC
我不清楚你在问什么 考虑一个包含a、B、C和D列的表上的索引。在(a、B)和(B、a)上有一个索引,所有索引都按升序排序。在这种情况下,是的,这将构建两个索引,但是额外的索引不会被浪费,因为当索引中前面的所有列都有重复行时,索引中的额外列仅从搜索角度提供帮助
另一方面,(A,B)上带有附加“覆盖”列C的索引和另一个带有附加“覆盖”列D的索引(A,B)将浪费空间。您应该只使用(A,B)+C,D.要使用的索引数量是性能选择与插入/更新/删除之间的选择。磁盘空间不那么重要
我多次遇到表t(A,B,C)的索引,如“A”,“A,B”,“A,B,C”。当然没用了。有些工具喜欢生成这样的索引。另外,为所有可能的查询创建键也不是一个好主意 那么,我的覆盖索引方法是一种更为优化的方案吗?请注意:使用具有特定顺序的复合索引确实可以提高围绕该顺序构建的查询的性能。创建覆盖索引将简化使用索引扫描与索引查找的折衷。。。速度快得多。ORDER BY将利用索引(如果存在)。