当前位置:首页 » 编程语言 » sql聚集索引

sql聚集索引

发布时间: 2022-01-10 07:43:24

sql数据库中仅是否为聚集索引对查询速度有影响吗

不一样,首先聚集索引在一张表上只能建立一个;其次聚集索引中的聚集是指的这张表中的数据在磁盘上的物理排序方式是以聚集索引排序;一个简单的例子如下:

学号身份证号前4位学号为聚集索引身份证号为聚集索引
003710423
00110811
009510132

在查询中,主要是看你要以谁为where条件的前缀来进行查询,比如你用身份证来做为聚集索引但是却用学号范围来进行查找,那这个索引就是无效的,你只会得到聚集索引扫描,而聚集索引扫描=堆表扫描;这是针对于聚集索引的情况。

非聚集的话,主要是看索引列的筛选性是否足够高,并且where条件首句是否使用了这个列,如果没有使用,就有可能用不到非聚集索引,这个是根据查询优化器自己判断的查询成本来决定的。

② sql server 创建聚集索引

是的,默认是聚集的。

③ SQL聚集索引和非聚集索引的区别

数据库的索引,听起来挺神秘的,仔细想想。这些索引,其实就是平时咱们查东西时候常用的两种手段。无非就是为了提高我们找东西的效率而已。那么我们平时又是怎么查东西呢?

聚集索引:

聚集索引,来源于生活尝试。这中索引可以说是按照数据的物理存储进行划分的。对于一堆记录来说,使用聚集索引就是对这堆记录 进行 堆划分。即主要描述的是物理上的存储。

举个例子:

比如图书馆新进了一批书。那么这些书需要放到图书馆内。书如何放呢?一般都有一个规则,杂志类的放到101房间,文学类的放到102房间,理工类的放到103房间等等。这些存储的规则决定了每本书应该放到哪里。而这个例子中聚集索引为书的类别。
正式因为这种存储规则,才导致 聚集索引的唯一性。

误区:

有的人认为,聚集索引的字段是唯一的。这是因为sql server 中添加主键的时候,自动给主键所在的字段生成一个聚集索引。所以人们会认为聚集索引所加的字段是唯一的。
思考一下上面这个问题。杂志类的书放到101房间。那么如果杂志类的书太多,一个101房间存放不下。那么可能101,201两个房间来存放杂志类的书籍。如果这样分析的话,那么一个杂志类对应多个房间。放到表存储的话,那么这个类别字段 就不是唯一的了。

非聚集索引:

非聚集索引,也可以从生活中找到映射。非聚集索引强调的是逻辑分类。可以说是定义了一套存储规则,而需要有一块控件来维护这个规则,这个被称之为索引表。

继续使用上述提到的例子:

同学如果想去图书馆找一本书,而不知道这本书在哪里?那么这个同学首先应该找的就是 检索室吧。对于要查找一本书来说,在检索室查是一个非常快捷的的途径了吧。但是,在检索室中你查到了该书在XX室XX书架的信息。你的查询结束了吗?没有吧。你仅仅找到了目的书的位置信息,你还要去该位置去取书。

对于这种方式来说,你需要两个步骤:
1、查询该记录所在的位置。
2、通过该位置去取要找的记录。

区别:

聚集索引:可以帮助把很大的范围,迅速减小范围。但是查找该记录,就要从这个小范围中Scan了。
非聚集索引:把一个很大的范围,转换成一个小的地图。你需要在这个小地图中找你要寻找的信息的位置。然后通过这个位置,再去找你所需要的记录。
索引与主键的区别

主键:主键是唯一的,用于快速定位一条记录。
聚集索引:聚集索引也是唯一的。(因为聚集索引的划分依据是物理存储)。而聚集索引的主要是为了快速的缩小查找范围,即记录数目未定。
主键和索引没有关系。他们的用途相近。如果聚集索引加上唯一性约束之后,他们的作用就一样了。
使用场景

基于上述的两种规则,那么在什么时候适合聚集索引,什么时候适合非聚集索引?

④ sqlserver中聚集索引的作用是什么

聚集索引和非聚集索引的区别:
汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字;同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”。也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录来找到您需要找的内容。正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”。
如果您认识某个字,您可以快速地从自动中查到这个字。但您也可能会遇到您不认识的字,不知道它的发音,这时候,您就不能按照刚才的方法找到您要查的字,而需要去根据“偏旁部首”查到您要找的字,然后根据这个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是真正的正文的排序方法,比如您查“张”字,我们可以看到在查部首之后的检字表中“张”的页码是672页,检字表中“张”的上面是“驰”字,但页码却是63页,“张”的下面是“弩”字,页面是390页。很显然,这些字并不是真正的分别位于“张”字的上下方,现在您看到的连续的“驰、张、弩”三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。我们可以通过这种方式来找到您所需要的字,但它需要两个过程,先找到目录中的结果,然后再翻到您所需要的页码。

