SQL Server索引类型有几种,如何设置索引
Admin 2022-08-02 群英技术资讯 568 次浏览
索引是一种磁盘上的数据结构,建立在表或视图的基础上。使用索引可以使数据的获取更快更高校,也会影响其他的一些性能,如插入或更新等。
索引主要分为两种类型:
字典的目录就是一个索引,按照拼音查询想要的字就是聚集索引(物理连续,页码与目录一一对应),偏旁部首就是一个非聚集索引(逻辑连续,页码与目录不连续)。
聚集索引存储记录是物理上连续存在的,而非聚集索引是逻辑上的连续,物理存储并不连续。
聚集索引一个表中只能有一个,而非聚集索引一个表中可以有多个。
使用索引是为了避免全表扫描,因为全表扫描是从磁盘上读取表的每一个数据页,如果有索引指向数据值,则只需要读少次数的磁盘就可以。
带索引的表在数据库中占用更多的空间,同样增、删、改数据的命令所需时间会更长。
书中的目录是一个字词以及所在的页码列表,数据库中的索引是表中的值以及各值存储位置的列表。
聚集索引是在数据库中新开辟一个物理空间,用来存放他排列的值,当有新数据插入时,他会重新排列整个物理存储空间。
非聚集索引只包含原表中的非聚集索引的列和指向实际物理表的一个指针。
数据表的基本结构
当一个新的数据表创建时,系统将在磁盘中分配一段以8k为单位的连续空间。当一个8k用完的时候,数据库指针会自动分配一个8k的空间,每个8k的空间称为一个数据页,并分配从0-7的页号,每个文件的第0页记录引导信息叫页头,每8个数据页由64k组成形成扩展区。全部数据页的组合形成堆。
SQL Server规定行不能跨越数据页,所以每行记录的最大数量只能是8k,这就是为什么char和varchar这两种字符类型容量要限制在8k以内的原因,存储超过8k的数据应使用text类型,其实text类型的字段值不能直接录入和保存,它是存储一个指针,指向由若干个8k的数据页所组成的扩展区,真正的数据其实放在这些数据页中。
展开要创建索引的表->右击索引->选择新建索引->聚集索引->新建索引点添加->选择列->选择升序或降序->输入名字->确定。
默认情况下,生成主键的同时将自动创建一个聚集索引。
create clustered index index_name /*聚集索引名*/ on table_name ( id desc ) with(drop_existing=on); /*如果存在则删除*/
每张表或者视图只能包含一个聚集索引,因为聚集索引改变了数据存储与排列方式。
无论是聚集还是非聚集索引,都将信息存储在平衡树或B-树中,B-树识别类似数据并将他们组合在一起,正是由于B-树中的检索基于键值,因此索引可以提升数据访问的速度。B-树将具有类似键的组合起来,所以数据库引擎只需搜索少量页面即可找到目标记录。
每张表上可以有多个非聚集索引,可以在某个列上创建一个索引,也可以在已经是现有索引组成部分的多列上创建索引。
create nonclustered index fei /*聚集索引名*/ on defualt ( hits desc )
fillfactor:用于在创建索引时,每个索引页的数据占索引大小的百分比,默认100.当需要频繁修改表时,建议设置为70-80,不经常更新时建议90。
create table ceshi --新建表 ( id int identity(1,1) primary key, name varchar(20), code varchar(20), [date] datetime ) --插入10w条测试数据 declare @n int set @n = 1 while @n <100000 begin insert into ceshi (name,code,[date]) values ('name'+cast(@n as varchar(20)),'code'+cast(@n as varchar(20)),getutcdate()) set @n=@n+1 end --查看数据 set statistics io on --查看磁盘io set statistics time on --查看sql语句分析编译和执行时间 select * from ceshi --查看索引情况 exec sp_helpindex ceshi select * from ceshi where name = 'name1'
ctrl+l 查看执行计划 聚集索引扫描开销100%,考虑优化为索引查找,在name上建立非聚集索引。
--建立非聚集索引 create index name_index on ceshi ( name ) --再次查看索引情况 多出来新建的非聚集索引 exec sp_helpindex ceshi --在运行上面的语句 select * from ceshi where name = 'name1' --明显发现速度变快了 , ctrl+l 发现聚集索引和非聚集索引各占50%
--查看该表中的索引 exec sp_helpindex ceshi --改名 exec sp_rename 'ceshi.name_index','new_name' --删除索引 drop index ceshi.new_name --检查碎片 dbcc showcontig(ceshi,new_name) --整理碎片 dbcc indexdefrag(webDB,ceshi,new_name) --更新表中所有索引的统计 update statistics ceshi
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
我们知道数据库是用来存储数据的,因此我们常常会对数据进行增加,修改和删除的操作。本文就主要介绍SQL删除表的操作,SQL语句中删除表有drop、truncate和delete的用法,很多刚学习SQL删除表的朋友对于这三种语句的用法不是很清楚,下面小编就给大家具体说说。
这篇文章主要介绍了SqlServer如何通过SQL语句获取处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统相关信息的相关资料,需要的朋友可以参考下
SQL UNION运算符用于组合两个或更多SELECT语句的结果集,而不返回任何重复的行。UNION中的每个SELECT语句必须具有相同的列数,这些列也必须具有相似的数据类型,每个SELECT语句中的列也必须以相同的顺序排列,每个SELECT语句必须有相同数目的列表达式 但是每个SELECT语句的长度不必相同
首先看以下SQL逻辑语句块:DECLARE@fieldnamevarchar(50)DECLARE@fieldvaluenvarchar(100)SET@fieldname='chassisno'--这里可传入chassisno,plateno,owner,co...
今天给大家分享的是关于高并发下的幂等性的内容,很多朋友可能对于幂等性不是很了解,下面我们先来看看什么是幂等性及幂等性的作用,然后我们再了解保证高并发下的幂等性的方案。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008