sqlserver更改聚集索引,修改聚集索引

关于SQLSERVER的索引

这要看你的数据如何规划,访问时主要以什么方式。

创新互联公司是一家朝气蓬勃的网站建设公司。公司专注于为企业提供信息化建设解决方案。从事网站开发,网站制作,网站设计,网站模板,微信公众号开发,软件开发,微信平台小程序开发,10余年建站对成都公路钻孔机等多个行业,拥有多年建站经验。

如果主要是以varchar列进行查询,就按varchar列建立聚集索引,按int列建立非聚集索引。

如果主要是按int列进行排序查询,就按int列建立聚集索引,按varchar列建立非聚集索引。

(注意上面说的int列不是主键,是你用来排序的列。)

配置数据库索引是门很高深的学问,有兴趣的话可以多搜索下相关资料。我都只是一知半解呢:)

sql索引分为几类?

不同数据库中提供了不同的索引类型,SQLServer中的索引有两种:聚集索引(CLUSTERED)和非聚集索引(NONCLUSTERED)。

索引区别:

聚集索引:

聚集索引基于数据行的键值,在表内排序和存储这些数据行。每个表只能有一个聚集索引,应为数据行本分只能按一个顺序存储。

在聚集索引中,表中各行的物理顺序与索引键值的逻辑(索引)顺序相同。聚集索引通常可加快UPDATE和DELETE操作的速度,因为这两个操作需要读取大量的数据。创建或修改聚集索引可能要花很长时间,因为执行这两个操作时要在磁盘上对表的行进行重组。

非聚集索引:

因为一个表中只能有一个聚集索引,如果需要在表中建立多个索引,则可以创建为非聚集索引。表中的数据并不按照非聚集索引列的顺序存储,但非聚集索引的索引行中保存了非聚集键值和行定位器,可以快捷地根据非聚集键的值来定位记录的存储位置。

延伸阅读:

无论是聚集索引,还是非聚集索引,都可以是唯一索引(UNIQUE)

。在SQL Server中,当唯一性是数据本身的特点时,可创建唯一索引,但索引列的组合不同于表的主键。例如,如果要频繁查询表a(该表主键为列a_id)的列a_name,而且要保证姓名是唯一的,则在列a_name上创建唯一索引。如果用户为多个员工输入了相同的姓名,则数据库显示错误,并且不能保存该表。

sqlserver中有关索引的问题

聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。

聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。例如,如果应用程序执行的一个查询经常检索某一日期范围内的记录,则使用聚集索引可以迅速找到包含开始日期的行,然后检索表中所有相邻的行,直到到达结束日期。这样有助于提高此类查询的性能。同样,如果对从表中检索的数据进行排序时经常要用到某一列,则可以将该表在该列上聚集(物理排序),避免每次查询该列时都进行排序,从而节省成本。

非聚集索引与课本中的索引类似。数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储(这可以由聚集索引规定)。如果在表中未创建聚集索引,则无法保证这些行具有任何特定的顺序。

也就是说:聚集是物理排序。而非聚集是不用将表和视图进行物理排序。

也个表或视图中最多有250个非聚集排序或有249个非聚集排序一个聚集排序。

sql 怎么 更新索引

Sqlserver 2008中索引在每次表插入新数据的时候都会自动更新。

SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间

下面举两个简单的例子:

图书馆的例子:一个图书馆那么多书,怎么管理呢?建立一个字母开头的目录,例如:a开头的书,在第一排,b开头的在第二排,这样在找什么书就好说了,这个就是一个聚集索引,可是很多人借书找某某作者的,不知道书名怎么办?图书管理员在写一个目录,某某作者的书分别在第几排,第几排,这就是一个非聚集索引

字典的例子:字典前面的目录,可以按照拼音和部首去查询,我们想查询一个字,只需要根据拼音或者部首去查询,就可以快速的定位到这个汉字了,这个就是索引的好处,拼音查询法就是聚集索引,部首查询就是一个非聚集索引.

看了上面的例子,下面的一句话就很容易理解了:聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续。就像字段,聚集索引是连续的,a后面肯定是b,非聚集索引就不连续了,就像图书馆的某个作者的书,有可能在第1个货架上和第10个货架上。还有一个小知识点就是:聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个。

sqlserver的问题,急,好心人看一下,谢谢!

你说的应该是在企业管理器里设计表的时候的“标识”属性吧 ?

标识只能用于数字类型,你的字段时nvchar型的,肯定不能设置标识属性。

如果要达到你所说的排序的目的,你必须在这个日期列上建一个聚集索引。

不过将字段类型选为nvchar类型是不太好的。

因为,加入你的表中存在这样两行

2006-2-1

2006-11-1

2006-11-1会排在2006-2-1前边。

所以要达到排序目的,你必须把日期字段定义为datetime或smalldatetime类型。

创建聚集索引的方法是,右击所选的表,然后选择“所有任务”-管理索引。

然后在日期字段上新建一个聚集索引就可以了。

另外每个表只能有一个聚集索引,这点要特别注意。

sqlserver 怎么建索引

(1)在SQL Server Management Studio中,选择并右击要创建索引的表,从弹出菜单中选择“设计”,打开表设计器。右键单击表设计器,从弹出菜单中选择“索引/键”命令,打开“索引/键”对话框。对话框中列出了已经存在的索引,如下图所示。

(2)单击“添加”按钮。在“选定的主/唯一键或索引”框显示系统分配给新索引的名称。