我们把这种目录纯粹是目录,正文纯粹是正文的排序方式称为“非聚集索引”。

⑤ SQL Server 聚集索引和非聚集索引的区别分

聚集索引和非聚集索引的根本区别:
1、表记录的排列顺序和与索引的排列顺序是否一致。
2、聚集索引一个表只有一个,非聚集索引一个表可以存在多个。
3、聚集索引存储记录是物理上连续存在,非聚集索引是逻辑上的连续。
聚集索引优点:
1、以最快的速度缩小查询范围。
2、以最快的速度进行字段排序。
聚集索引使用场合:
1、此列包含有限数目的不同值。
2、查询的结果返回一个区间的值。
3、查询的结果返回某值相同的大量结果集。
非聚集索引优点:
1、非聚集索引比聚集索引层次多。
3、添加记录不会引起数据顺序的重组。
非聚集索引使用场合:
1、此列包含了大量数目不同的值。
2、查询的结束返回的是少量的结果集。

⑥ 如何用sql语句在列上建立聚集索引

可以用如下语句
create clustered index 索引名 on 表名(字段名)

⑦ SQL 中的聚集索引和非聚集索引 分别指的是什么

聚集索引:其中行的物理排序与索引排序相同,并且聚集索引的最低一级(叶级)包含实际的数据行。一个表或视图只允许同时有一个聚集索引。 在创建任何非聚集索引之前创建聚集索引。创建聚集索引时重建表上现有的非聚集索引。 如果没有指定 CLUSTERED,则创建非聚集索引。 1、聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,聚集索引表记录的排列顺序与索引的排列顺序一致,优点是查询速度快,因为一旦具有第一个索引值的纪录被找到,具有连续索引值的记录也一定物理的紧跟其后。聚集索引的缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度。建议使用聚集索引的场合为: a.此列包含有限数目的不同值; b.查询的结果返回一个区间的值; c.查询的结果返回某值相同的大量结果集。 非聚集索引指定了表中记录的逻辑顺序,但记录的物理顺序和索引的顺序不一致,聚集索引和非聚集索引都采用了B+树的结构,但非聚集索引的叶子层并不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针的方式。非聚集索引比聚集索引层次多,添加记录不会引起数据顺序的重组。建议使用非聚集索引的场合为: a.此列包含了大量数目不同的值; b.查询的结束返回的是少量的结果集; c.order by 子句中使用了该列。 2、聚集索引:其中行的物理排序与索引排序相同,并且聚集索引的最低一级(叶级)包含实际的数据行。一个表或视图只允许同时有一个聚集索引。 在创建任何非聚集索引之前创建聚集索引。创建聚集索引时重建表上现有的非聚集索引。 如果没有指定 CLUSTERED,则创建非聚集索引。 3、--不用索引查询 SELECT * FROM IndexTestTable WHIT(INDEX(0)) WHERE Status= 'B ' --创建聚集索引

⑧ SQL中一个表可以有几个聚集索引或非聚集索引

一个表只能有一个聚集索引,可以有多个非聚集索引

下面是聚集索引和非聚集索引的详细介绍:
聚集索引基于数据行的键值在表内排序和存储这些数据行。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。有关聚集索引体系结构的详细信息,请参阅聚集索引结构。

每个表几乎都对列定义聚集索引来实现下列功能:

可用于经常使用的查询。

提供高度唯一性。

注意:

创建 PRIMARY KEY 约束时,将在列上自动创建唯一索引。默认情况下,此索引是聚集索引,但是在创建约束时,可以指定创建非聚集索引。

可用于范围查询。

如果未使用 UNIQUE 属性创建聚集索引,数据库引擎将向表自动添加一个 4 字节的 uniqueifier
列。必要时,数据库引擎将向行自动添加一个 uniqueifier 值以使每个键唯一。此列和列值供内部使用,用户不能查看或访问

查询注意事项

在创建聚集索引之前,应先了解数据是如何被访问的。考虑对具有以下特点的查询使用聚集索引:

使用运算符(如 BETWEEN、>、>=、< 和
<=)返回一系列值。

使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行物理相邻。例如,如果某个查询在一系列销售订单号间检索记录,SalesOrderNumber
列的聚集索引可快速定位包含起始销售订单号的行,然后检索表中所有连续的行,直到检索到最后的销售订单号。

返回大型结果集。

使用 JOIN 子句;一般情况下,使用该子句的是外键列。

使用 ORDER BY 或 GROUP BY 子句。

