聚集索引

SqlServer索引的原理与应用

99封情书 提交于 2020-01-01 04:54:55
转载自: https://www.cnblogs.com/knowledgesea/p/3672099.html 索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法。 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录可以快速找到你想要的信息,而不需要读完全书。在数据库中,数据库程序使用索引可以重啊到表中的数据,而不必扫描整个表。书中的目录是一个字词以及各字词所在的页码列表,数据库中的索引是表中的值以及各值存储位置的列表。 索引的利弊:查询执行的大部分开销是I/O,使用索引提高性能的一个主要目标是避免全表扫描,因为全表扫描需要从磁盘上读取表的每一个数据页,如果有索引指向数据值,则查询只需要读少数次的磁盘就行啦。所以合理的使用索引能加速数据的查询。但是索引并不总是提高系统的性能,带索引的表需要在数据库中占用更多的存储空间,同样用来增删数据的命令运行时间以及维护索引所需的处理时间会更长。所以我们要合理使用索引,及时更新去除次优索引。 数据表的基本结构 一个新表被创建之时,系统将在磁盘中分配一段以8K为单位的连续空间,当字段的值从内存写入磁盘时,就在这一既定空间随机保存,当一个 8K用完的时候,数据库指针会自动分配一个8K的空间。这里,每个8K空间被称为一个数据页(Page)

SqlServer索引的原理与应用

a 夏天 提交于 2020-01-01 04:54:44
SqlServer索引的原理与应用 索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法。 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录可以快速找到你想要的信息,而不需要读完全书。在数据库中,数据库程序使用索 引可以重啊到表中的数据,而不必扫描整个表。书中的目录是一个字词以及各字词所在的页码列表,数据库中的索引是表中的值以及各值存储位置的列表。 索引的利弊:查询执行的大部分开销是I/O,使用索引提高性能的一个主要目标是避免全表扫描,因为全表扫描需要从磁盘上读取表的每一个数据页,如果有 索引指向数据值,则查询只需要读少数次的磁盘就行啦。所以合理的使用索引能加速数据的查询。但是索引并不总是提高系统的性能,带索引的表需要在数 据库中占用更多的存储空间,同样用来增删数据的命令运行时间以及维护索引所需的处理时间会更长。所以我们要合理使用索引,及时更新去除次优索引。 数据表的基本结构 一个新表被创建之时,系统将在磁盘中分配一段以8K为单位的连续空间,当字段的值从内存写入磁盘时,就在这一既定空间随机保存,当一个 8K用完的时候,数据库指针会自动分配一个8K的空间。这里,每个8K空间被称为一个数据页(Page),又名页面或数据页面,并分配从0-7的页号, 每个文件的第0页记录引导信息,叫文件头

SQL Server 索引介绍

ε祈祈猫儿з 提交于 2020-01-01 04:54:33
数据库索引是对数据表中一个或多个列的值进行排序的结构,就像一本书的目录一样,索引提供了在行中快速查询特定行的能力 详细出处参考: http://www.jb51.net/article/30950.htm 一、索引的概述 1.概念: 数据库索引是对数据表中一个或多个列的值进行排序的结构,就像一本书的目录一样,索引提供了在行中快速查询特定行的能力. 2.优缺点: 2.1 优点: 1.大大加快搜索数据的速度,这是引入索引的主要原因. 2.创建唯一性索引,保证数据库表中每一行数据的唯一性. 3.加速表与表之间的连接,特别是在实现数据的参考完整性方面特别有意义. 4.在使用分组和排序子句进行数据检索时,同样可以减少其使用时间. 2.2 缺点: 1.索引需要占用物理空间,聚集索引占的空间更大. 2.创建索引和维护索引需要耗费时间,这种时间会随着数据量的增加而增加. 3.当向一个包含索引的列的数据表中添加或者修改记录时,SQL server 会修改和维护相应的索引,这样增加系统的额外开销,降低处理速度。 3.索引的分类: 1.按存储结构可分为: a.聚集索引:指物理存储顺序与索引顺序完全相同,它由上下两层组成,上层为索引页,下层为数据页,只有一种排序方式,因此每个表中只能创建一个聚集索引。 b.非聚集索引:指存储的数据顺序一般和表的物理数据的存储结构不同。 通过下表我们可以分析出:

SQL索引技巧_1

