日期:2014-05-16  浏览次数:20682 次

索引分析

簇集索引=聚集索引:??

在聚集索引下,
1 :聚集索引 (clustered index), 一种通过键值的逻辑顺序来确定表中相应行的物理顺序的索引。数据在物理上按顺序排在数据页上

2 :重复值也排列在一起,因而在范围查找时,可以先找到这个范围的起末点,且只在这个范围内扫描数据页,避免了大范围扫描,提高了查询速度。

3 :对于 聚集索引 ,将新行实际插入具有相似键值的现有行附近。这可改善查询性能,因为它导致数据页的存取模式更线性化,且产生更有效的预取。

4 :有大量重复值、且经常有范围查询 between, >,< ,>=,< =)和order by、group by发生的列,可考虑建立群集索引

5 :index的逻辑顺序与表中数据的物理顺序基本一致。这样的好处是,按照index来取数据时,磁头不会乱跑,从而提高了性能。
一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。??


6 :两大优势:1、以最快的速度缩小查询范围。 2、以最快的速度进行字段排序。

7 :一定要将聚集索引建立在: 1、您最频繁使用的、用以缩小查询范围的字段上;
2、您最频繁使用的、需要排序的字段上。?


? 聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。??
???
聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。例如,如果应用程序执行的一个查询经常检索某一日期范围内的记录,则使用聚集索引可以迅速找到包含开始日期的行,然后检索表中所有相邻的行,直到到达结束日期。这样有助于提高此类查询的性能。同样,如果对从表中检索的数据进行排序时经常要用到某一列,则可以将该表在该列上聚集(物理排序),避免每次查询该列时都进行排序,从而节省成本。??
???
? 非簇集索引:??
? 非聚集索引与聚集索引一样有?? B?? 树结构,但是有两个重大差别:????
???
? 数据行不按非聚集索引键的顺序排序和存储。??
???
???
? 非聚集索引的叶层不包含数据页。????
? 相反,叶节点包含索引行。每个索引行包含非聚集键值以及一个或多个行定位器,这些行定位器指向有该键值的数据行(如果索引不唯一,则可能是多行)。??
???
? 非聚集索引可以在有聚集索引的表、堆集或索引视图上定义。在?? Microsoft&reg;?? SQL Server&#8482;?? 2000?? 中,非聚集索引中的行定位器有两种形式:????
???
? 如果表是堆集(没有聚集索引),行定位器就是指向行的指针。该指针用文件标识符?? (ID)、页码和页上的行数生成。整个指针称为行?? ID。??
???
???
? 如果表没有聚集索引,或者索引在索引视图上,则行定位器就是行的聚集索引键。如果聚集索引不是唯一的索引,SQL?? Server?? 2000?? 将添加在内部生成的值以使重复的键唯一。用户看不到这个值,它用于使非聚集索引内的键唯一。SQL?? Server?? 通过使用聚集索引键搜索聚集索引来检索数据行,而聚集索引键存储在非聚集索引的叶行内。????
? 由于非聚集索引将聚集索引键作为其行指针存储,因此使聚集索引键尽可能小很重要。如果表还有非聚集索引,请不要选择大的列作为聚集索引的键。??
???
???
? 唯一索引:??
? 唯一索引可以确保索引列不包含重复的值。在多列唯一索引的情况下,该索引可以确保索引列中每个值组合都是唯一的。??
? 唯一索引既是索引也是约束。??
???
? 复合索引:??
? 索引项是多个的就叫组合索引,也叫复合索引。??
? 复合索引使用时需要注意索引项的次序。



创建简单索引??
? CREATE?? INDEX?? au_id_ind??
??????? ON?? authors?? (au_id)??
???
???
? 创建唯一聚集索引??
? CREATE?? UNIQUE?? CLUSTERED?? INDEX?? employeeID_ind??
??????? ON?? emp_pay?? (employeeID???
???创建唯一非聚集索引
CREATE [ UNIQUE ]? NONCLUSTERED INDEX index_name
? ON?table/view ( column? )???

?


? 创建组合索引??
? CREATE?? INDEX?? emp_order_ind??
??????? ON?? order_emp?? (orderID,?? employeeID)

限制索引:

?? 限制索引一般是没有经验的人常犯的错误之一,在SQL中有很多的陷阱都会史索引无法使用:

?1:使用不等号(<>,!=);
?2:?使用isnull,is not null;

?3:使用函数;

?4:比较不同的数据类型:

比如表中的字段的数据类型是account_number varchar2而且这个字段建立了索引,查询语句为:

select * from banks where account_number=990354,这样就会知晓全表扫描,oracle会

自动的把where子句变成to_number(account_number)=990354这样就限制了索引,所以要

使用select * from banks where account_number='990354';


? 注意事项??
? 在创建非聚集索引之前,应先了解您的数据是如何被访问的。可考虑将非聚集索引用于:????
???
? 包含大量非重复值的列,如姓氏和名字的组合(如果聚集索引用于其它列)。如果只有很少的非重复

值,如只有?? 1?? 和?? 0,则大多数查询将不使用索引,因为此时表扫描通常更有效。??
???
???
? 不返回大型结果集的查询。??
???
???
? 返回精确匹配的查询的搜索条件(WHERE?? 子句)中经常使用的列。??
???
???
? 经常需要联接和分组的决策支持系统应用程序。应在联接和分组操作中使用的列上创建多个非聚集索

引,在任何外键列上创建一个聚集索引。??
???
???
? 在特定的查询中覆盖一个表中的所有列。这将完全消除对表或聚集索引的访问。



注意事项??
? 定义聚集索引键时使用的列越少越好,这一点很重要。如果定义了一个大型的聚集索引键,则同一个表上定义的任何非聚集索引都将增大许多,因为非聚集索引条目包含聚集键。当把?? SQL?? 脚本保存到可用空间不足的磁盘上时,索引优化向导不返回错误。有关?? Microsoft&reg;?? SQL?? Server&#8482; 2000?? 中如何实现非聚集索引的更多信息,请参见非聚集索引。????
???
? 在分析过程中,索引优化向导会消耗相当多的?? CPU?? 及内存资源。最好在生产服务器的测试版上执行优化,而不要在生产服务器上执行。此外,最好在另一台计算机上而非运行?? SQL?? Server?? 的计算机上运行该向导。该向导不能用于