在 ORDER BY 或 GROUP BY
子句中指定的列的索引,可以使数据库引擎不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。

列注意事项

一般情况下,定义聚集索引键时使用的列越少越好。考虑具有下列一个或多个属性的列:

唯一或包含许多不重复的值

例如,雇员 ID 唯一地标识雇员。EmployeeID 列的聚集索引或 PRIMARY KEY
约束将改善基于雇员 ID 号搜索雇员信息的查询的性能。另外,可对
LastName、FirstName、MiddleName
列创建聚集索引,因为经常以这种方式分组和查询雇员记录,而且这些列的组合还可提供高区分度。

按顺序被访问

例如,产品 ID 唯一地标识 AdventureWorks2008R2 数据库的
Proction.Proct 表中的产品。在其中指定顺序搜索的查询(如 WHERE ProctID BETWEEN 980
and 999)将从 ProctID 的聚集索引受益。这是因为行将按该键列的排序顺序存储。

由于保证了列在表中是唯一的,所以定义为 IDENTITY。

经常用于对表中检索到的数据进行排序。

按该列对表进行聚集(即物理排序)是一个好方法,它可以在每次查询该列时节省排序操作的成本。

聚集索引不适用于具有下列属性的列:

频繁更改的列

这将导致整行移动,因为数据库引擎必须按物理顺序保留行中的数据值。这一点要特别注意,因为在大容量事务处理系统中数据通常是可变的。

宽键

宽键是若干列或若干大型列的组合。所有非聚集索引将聚集索引中的键值用作查找键。为同一表定义的任何非聚集索引都将增大许多,这是因为非聚集索引项包含聚集键,同时也包含为此非聚集索引定义的键列。

索引选项

创建聚集索引时,可指定若干索引选项。因为聚集索引通常都很大,所以应特别注意下列选项:

SORT_IN_TEMPDB

DROP_EXISTING

FILLFACTOR

ONLINE

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

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

与使用书中索引的方式相似,查询优化器在搜索数据值时,先搜索非聚集索引以找到数据值在表中的位置,然后直接从该位置检索数据。这使非聚集索引成为完全匹配查询的最佳选择,因为索引包含说明查询所搜索的数据值在表中的精确位置的项。例如,为了从
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

⑨ sql 什么时候用聚集索引和非聚集索引

1 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物理顺序。
聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。
2 聚集索引使用注意事项

定义聚集索引键时使用的列越少越好。
• 包含大量非重复值的列。
.• 使用下列运算符返回一个范围值的查询:BETWEEN、>、>=、< 和 <=。
• 被连续访问的列。
• 回大型结果集的查询。
• 经常被使用联接或 GROUP BY 子句的查询访问的列;一般来说,这些是外键列。对 ORDER BY 或
GROUP BY 子句中指定的列进行索引,可以使 SQL Server 不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。
• OLTP 类型的应用程序,这些程序要求进行非常快速的单行查找(一般通过主键)。应在主键上创建聚集索引。
3 聚集索引不适用于:

• 频繁更改的列 。这将导致整行移动(因为 SQL Server
必须按物理顺序保留行中的数据值)。这一点要特别注意,因为在大数据量事务处理系统中数据是易失的。
• 宽键 。来自聚集索引的键值由所有非聚集索引作为查找键使用,因此存储在每个非聚集索引的叶条目内。
4 非聚集索引:数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。

非聚集索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。对于非聚集索引,可以为在表非聚集索引中查找数据时常
用的每个列创建一个非聚集索引。有些书籍包含多个索引。例如,一本介绍园艺的书可能会包含一个植物通俗名称索引,和一个植物学名索引

⑩ SQL:怎么把非聚集索引变成聚集索引

一个表只能有一个聚集索引,所以如果你已经有了一个,就不能在建一个。
如果只有一个,那你可以通过alert table来修改,把nonclustered改为clustered就可以。

热点内容
搭建本地表格服务器 发布:2024-12-25 14:51:06 浏览:851
网络应用中ftp指什么 发布:2024-12-25 14:45:36 浏览:453
广工如何修改密码 发布:2024-12-25 14:29:18 浏览:487
电脑配置不高怎么玩守望先锋 发布:2024-12-25 14:15:42 浏览:262
合法服务器地址 发布:2024-12-25 14:15:32 浏览:425
linuxip脚本 发布:2024-12-25 14:04:00 浏览:417
c语言最短路径 发布:2024-12-25 14:03:52 浏览:623
c语言考点 发布:2024-12-25 14:03:13 浏览:614
想换个安卓手机什么机子好 发布:2024-12-25 14:01:38 浏览:847
python不是内部或外部 发布:2024-12-25 13:36:14 浏览:639