SQL Server中CLUSTERED INDEX的特殊用处

SQL Server中CLUSTERED INDEX的特殊用处

背景

在查看SQL Server数据库项目的存储过程中,看到了如下2行紧邻的代码

create CLUSTERED index #detail_idx_order on #detail(ordersno, name, count, orderdate)
drop index #detail_idx_order on #detail

(此处 #detail 表名前加 # 表示本地临时表,与用户Session有关,当用户断开连接时,如果用户没有手动Drop临时表, SQL Server将自动Drop 临时表)
因之前一直使用create index ,未深入了解过 CLUSTERED INDEX,就感觉此处代码很奇怪,建了一个INDEX,马上就删掉了,后续没有用到该索引,从数据库优化的角度来看,该处的两句应该删掉,毕竟建立索引和删除索引都是有数据库消耗的。
不过从开发的角度考虑,也不会无缘无故写该两句,应该有什么自己不知道的特性,就进行了查询与实验。
先说结果:
该处创建并删除CLUSTERED INDEX 是为了将数据按照(ordersno, count, orderdate) 的顺序进行物理排序,保证执行:select * from #detail 查出的数据,默认带有 order by ordersno, count, orderdate
即等价于:select * from #detail order by ordersno, count, orderdate

CLUSTERED INDEX的定义

CLUSTERED INDEX :聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法。
特点是存储数据的顺序和索引顺序一致。
聚集索引相当于使用字典的拼音查找,因为聚集索引正文内容本身就是一种按照一定规则排列的目录,存储记录时物理上连续存在的,即拼音a过了后面肯定是b 。

简单实验

定义中介绍了CLUSTERED INDEX 的特性,不过在本背景中,该索引还被删除了,从索引的角度,索引跟原始表结构是分开存储的,且该索引只涉及到表的部分字段,当索引被删掉后,再次查询数据时,还是有序的吗?
#detail 中一共4个字段(ordersno, count, orderdate,name)

  1. 创建表
create table testdetail (
ordersno int,
name varchar
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值