大城市里の小女人 提交于 2020-01-01 04:53:18
在SQL Server中,为了查询性能的优化,有时我们就需要对数据表通过建立索引的方式,目的主要是根据查询要求,迅速缩小查询范围,避免全表扫描。 索引有两种类型,分别是聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。 聚集索引在一个表中只能有一个,默认情况下在主键建立的时候创建,它是规定数据在表中的物理存储顺序,我们也可以取消主键的聚集索引,所以必须考虑数据库可能用到的查询类型以及使用的最为频繁的查询类型,对其最常用的一个字段或者多个字段建立聚集索引或者组合的聚集索引,它就是SQL Server会在物理上按升序(默认)或者降序重排数据列,这样就可以迅速的找到被查询的数据。 非聚集索主要是数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。索引中的项目按索引键值的顺序存储,而表中的信息按另一种顺序存储。可以在一个表格中使用高达249个非聚集的索引,在查询的过程中先对非聚集索引进行搜索,找到数据值在表中的位置,然后从该位置直接检索数据。这使非聚集索引成为精确匹配查询的最佳方法,因为索引包含描述查询所搜索的数据值在表中的精确位置的条目。 所以我们在选择创建聚集索引的时候要注意以下几个方面: 1) 对表建立主键时,就会为主键自动添加了聚集索引,如自动编号字段

Sqlserver:索引碎片的查询

