索引 - 非聚集索引设计指南-转载

非聚集索引包含索引键值和指向表数据存储位置的行定位器. 有关非聚集索引体系结构的详细信息, 请参阅 非聚集索引结构.

可以对表或索引视图创建多个非聚集索引. 通常, 设计非聚集索引是为改善经常使用的没有建立聚集索引的查询的性能.

与使用书中索引的方式相似, 查询优化器在搜索数据值时, 先搜索非聚集索引以找到数据值在表中的位置, 然后直接从该位置检索数据. 这使非聚集索引成为完全匹配查询的最佳选择, 因为索引包含说明查询所搜索的数据值在表中的精确位置的项. 例如, 为了从 Person.Person 表中查询具有特定姓氏的人员, 查询优化器可能使用非聚集索引 IX_Person_LastName_FirstName_MiddleName;它以 LastName 作为自己的一个键列. 查询优化器能快速找出索引中与指定 LastName 匹配的所有项, 每个索引项都指向表或聚集索引中准确的页和行, 其中可以找到相应的数据. 在查询优化器在索引中找到所有项之后, 它可以直接转到准确的页和行进行数据检索.



数据库注意事项

设计非聚集索引时需要注意数据库的特征.

  • 更新要求较低但包含大量数据的数据库或表可以从许多非聚集索引中获益从而改善查询性能. 与全表非聚集索引相比, 考虑为定义完善的数据子集创建筛选索引可以提高查询性能, 降低索引存储开销并减少索引维护开销.

    决策支持系统应用程序和主要包含只读数据的数据库可以从许多非聚集索引中获益, 查询优化器具有更多可供选择的索引用来确定最快的访问方法, 并且数据库的低更新特征意味着索引维护不会降低性能.

  • 联机事务处理应用程序和包含大量更新表的数据库应避免使用过多的索引. 此外, 索引应该是窄的, 即列越少越好.

    一个表如果建有大量索引会影响 INSERT,UPDATE,DELETE 和 MERGE 语句的性能,因为当表中的数据更改时,所有索引都须进行适当的调整.



查询注意事项

在创建非聚集索引之前, 应先了解访问数据的方式, 考虑对具有以下属性的查询使用非聚集索引:

  • 使用 JOIN 或 GROUP BY 子句.

    应为联接和分组操作中所涉及的列创建多个非聚集索引, 为任何外键列创建一个聚集索引.

  • 不返回大型结果集的查询.

    创建筛选索引以覆盖从大型表中返回定义完善的行子集的查询.

  • 包含经常包含在查询的搜索条件(例如返回完全匹配的 WHERE 子句)中的列.


列注意事项

考虑具有以下一个或多个属性的列:

  • 覆盖查询

    当索引包含查询中的所有列时, 性能可以提升, 查询优化器可以找到索引内的所有列值, 不会访问表或聚集索引数据, 这样就减少了磁盘 I/O 操作. 使用具有包含列的索引来添加覆盖列, 而不是创建宽索引键. 有关详细信息, 请参阅 具有包含列的索引

    如果表有聚集索引, 则该聚集索引中定义的列将自动追加到表上每个非聚集索引的末端, 这可以生成覆盖查询, 而不用在非聚集索引定义中指定聚集索引列. 例如, 如果一个表在 C 列上有聚集索引, 则 B 和 A 列的非聚集索引将具有其自己的键值列 B、A 和 C.

  • 大量非重复值, 如姓氏和名字的组合(前提是聚集索引被用于其他列).

    如果只有很少的非重复值, 例如仅有 1 和 0, 则大多数查询将不使用索引, 因为此时表扫描通常更有效. 对于这种类型的数据, 应考虑对仅出现在少数行中的非重复值创建筛选索引. 例如, 如果大部分值都是 0, 则查询优化器可以对包含 1 的数据行使用筛选查询.



索引选项

在创建非聚集索引时, 可以指定若干索引选项, 要尤其注意以下选项:

  • FILLFACTOR
  • ONLINE

有关详细信息, 请参阅 设置索引选项

时间: 2024-09-29 19:40:59

索引 - 非聚集索引设计指南-转载的相关文章

Mysql 索引实现原理. 聚集索引, 非聚集索引

Mysql索引实现: B-tree,B是balance,一般用于数据库的索引.使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度.而B+tree是B-tree的一个变种,MySQL就普遍使用B+tree实现其索引结构. 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上.这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘

SQL Server索引 - 非聚集索引 <第七篇>

