SQL Server聚集索引和非聚焦索引
1、什么是索引?
索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。使用索引查数据无需进行全表扫描,可以快速查询所需的数据。
2、聚集索引和非聚集索引的区别?
一个表只能有一个聚集索引但可以有多个非聚集索引。
聚集索引的叶节点就是最终的数据节点,而非聚集索引的叶节仍然是索引节点,但它有一个指向最终数据的指针。
3、聚集索引和非聚焦索引的原理是什么?
如果给表上了主键(索引),那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,也就是B树结构,换句话说,就是整个表就变成了一个索引。
4、为什么只能有一个聚集索引?
数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同。所以一张表只能存在一个聚集索引。
5、主键一定是聚集索引吗?
答:不是,可以是非聚集索引,只不过默认是聚集索引,主键必须依赖于索引。
go
CREATE TABLE T
(
t_id int,
t_name nvarchar(10),
t_count int,
t_version int,
constraint pk_t_t_id primary key nonclustered(t_id) -- 添加非聚集索引主键
)
CREATE CLUSTERED INDEX idx_t_t_id ON t(t_id); -- 添加聚集索引
6、索引只能包含一列吗?
答:可以包含多列
CREATE CLUSTERED INDEX idx_t_t_id_or_t_name ON t(t_id,t_name); -- 添加一个包含多列的聚集索引
7、聚集索引的约束是唯一性,是否要求字段也是唯一的呢? 不要求唯一!
分析:如果认为是的朋友,可能是受系统默认设置的影响,一般我们指定一个表的主键,如果这个表之前没有聚集索引,同时建立主键时候没有强制指定使用非聚集索引,SQL会默认在此字段上创建一个聚集索引,而主键都是唯一的,所以理所当然的认为创建聚集索引的字段也需要唯一。
结论:聚集索引可以创建在任何一列你想创建的字段上,这是从理论上讲,实际情况并不能随便指定,否则在性能上会是恶梦。
8、为什么聚集索引可以创建在任何一列上,如果此表没有主键约束,即有可能存在重复行数据呢?
粗一看,这还真是和聚集索引的约束相背,但实际情况真可以创建聚集索引。
分析其原因是:如果未使用 UNIQUE 属性创建聚集索引,数据库引擎将向表自动添加一个四字节 uniqueifier 列。必要时,数据库引擎 将向行自动添加一个 uniqueifier 值,使每个键唯一。此列和列值供内部使用,用户不能查看或访问。
9、B树、二叉树、B+树的区别
二叉树的每个节点只能存储一个值,B树可以存储M个值。B树在每个节点都可以保存数据(键值对),B+树只有在叶子节点才可以存储数据
10、 B树根节点以及叶节点存储的内容
图片来源:https://blog.csdn.net/qq_33925869/article/details/89704056
11、开启IO数量
go
set statistics io on
select * from t where t_id = 3