一笑奈何 提交于 2019-12-29 02:00:56
索引碎片: 内部碎片(或说叶级填充率):反映数据叶级的空间占用率或空闲率 外部碎片:由于sqlserver以连续的8个page作为一个数据库块(区)extent作为读取单位,故此由于物理存储上的区和逻辑上不一致(不连续)而造成io读取切换 逻辑碎片:这是索引的叶级页中出错页所占的百分比。对于出错页,分配给索引的下一个物理页不是由当前叶级页中的“下一页”指针所指向的页 区碎片:这是堆的叶级页中出错区所占的百分比。出错区是指:包含堆的当前页的区不是物理上的包含前一页的区后的下一个区。(微软真不会解释概念:( 查询碎片情况:   dbcc showcontig:四部分对象名,【索引名】|【索引id】   dbcc showcontig:当前库对象id,【索引名】|【索引id】       sys.dm_db_index_physical_stats:数据库id,对象id,索引id,分区id,扫描模式 五个参数,基本上,【0(特殊的,index可以为0,故该处为-1)】|【null】|【default】 意义是一样的 基本指标: 扫描密度(%)[最佳计数:实际计数]:这是“最佳计数”与“实际计数”的比率。如果所有内容都是连续的,则该值为 100;如果该值小于 100,则存在一些碎片。“最佳计数”是指在一切都连续链接的情况下,区更改的理想数目。“实际计数”是指区更改的实际次数。 逻辑扫描碎片

SQLSERVER中的假脱机spool

回眸只為那壹抹淺笑 提交于 2019-12-25 23:03:30
SQLSERVER中的假脱机spool 我发现网上对于假脱机的解释都非常零散,究竟假脱机是什么? 这几天在家里研究了一下,收集了很多网上的资料 假脱机是中文的翻译,而英文的名字叫做 spool 在徐老师写的《SQLSERVER企业级平台管理实践》里提到了一下假脱机 在SQLSERVER I/O问题的那一节 在性能监视器里,有一个计数器“worktables/sec” : 每秒创建的工作表数。例如,工作表可用于存储查询 假脱机 (query spool),LOB变量,XML变量,表变量,游标的临时结果 在《剖析SQLServer执行计划》里也提到了假脱机 (13) 有时查询优化器需要在tempdb数据库中建立临时工作表。如果是这样的话 就意味着图形执行计划中有标识成 Index Spool, Row Count Spool 或者 Table Spool 的图标。 任何时候,使用到工作表一般都会防碍到性能,因为需要额外的I/O开销来维护这个工作表。 之前本人也写过一篇文章: 对于索引假脱机的一点理解 写这篇文章的时候当时还是对假脱机一知半解 假脱机在MSDN中的执行计划中的逻辑运算符和物理运算符中提到了几个假脱机相关的运算符(详见本文最后面) Eager Spool Lazy Spool Index Spool (有时候也叫 Nonclustered Index Spool ) Row

InnoDB聚集索引如何定位到数据的物理位置

与世无争的帅哥 提交于 2019-12-25 15:05:18
MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。这与Oracle的索引结构相似,比较好理解。那么,常用的Innodb聚集索引结构是怎样的呢? InnoDB的数据文件本身(.ibd文件)就是索引文件。在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。 上图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。 可能上面的描述还不够直观,我又翻阅了《MySQL技术内幕:Innodb存储引擎》一书,在其第172页找到了如下图片。 可以看出,聚集索引非叶子节点中,Pointer(索引键值)指向的是ibd文件的Page Offset,这样就定位到数据的物理位置了。通过操作系统的inode,就能找到磁盘中的具体数据块了。 找到数据块,将它读入Innodb buffer pool

Mysql索引进阶入门

北城余情 提交于 2019-12-24 17:52:10
1. 索引操作 MySQL 索引 菜鸟 2. 索引类型 PRIMARY 唯一且不能为空;一张表只能有一个主键索引 INDEX 普通索引 UNIQUE 唯一性索引 FULLTEXT 全文索引:用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以 3. 聚集索引 VS 非聚集索引 3.1 区别 * 聚集索引:主键索引,索引中键值的逻辑顺序决定了表中相应行的物理顺序 * 非聚集索引(非主键索引,也称二级索引):除主键索引(普通索引、唯一索引、全文索引),索引的逻辑顺序与磁盘上行的物理存储顺序不同 查询过程: 查询聚集索引能直接得到所有数据, 查非聚集索引需要先得到聚集索引地址, 回表 再得到数据。 3.1 聚集索引规则 如果一个主键被定义了,那么这个主键就是作为聚集索引 如果没有主键被定义,那么该表的第一个唯一非空索引被作为聚集索引 如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增。 4 索引结构 默认 B+Tree , Hash (key-value的插入以及查询,哈希表的时间复杂度都是O(1),如果不需要有序的遍历数据,哈希表性能最好。) B+树 由二叉树演变的m阶树 为什么是B+树(配合磁盘的读写特性,减少单次查询的磁盘访问次数。)

唯一索引、聚集索引和聚集索引

烈酒焚心 提交于 2019-12-24 14:12:43
1.一个表只能有一个主索引-PRIMARY,且只有是数据库表才有主索引,后缀为.CDX,索引关键字是不可以重复的.哪怕是空记录也只可以有一条.2.候选索引可以有很多个,索引关键字同样不可以重复,同样只存在于数据库表.3.唯一索引,可以存在于自由表,但索引关键字不可以重复.4.普通索引简单的理解就是只起排序作用.索引关键字是可以重复的.可存在于自由表. 主键与唯一索引的区别 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。 唯一性索引列允许空值,而主键列不允许为空值。 主键列在创建时,已经默认为空值 + 唯一索引了。 主键可以被其他表引用为外键,而唯一索引不能。 一个表最多只能创建一个主键,但可以创建多个唯一索引。 主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。 在 RBO 模式下,主键的执行计划优先级要高于唯一索引。 两者可以提高查询的速度。 CREATE UNIQUE INDEX test_UniqueKey ON test (UniqueKey); 聚集索引: 聚集索引基于数据行的键值,在表内排序和存储这些数据行。每个表只能有一个聚集索引,应为数据行本分只能按一个顺序存储。 在聚集索引中,表中各行的物理顺序与索引键值的逻辑(索引)顺序相同

如何删除主键的聚集索引

独自空忆成欢 提交于 2019-12-24 06:30:07
当我们对一个表建立一个主键时,默认会给该主键列添加一条聚集索引,这是数据库内部自动建立的,唯一性约束也会默认创建一个非聚集索引。 create table MyTable ( id int identity(1,1) primary key, name nvarchar(10) unique ) exec sp_helpindex MyTable 上面我们建立了一个主键id 和唯一性约束的name列,查看表可以看到这时产生了两个索引 聚集索引是一个宝贵的资源,在一些表的中有时我们永远不会用到主键来作为查询条件,或者作为其他表的外键,这时主键的聚集索引 就显得大才小用了,我们希望将聚集索引建立在其他真正需要的字段,不过当我们执行删除操作时会报以下错误 消息 3723,级别 16,状态 4,第 1 行 不允许对索引 'MyTable.PK__MyTable__3213E83F145C0A3F' 显式地使用 DROP INDEX。该索引正用于 PRIMARY KEY 约束的强制执行 不过我们可以先删除主键约束,这样聚集所以就自动删除了 alter table MyTable drop constraint PK__MyTable__3213E83F145C0A3F 我们再看下聚集索引已经不存在了 当然唯一约束所引起的索引也可以同样的方式操作,先删除唯一约束 来源: https://www