资源描述
索引的设计,用户对数据库最频繁的操作是进行数据查询。一般情况下,数据库在进行查询操作时需要对整个表进行数据搜索。当表中的数据很多时,搜索数据就需要很长的时间,这就造成了服务器的资源浪费。为了提高检索数据的能力,数据库引入了索引机制。索引是数据库中一种特殊数据类型的对象,不单可用来提高表中数据的查询速度,还能够实现某些数据完整性。,索引的意义,索引的基础知识,索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引是依赖于表建立的,它提供了数据库中编排表中数据的内部方法。一个表的存储是由两部分组成的,一部分用来存放表的数据页面,另一部分存放索引页面。索引就存放在索引页面上,通常,索引页面相对于数据页面来说小得多。当进行数据检索时,系统先搜索索引页面,从中找到所需数据的指针,再直接通过指针从数据页面中读取数据。,索引的优点,建立索引的目的有如下几点:(1)保证数据记录的唯一性。(2)可以大大加快数据检索速度。(3)可以加速表与表之间的连接。(4)加快ORDERBY和GROUPBY操作。(5)提高系统性能。,索引的缺点,1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度,4.1.2索引的分类,SQLServer中提供了以下几种索引:(1)聚簇索引(2)非聚簇索引(3)唯一性索引,4.1.3索引的操作,2.使用CREATEINDEX创建索引在Transact-SQL语句中可以用CreateIndex语句在一个已经存在的表上创建索引,语法结构如下:CREATEUNIQUECLUSTERED|NONCLUSTEREDINDEXindex_nameONtable|view(columnASC|DESC,.n)WITH,.nONfilegroup:=PAD_INDEX|FILLFACTOR=fillfactor|IGNORE_DUP_KEY|DROP_EXISTING|STATISTICS_NORECOMPUTE|SORT_IN_TEMPDB,8,索引相关知识,索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引包含由表或视图中的一列或多列生成的键。表或视图可以包含以下类型的索引:聚集聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。索引定义中包含聚集索引列。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。只有当表包含聚集索引时,表中的数据行才按排序顺序存储。如果表具有聚集索引,非聚集索引则该表称为聚集表。如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。非聚集具有独立于数据行的结构。非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。从非聚集索引中的索引行指向数据行的指针称为行定位器。行定位器的结构取决于数据页是存储在堆中还是聚集表中。对于堆,行定位器是指向行的指针。对于聚集表,行定位器是聚集索引键。在SQLServer2005中,可以向非聚集索引的叶级别添加非键列以跳过现有的索引键限制(900字节和16键列),并执行完整范围内的索引查询。,9,创建原则及注意事项下列情况适合建立索引:经常被查询搜索的列,如经常在where子句中出现的列。在ORDERBY子句使用的列。外键或主键列。下列情况不适合建立索引:在查询中很少被引用的列。包含太多重复值的列。数据类型为bit、text、image等的列不能建立索引。,10,创建索引,(1)创建聚集索引PRIMARYKEY和UNIQUE约束在创建PRIMARYKEY约束时,如果不存在该表的聚集索引且未指定唯一聚集索引,则将自动对一列或多列创建唯一聚集索引。createclusteredindexIX_Course_CnoonCourse(Cno)(2)为Course表的Cno列创建非聚集索引CREATEINDEXIX_Course_CnameONCourse(Cname)(3)为SC表的Sno和Cno列创建非聚集组合索引。CREATENONCLUSTEREDINDEXIX_Sc_Sno_CnoONSC(Sno,Cno)(4)为Course表的Cname列创建唯一的非聚集索引。CREATEUNIQUEINDEXUI_Course_CnameONCourse(Cname),11,修改索引(1)禁用索引ALTERINDEXIX_Course_CnoonCourseDISABLE(2)重新生成索引ALTERINDEXIX_Course_CnoonCourseREBUILDALTERINDEXALLONcourseREBUILD删除索引当一个索引不再需要时,可以将其从数据库中删除,以回收它当前使用的磁盘空间。这样数据库中的任何对象都可以使用此回收的空间。dropindexIX_Course_Cnameoncourse使用DROP_EXISTING删除和重新创建索引CREATENONCLUSTEREDINDEXIX_Course_CnameONCourse(Cname)WITHDROP_EXISTING,
展开阅读全文