sql server索引的问题,关于聚集索引和非聚集索引。谢谢

作者&投稿:廉都 (若有异议请与网页底部的电邮联系)
SQL Server 聚集索引和非聚集索引的区别分析~

SQL SERVER提供了两种索引:聚集索引和非聚集索引。其中聚集索引表示表中存储的数据按照索引的顺序存储,检索效率比非聚集索引高,但对数据更新影响较大。非聚集索引表示数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置,非聚集索引检索效率比聚集索引低,但对数据更新影响较小。
聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。
非聚集索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。对于非聚集索引,可以为在表非聚集索引中查找数据时常用的每个列创建一个非聚集索引。有些书籍包含多个索引。例如,一本介绍园艺的书可能会包含一个植物通俗名称索引,和一个植物学名索引,因为这是读者查找信息的两种最常用的方法。

首先,索引都是按B+树组织非叶子节点的数据。

聚集索引,在叶子节点上,存放索引的值,并且把此索引对应的数据也存放在此。
非聚集索引,在叶子节点上,存放的还是索引的值和关联到聚集索引的标识。

聚集索引: 数据的索引位置就是数据本身,显然一个表只能有一个聚集索引,所以才需要非聚集索引来按更多的字段来索引。
非聚集索引:数据的索引位置是一个指针,这个指针再指向数据本身。

非聚集索引相对于聚集索引有一个小优势,那就是覆盖索引
聚集索引由于特性不可以创建为覆盖索引
所谓覆盖索引,就是在索引键列中包含如非索引键的其他列值
举个例子,如果你用时间段查询订单信息,并且要输出诸如状态,金额等信息
那么聚集索引的操作步骤是,直接定位数据范围,然后根据索引键再检索键对应的数据行信息
这个键查找的效率是不高的,在优化时也有不少人常以去掉此步骤进行优化
而覆盖索引就解决了这个问题,它将不作为索引键的一些列值一同记录到索引键值中,这样当查询到时间段时,时间值中就包含了状态、金额等信息,就没有了键查找步骤

一个表只能有一个聚集索引,而非聚集索引可以有多个,所以对一个表的检索如果有多个过滤的话,就有必要创建非聚焦索引了,另外,如果一个查询对聚集索引使用的是Scan操作,在效率上可能还不如非聚焦索引来得好,这个时候就有必要创建一个更有效的非聚焦索引。


乐昌市13368473231: SQL Server 中关于索引的问题 -
度些盐酸: 要不要建索引,首先要看你的数据量如何,如果数据量不大,就没有必要建立索引了,因为作用不大,还增加了索引的维护工作. 另外所谓根据select语句建立索引,就是对你经常查询的列来建立索引,如果你建立了一个索引,可是在你的select语句中很少用到这个索引,那就没有必要了.具体方法是看你的select语句中的where子句条件是针对哪个字段的,就对这个字段建立索引.

乐昌市13368473231: SQLServer索引有哪些性能问题?
度些盐酸: 在良好的数据库设计基础上,能有效地使用索引是Server取得高性能的基础,SQL Server采用基于代价的优化模型,它对每一个提交的有关表的查询,决定是否使用索引或...

乐昌市13368473231: 关于SQLServer 2000 索引问题 -
度些盐酸: 没法解决!每日写入10万左右,1d=24H=24*60m=24*60*60s=86400s 这才8万多条记录,每秒钟至少写入一条记录,这个已经不是关系库可以承受的了.你该跟领导说明情况,让他知道还有个“实时数据库”,这个才是解决办法.如PI、eDNA等实时库才是能承受.别说sql2000性能不好,就算用oracle11r2也不成.如果非得用关系库,那就考虑分表吧.例如:主键一般都是有含义的,如 年份+序号,字母+序号..按照某一规律进行分表,然后将各分表连接做成一个视图.

乐昌市13368473231: 关于SQL的索引 -
度些盐酸: 索引当然是建在表上,索引是为了提高查询速度提供的一种方式,使用不当会有可能降低速度,索引建好了,当查询条件中where后面使用到的列名上有索引,数据库会

乐昌市13368473231: 关于SQL server 2005的索引问题
度些盐酸: SQLS如何访问没有建立索引的数据表Heap译成汉语叫做“堆”,其本义暗含杂乱无章、无序的意思,前面提到数据值被写进数据页时,由于每一行记录之间并没有特定的排列顺序,所以行与行的顺序就是随机无序的,当然表中的数据页也就...

乐昌市13368473231: 如何查表是否有索引 sqlserver -
度些盐酸: 1、本文以表pi_content为例,相应的字段为([piid] int, [seqnum] int,[phname] nvarchar(50),[content] nvarchar(MAX)),数据量为百万级.2、启动SQLSERVER 2008,并登录.3、启动SQLSERVER PROFILER 工具,我们当前使用这个工具主要...

乐昌市13368473231: 数据库的索引问题 -
度些盐酸: (一) 索引类似字典以及书籍的目录,索引的作用就是加快检索数据的速度,提高效率, 索引分类为: 逻辑上: Single column 单列索引 Concatenated 多列索引 Unique 唯一索引 NonUnique 非唯一索引 Function-based函数索引 Domain 域索...

乐昌市13368473231: sqlserver 索引 -
度些盐酸: 理论知道讲给你听应该你也很难理解,以下我帮你解释一下吧:select * from 表名 这样的查询涉及到索引了么?-----这句话与索引没有关系,但系统会自动按你的索引顺便显示出资料来 如果查询时这个的:select * from 表名 where 字段 = 条件 又和索引有什么关系--------这句话如果索引设字了"字段"的话,那麽查询结果的速度会很快 但如果没有设定字段,而设定了其他的索引,那麽会影响这句话的查询速度 要是出现 select * from 表名 order by 字段 和索引的联系 如果order by 的字段正好有设定了索引,并且和索引的排序一致,那麽这句话速度也会很快 相反就会慢 能理解不?

乐昌市13368473231: sql server 使用 索引 和 不使用 索引 的区别 -
度些盐酸: 在数据查询或数据表连接的时候,有索引的查询会快很多,尤其是数据表的数据数据量大的时候尤其明显.

乐昌市13368473231: 在SQLServer上创建索引的作用是什么?
度些盐酸: 创建索引可以根据查询业务的不同分为两种:单一列的索引,联合索引. 顾名思义,单一列索引就是指在表的某一列上创建索引,联合索引是在多个列上联合创建索引. 希望我的回答可以帮到你.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网