一.非聚集索引维护 非聚集索引的行定位器值保持相同的聚集索引值,即使该聚集索引列物理上重新定位后,也是如此. 为了优化这个维护开销,SQL Server添加一个指向旧数据页的指针,以在页面分割之后指向新的数据页面,而不是更新所有相关非聚集索引的行定位器.这样,虽然降低了非聚集索引的维护开销,但是增加了从非聚集索引行到数据行的导航开销,因为添加了一个旧数据页面和信数据页面之间的连接.因此,将聚集索引作为行定位器降低了非聚集索引相关的开销. 二.定义书签查找 当一个查询请求不是优化器选择的非聚集索引

07.索引-非聚集索引(3)-Key Lookup &RID Lookup

如果存在聚集索引并且查找的列不在 非聚集索引的键列中 而在没有聚集索引的表中 使用RID Lookup 书签查找可能因为开销过大导致一些查询直接进行表扫描 聚集索引所有数据都在索引中(数据页也是索引的一部分),因此可以直接通过聚集索引找到所有的列 定位到索引,也就意味着数据找到了 但是非聚集索引定位到索引后,需要在根据索引记录的RID或者Key 查找数据行,势必会导致一次数据页的I/O 数据行过多,形成的数据页IO也会非常大 当数据过大,IO反而可能超过直接进行页扫描的开销,因此系统会选择进行页

05.索引-非聚集索引(1)-聚集表

建立非聚集索引 CREATE NONCLUSTERED INDEX NCIX_Employee001_Department_Organization ON Employee001(Department,Organization); ALTER INDEX NCIX_Employee001_Department_Organization ON Employee001 REORGANIZE 索引情况 SELECT database_id, index_id, index_type_desc, ind

08.索引-非聚集索引(4)-联合索引、覆盖索引

避免书签查找 可以将查询需要的列加入非聚集索引中 联合索引会导致所有的非聚集索引页中都会冗余一份列的数据,尤其是当这些列不作为条件,只作为返回值时候,是一种浪费 因此可以 选择将查询结果需要的列加入覆盖索引 这时候 覆盖的列 只会存在于叶节点中,定位到索引后,直接从页节点返回数据,避免再根据RID 或者Key 读取数据页,可以减少一次IO

06.索引-非聚集索引(2)-堆表

删除聚集索引 DROP INDEX CIX_Employee001_Id ON Employee001 索引情况 SELECT database_id, index_id, index_type_desc, index_depth, index_level, page_count FROM sys.dm_db_index_physical_stats(DB_ID('IndexDB'),OBJECT_ID('Employee001'),null,null,null) TRUNCATE TABLE

SQL Server 索引和表体系结构(非聚集索引)

原文:SQL Server 索引和表体系结构(非聚集索引) 非聚集索引 概述 对于非聚集索引,涉及的信息要比聚集索引更多一些,由于整个篇幅比较大涉及接下来的要写的“包含列的索引”,“索引碎片”等一些知识点,可能要结合起来阅读理解起来要更容易一些.非聚集索引和聚集索引一样都是B-树结构,但是非聚集索引不改变数据的存储方式,所以一个表允许建多个非聚集索引:非聚集索引的叶层是由索引页而不是由数据页组成,索引行包含索引键值和指向表数据存储位置的行定位器, 既可以使用聚集索引来为表或视图定义非聚集索引,也

数据库中的聚集索引、非聚集索引、优化索引

这篇文章我们来讨论一下索引的问题吧,这篇文章不会介绍怎么创建索引,但是会介绍怎么优化索引. 什么是索引? 索引是对记录按照多个字段进行排序的一种方式.对表中的某个字段建立索引会创建另一种数据结构,其中保存着字段的值,每个值又指向与它相关的记录.这种索引的数据结构是经过排序的,因而可以对其执行二分查找. 怎么理解索引呢?我们经常用在windows系统下,查询某些文件,系统都会建议我们建立文件的索引.比如,如果你要查询一个文件名,系统要扫描所有文件进行傻瓜式地扫描,速度当然会很慢.当我们建立了索引后

聚集索引与非聚集索引的用法举例与使用注意

聚集索引 用法举例 小明需要查找一个人的姓名,知道他在公司的营销部门的1010办公室的4号座位.这个时候如果需要专门为小明建一个聚集索引表就是,以公司部门表内部门名称排序,再以房间总表序号排序,最后以房间详细表的座位表排序,这样就可以最快的找到他要找的人 聚集索引类似于一个字典,我们知道拼音来寻找字,首先我们知道字音节的首字母,从按a-z排序的字典中找到这个字首字母所在的区域,再从这个区域找到韵母所在的区域,当然韵母在字典中也有顺序,最后就可以找到我们想要的字了 注意事项 限制原则 每个表只能有