gpt4 book ai didi

sql-server-2008 - SQL Server 索引的优化

转载 作者:行者123 更新时间:2023-12-04 07:14:22 26 4
gpt4 key购买 nike

我有一个包含几个非 PK 相关索引的表。不幸的是,存在一些重复性,即多个索引以相同的排序顺序引用同一列。我通常会为我的表创建代表非 PK 相关索引聚合的覆盖索引,因为只要该列被索引,它就会在查询期间适本地使用它。我的问题很简单:是否以相同的排序顺序在多个索引中索引同一列会浪费资源,还是 SQL Server 知道某个列已被索引并且只是为了优化目的而交叉引用?

更新: future 的一点是询问具有轻微变化的重复索引是否会改善 ORDER BY 事件。例如,如果我按 A、B DESC、D 排序,那么具有该顺序的特殊索引实际上会比包含具有相同排序顺序的这些列的单个覆盖索引提高性能。我的印象是 ORDER BY 只会依赖索引,并且出于性能原因不需要存在特殊索引。

最佳答案

每个索引都是独立的——没有交叉引用等等。所以是的,如果这些索引是重复的,你最终可能会浪费一些时间。但是:在多个索引中包含单个列是完全有意义的 - 诸如复合索引(几个字段)之类的东西可能并排存在。

2005 年的 SQL Server 有一个非常好的功能,称为 DMV(动态管理 View ),它允许您检查

  • 根本没有使用索引
  • 缺少可能会加快查询加载速度的索引

查找缺失的索引:

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

关于sql-server-2008 - SQL Server 索引的优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2284795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com