SQL Server中CLUSTERED INDEX的特殊用处

  • 背景
  • 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(20),
orderdate date,
count int
)
  1. 插入测试数据
insert into testdetail values (321,'bbb',SYSDATETIME(),10);
insert into testdetail values (301,'ccc',convert(date,'2020-05-16',23),30);
insert into testdetail values (123,'aaa',convert(date,'2021-05-01',23),30);
insert into testdetail values (451,'ccc',convert(date,'2020-12-16',23),30);
insert into testdetail values (311,'abc',convert(date,'2020-07-12',23),30);
insert into testdetail values (629,'fff',convert(date,'2021-01-13',23),30);
insert into testdetail values (210,'eee',convert(date,'2020-02-16',23),30);
  1. 查询普通表数据
select * from testdetail;

  1. 创建临时表并查询临时表数据
select * into #testdetail from testdetail;
select * from #testdetail;


5. 临时表创建聚簇索引并查询数据

create clustered index #detail_idx_order on
#testdetail (ordersno,orderdate,count);
select * from #testdetail;

造的数据不太好,odersno 自己就搞定了排序

6. 向临时表中插入一条数据,查询

insert into #testdetail values (311,'abc',convert(date,'2020-07-12',23),30);
select * from #testdetail;

新插入的数据,排序正常

  1. 删除临时表聚簇索引并查询数据
drop index #detail_idx_order on #testdetail;
select * from #testdetail;

结果数据还是排序后的顺序

  1. 重新向临时表中插入一条数据,查询
    新插入数据的位置,就再最后面了

    后续还做了普通表上的聚簇索引的实验,结果与临时表一致。

总结

在临时表上及普通表上创建 CLUSTERED INDEX 索引,会将整表数据,按照物理位置进行排序存储,且新插入数据,也会按照排序后的顺序存储;删除聚簇索引后,已排序的数据物理位置不发生变化,再新插入数据,新插入数据顺序恢复到普通表的情形。

SQL Server中CLUSTERED INDEX的特殊用处相关推荐

  1. SQL Server中clustered与nonclustered的区别

    CLUSTERED :聚集索引.非聚集索引:NONCLUSTERED. clustered是物理上实现数据排序,并且同一个表里只能有一个clustered索引,而nonclustered是逻辑上的排序 ...

  2. 十步优化SQL Server中的数据访问

    故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户, ...

  3. SQL Server中常用的SQL语句

    1.概述 2.查询概述 3.单表查询 4.连接查询 5.带有exists的相关子查询 6.SQL的集合操作 7.插入操作 8.删除操作 9.修改操作 10.数据定义 11.视图 1.概述 名词 笛卡尔 ...

  4. 细说Sql Server中的视图(下)转载

    原文:细说Sql Server中的视图(下)http://www.cnblogs.com/xbf321/archive/2009/06/19/view_two_in_sqlserver.html 1, ...

  5. SQL Server中一些常见的性能问题

    SQL Server中一些常见的性能问题: 1.在对查询进行优化时,应当尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.我们应当尽量避免使用 left jo ...

  6. SQL Server中SCAN 和SEEK的区别

    SQL Server中SCAN 和SEEK的区别 SQL SERVER使用扫描(scan)和查找(seek)这两种算法从数据表和索引中读取数据.这两种算法构成了查询的基础,几乎无处不在.Scan会扫描 ...

  7. 理解SQL SERVER中的分区表(转)

    简介 分区表是在SQL SERVER2005之后的版本引入的特性.这个特性允许把逻辑上的一个表在物理上分为很多部分.而对于SQL SERVER2005之前版本,所谓的分区表仅仅是分布式视图,也就是多个 ...

  8. SQL Server中的执行计划

    介绍 (Introduction) In this article, I'm going to explain what the Execution Plans in SQL Server are a ...

  9. SQL Server中的列存储索引

    先决条件 (Prerequisite ) 通过理论和实践措施可以更好地解释与SQL Server 2012列存储索引有关的讨论. 因此,对于实际测量部分–我将使用AdventureWorksDW201 ...

最新文章

  1. 《solidity学习笔记》chapter 3-solidity其他知识
  2. shop--10.商品--商品添加(前端)及问题的解决
  3. java各种集合的线程安全
  4. lumanager mysql密码_LuManager单独安装mysqli
  5. Zookeeper概述、特点、数据模型
  6. 微信公众平台新增语义理解接口
  7. leetcode:剑指offer----二维数组中查找
  8. 脚本修改域内本地管理员密码
  9. oracle两个date相减_从 Oracle 到 PostgreSQL:从 Uptime 到数据库实例运行时间
  10. 1104File Space Bitmap Block损坏能修复吗
  11. python找工作好不好_Python这么火,为何有人说Python不好找工作?
  12. 宿主机docker容器互传文件命令
  13. php查看加载的配置文件路径,thinkphp5.0 配置文件加载路径说明
  14. oracle查看脚本,oracle 查看表空间的脚本
  15. c语言 截止频率6低通滤波器,用Verilog在FPGA上实现低通滤波器
  16. MESHLAB安装教程
  17. 快速入门 | 篇十九:正运动技术运动控制器多轴同步与电子凸轮指令简介
  18. qt.qpa.xcb: could not connect to display解决
  19. Linux中cinder的作用,11-cinder块存储服务部署
  20. PROFINET通信技术总结

热门文章

  1. Hive的伴奏_OURDEN INSTRUMENTALS MIXTAPE Vol.108 “Sober” 伴奏合辑
  2. 六、安装ExcelLibrary库
  3. 应用密码学课程设计 密钥分发
  4. 自动控制原理的一般概念
  5. 去掉windows快捷箭头脚本
  6. Aruba与中国电信国际有限公司达成MSP战略合作,剑指海外市场
  7. [股票预测]股票历史数据获取
  8. Nancy 入门教程
  9. Forwards, Backwards, May, and Must
  10. 地理信息系统(Geographic Information System,GIS)