Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 sqlserver索引的优化_Sql Server 2008_Indexing - Fatal编程技术网

Sql server 2008 sqlserver索引的优化

Sql server 2008 sqlserver索引的优化,sql-server-2008,indexing,Sql Server 2008,Indexing,我有一个表,其中有几个与PK无关的索引。不幸的是,有几个索引以相同的排序顺序引用同一列,这存在一些重复性。我通常为我的表创建覆盖索引,这些索引表示非PK相关索引的聚合,因为只要列被索引,它就会在查询期间使用它(如果合适的话)。我的问题很简单:是否以相同的排序顺序在多个索引中为同一列编制索引会浪费资源,或者SQL Server是否知道某一列已经编制了索引,只是为了优化而交叉引用? 更新:未来的一个问题是,如果索引重复且略有变化,是否会改善活动顺序。例如,如果我按A,B DESC,D排序,则具有该顺

我有一个表,其中有几个与PK无关的索引。不幸的是,有几个索引以相同的排序顺序引用同一列,这存在一些重复性。我通常为我的表创建覆盖索引,这些索引表示非PK相关索引的聚合,因为只要列被索引,它就会在查询期间使用它(如果合适的话)。我的问题很简单:是否以相同的排序顺序在多个索引中为同一列编制索引会浪费资源,或者SQL Server是否知道某一列已经编制了索引,只是为了优化而交叉引用?


更新:未来的一个问题是,如果索引重复且略有变化,是否会改善活动顺序。例如,如果我按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将利用索引(如果存在)。