索引入门

来源:互联网 时间:2018-03-01

在数据库学习中,索引的使用是最重要的一环; 索引是一种查询优化手段,意思就是即使不使用索引,一样能得出正确结果;索引存在的意义就是提升查询性能。在学习索引的概念时,需要我们了解 B树,堆,数据库页,区,填充因子,碎片,文件组等等这些知识。


在SQL SERVER中,存储的单位最小是页(PAGE),页是不可再分的最小存储单位。这意味着,SQL SERVER对于页的读取,要么整个读取,要么完全不读取,没有折中. 数据以堆heap的形式存储,如果要查找一个数据,需要在整个表包含的数据库页中全盘扫描。而磁盘IO扫描往往是数据库检索最耗时的一块,所以在数据量上来后,没有索引的数据表非常耗时。


那么索引是什么 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。索引的存储结构是B树,B树的设计初衷就是为了减少对磁盘的扫描次数。


索引又分为聚集索引和非聚集索引 字面上看它们的不同就在“聚集”两个字上;什么叫聚集呢? 为了提高某个属性(或属性组)的查询速度,把这个或这些属性(称为聚集码)上具有相同值的元组集中存放在连续的物理块称为聚集。 在SQL SERVER中,聚集的作用就是将某一列(或是多列)的物理顺序改变为和逻辑顺序相一致


聚集索引:以B树为存储结构,B树的叶子节点直接存储真实数据。也就是说聚集索引改变了所对应表的物理存储顺序;所以聚集索引一个表最多只能有一个。


因为每个表只能有一个聚集索引,如果我们对一个表的查询不仅仅限于在聚集索引上的字段。我们又对聚集索引列之外还有索引的要求,那么就需要非聚集索引了.


非聚集索引,本质上来说也是聚集索引的一种.非聚集索引并不改变其所在表的物理结构,而是额外生成一个聚集索引的B树结构,但叶子节点是对于其所在表的引用,这个引用分为两种,如果其所在表上没有聚集索引,则引用行号。如果其所在表上已经有了聚集索引,则引用聚集索引的页.


可以看到,非聚集索引需要额外的空间进行存储,按照被索引列进行聚集索引,并在B树的叶子节点包含指向非聚集索引所在表的指针.


创建索引需要的注意事项: (1)通过非聚集索引和聚集索引的原理可以看出,如果其所在表的物理结构改变后,比如加上或是删除聚集索引,那么所有非聚集索引都需要被重建,这个对于性能的损耗是相当大的。 所以最好要先建立聚集索引,再建立对应的非聚集索引.


(2)索引列越少,列类型占字节越少,索引的非叶子节点就越少(索引的中间层级),索引就越快;所以创建索引选择列需要多尝试。


索引的使用


索引的使用并不需要显式使用,建立索引后查询分析器会自动找出最短路径使用索引. 但是有这种情况.当随着数据量的增长,产生了索引碎片后,很多存储的数据进行了不适当的跨页,会造成碎片(关于跨页和碎片以及填充因子的介绍,我会在后续文章中说到)我们需要重新建立索引以加快性能: 比如前面的test_tb2上建立的一个聚集索引和非聚集索引,可以通过DMV语句查询其索引的情况:


SELECT index_type_desc,alloc_unit_type_desc,avg_fragmentation_in_percent,fragment_count,avg_fragment_size_in_pages,page_count,record_count,avg_page_space_used_in_percent FROM sys.dm_db_index_physical_stats(DB_ID('AdventureWorks'),OBJECT_ID('test_tb2'),NULL,NULL,'Sampled')


我们可以通过重建索引来提高速度: ALTER INDEX idx_text_tb2_EmployeeID ON test_tb2 REBUILD还有一种情况是,当随着表数据量的增大,有时候需要更新表上的统计信息,让查询分析器根据这些信息选择路径,使用: UPDATE STATISTICS 表名 那么什么时候知道需要更新这些统计信息呢,就是当执行计划中估计行数和实际表的行数有出入时:


参考:http://www.cnblogs.com/CareySon/archive/2011/12/22/2297568.html

相关阅读:
Top