(3)在“列”属性下选择要创建索引的列。可以选择多达16列。为获得最佳性能,最好只选择一列或两列。对所选的每一列,可指出索引是按升序还是降序组织列值。

(4)如果要创建唯一索引,则在“是唯一的”属性中选择“是”。

(5)设置完成后,单击“确定”按钮。

(6)当保存表时,索引即创建在数据库中。

使用CREATE INDEX语句创建索引:

复制内容到剪贴板

代码:

CREATE[ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX索引名

ON {表名|视图名} (列名[ ASC | DESC ] [ ,...n ] )

例:

在数据库HrSystem中为表Employees创建基于IDCard列的唯一索引IX_Employees,可以使用以下命令:

复制内容到剪贴板

代码:

USE HrSystem

GO

CREATE UNIQUE NONCLUSTERED INDEX [IX_Employees]ONdbo.Employees(IdCard)

GO

例:

为表Employees创建基于列IDCard的唯一、聚集索引IX_Employees1,可以使用以下命令:

复制内容到剪贴板

代码:

USE HrSystem

GO

CREATE UNIQUE CLUSTERED INDEX [IX_Employees1] ON [dbo].[Employees](IdCard)

GO

需要注意的是,在一个表中只允许存在一个聚集索引。因此,如果表Employees中已经存在一个聚集索引,则执行上面的语句时将会提示下面的错误信息。

消息1902,级别16,状态3,第1行

无法对表'dbo.Employees'创建多个聚集索引。请在创建新聚集索引前删除现有的聚集索引'PK__Employee__263E2DD300551192'。 例:

对表Employees的列Emp_name按照降序创建索引,可以使用以下命令:

复制内容到剪贴板

代码:

USE HrSystem

GO

CREATENONCLUSTERED INDEX [IX_Employees2] ON [dbo].[Employees]

(

[Emp_name] DESC

)

GO

在CREATE INDEX语句中使用INCLUDE子句,可以在创建索引时定义包含的非键列,其语法结构如下:

复制内容到剪贴板

代码:

CREATENONCLUSTERED INDEX 索引名

ON { 表名| 视图名 } ( 列名 [ ASC | DESC ] [ ,...n ] )

INCLUDE (列名1, 列名2, [,… n])

例: 在表Employees上创建非聚集索引IX_Wage,索引中的键列为Wage,非键列为Emp_name、Sex和Title,具体语句如下:

复制内容到剪贴板

代码:

USEHrSystem

GO

CREATENONCLUSTERED INDEX IX_Wage

ON Employees ( Wage )

INCLUDE (Emp_name, Sex, Title)

GO

例: 在创建索引IX_Wage后,当表Employees中的数据量比较大时,执行下面的SELECT语句将会明显地改进查询效率。

复制内容到剪贴板

代码:

USEHrSystem

GO

SELECTEmp_name, Sex, Title, Wage

FROMEmployees

WHEREWage BETWEEN 1000 AND 3000

GO

修改索引:

在SQL Server Management Studio中,选择并右击要创建索引的表,从弹出的菜单中选择“设计表”,打开表设计器。右键单击表设计器,从弹出菜单中选择“索引/键”命令,打开“索引/键”对话框,并查看已经存在的索引及修改索引的属性信息。

也可以使用ALTER INDEX语句修改索引,其基本语法如下:

复制内容到剪贴板

代码:

ALTER INDEX { 索引名| ALL }

ON 表名|视图名

{ REBUILD | DISABLE | REORGANIZE }[ ; ]

ALTER INDEX语句的参数比较复杂,这里只介绍它的基本使用情况。参数说明如下:

REBUILD指定重新生成索引。 DISABLE指定将索引标记为已禁用。 REORGANIZE指定将重新组织的索引叶级。

例:

要禁用索引IX_Employees,可以使用下面的语句:

复制内容到剪贴板

代码:

USE HrSystem

GO

ALTERINDEX IX_Employees ON Employees DISABLE

GO

删除索引:

在SQL Server Management Studio中,选择并右击要创建索引的表,从弹出的菜单中选择“设计表”。打开表设计器。右键单击表设计器,从弹出菜单中选择“索引/键”命令,在打开的“索引/键”对话框中列出了已经存在的索引。单击“删除”按钮,即可删除索引信息。

复制内容到剪贴板

代码:

DROP INDEX 表名.索引名|视图名.索引名[ ,...n ]

总结:

o(1)索引并非越多越好,一个表中如果有大量的索引,不仅占用大量的磁盘空间,而且会影响INSERT、DELETE、UPDATE等语句的性能。因为当表中数据更改的同时,索引也会进行调整和更新。

o(2)避免对经常更新的表进行过多的索引,并且索引中的列尽可能少。而对经常用于查询的字段应该创建索引,但要避免添加不必要的字段。

o(3)数据量小的表最好不要使用索引,由于数据较少,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果。

o(4)在条件表达式中经常用到的、不同值较多的列上建立索引,在不同值少的列上不要建立索引。比如在学生表的“性别”字段上只有“男”与“女”两个不同值,因此就无须建立索引。如果建立索引,不但不会提高查询效率,反而会严重降低更新速度。

o(5)当唯一性是某种数据本身的特征时,指定唯一索引。使用唯一索引能够确保定义的列的数据完整性,提高查询速度。

o(6)在频繁进行排序或分组(即进行GROUPBY或ORDERBY操作)的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。


分享标题:sqlserver更改聚集索引,修改聚集索引
当前路径:http://ybzwz.com/article/dseosoh.html