SQL基础-索引-源动力

2021-07-23  本文已影响0人  苦难_69e0

索引的基本概念

什么是索引?

索引可以帮助数据库引擎在表中查找数据而不需要扫描整个表。
索引是减少磁盘IO和逻辑读次数的最佳方法之一。
索引帮助我们提高获取数据的性能,但同时也会影响DML的性能。

SQL Server支持2类索引:

索引是按 B+ 树结构组织的

堆表(Heap Table)

使用下列命令可以获得IAM页

DBCC IND('databasename','Tablename',-1)

上述查询的输出结果里,Page Type列值为10的记录就是IAM页

image.png
select * from sys.partitions where object_id=object_id('students_heap')
image.png
select a.* from sys.allocation_units a
inner join sys.partitions b on b.hobt_id=a.container_id
where b.object_id=object_id('students_heap')
image.png
dbcc ind(testdb,students_heap,-1) 

PageType=10的就是IAM页,IndexLevel=0的是叶子层

image.png

\

聚集表(Clustered Table)

image.png

聚集表(Clustered Table) - 唯一列的聚集索引

image.png

聚集表(Clustered Table) - 非唯一列的聚集索引

image.png

非聚集索引(Non Clustered Index)

image.png
--堆表上的非聚集索引(非唯一)
create index ix_name on students_heap(name)
image.png
聚集表上的非聚集索引(非唯一)
create index ix_name on students(name)
image.png image.png

索引的使用

聚集索引的设计要求

非聚集索引的设计要求

唯一索引
唯一索引能够保证索引键中不包含重复的值,从而使表中的每一行从某种方式上具有唯一性。

唯一索引可通过以下方式实现:

Create Unique [Clustered | NonClustered] Index On TableName(ColName)

唯一索引 - PRIMARY KEY 约束

表通常具有包含唯一标识表中每一行的值的一列或一组列。 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性。 由于主键约束可保证数据的唯一性,因此经常对标识列(identity)定义这种约束。

ALTER TABLE TableName ADD  CONSTRAINT ConstName PRIMARY KEY CLUSTERED (ColName)

唯一索引 - UNIQUE 约束

约束是 SQL Server 数据库引擎 为您强制执行的规则。可以使用 UNIQUE 约束确保在非主键列中不输入重复的值。

ALTER TABLE TableName ADD  CONSTRAINT ConstName UNIQUE NONCLUSTERED ([ColName])

唯一索引 - 堆表上的唯一非聚集索引
跟前面的 堆表上的非聚集索引(非唯一) 的区别是什么?

create unique index ux_name on students_heap(name)
image.png

唯一索引 - 堆表上的唯一非聚集索引

跟前面的 堆表上的非聚集索引(非唯一) 的区别是什么?

create unique index ux_name on students_heap(name)
image.png

筛选索引

筛选索引是一种经过优化的非聚集索引,尤其适用于涵盖从定义完善的数据子集中选择数据的查询。 筛选索引使用筛选谓词对表中的部分行进行索引。

筛选索引与全表索引相比具有以下优点:

当列中的值大部分为 NULL 并且查询只从非 NULL 值中进行选择时,可以为非 NULL 数据行创建筛选索引;如果查询条件和过滤索引的条件完全一致,则过滤索引中的列可以不在索引列或包含列中
参数化查询时,执行计划无法使用筛选索引,但动态生成的语句可以使用筛选索引

带有包含列的索引

当索引包含查询引用的所有列时,通常称为“覆盖索引”。

带有包含性非键列的索引可以显著提高查询性能。 因为查询优化器可以在索引中找到所有列值;不访问表或聚集索引数据,从而减少磁盘 I/O 操作。

带有包含列的索引和把非键列放在键列中的覆盖索引有什么区别?

带有包含列的索引

create index ix_name_i on students(name) include(birthday)
image.png

非键列放在键列的覆盖索引

create index ix_name_birthday on students(name,birthday)
image.png

索引键列的顺序

设计索引时,应考虑以下数据库准则:

索引对执行计划的影响

image.png image.png image.png image.png image.png image.png image.png
上一篇 下一篇

猜你喜欢

热点阅读