对聚集表查询的时候,未显式指定排序列的时候,默认查询结果的顺序一定是按照聚集索引顺序排序的吗

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 原文:对聚集表查询的时候,未显式指定排序列的时候,默认查询结果的顺序一定是按照聚集索引顺序排序的吗本文之外可参考另外一篇文章作为补充:http://www.cnblogs.com/wy123/p/6189100.
原文: 对聚集表查询的时候,未显式指定排序列的时候,默认查询结果的顺序一定是按照聚集索引顺序排序的吗

本文之外可参考另外一篇文章作为补充:http://www.cnblogs.com/wy123/p/6189100.html

 

在sql server 中,如果一张表存在聚集索引的时候,
大多数情况下,如果进行select * from TableName查询,默认的返回顺序是按照聚集所在列的顺序返回的
但是,在一张表存在聚集索引的时候,并不一定所有的情况都是按照聚集索引列的顺序排列的,
下面开始测试

create table TestDefaultOrder
(
	Id int identity(1,1) primary key,--主键上默认会建立聚集索引
	Col2 char(5),
	COL3 char(5)
)
--写入100000条测试数据
insert into TestDefaultOrder  values (SUBSTRING(cast(NEWID() as varchar(50)),1,5),SUBSTRING(cast(NEWID() as varchar(50)),1,5))
go 100000

如下查询完全没有问题,正如你所预料的,按照聚集索引所在的列(Id)排序的,完全没有问题,下面开始切入正题

 

--创建一张同样的对照表
create table TestDefaultOrder_Contrast
(
	Id int identity(1,1) primary key,--主键上默认会建立聚集索引
	Col2 char(5),
	COL3 char(5)
)

--将TestDefaultOrder表中的数据写入进去,目前,两张表的数据和索引结构一模一样
insert into TestDefaultOrder_Contrast (Col2,Col3)  
select Col2,Col3 from TestDefaultOrder

--仅仅在对照表上创建一个非聚集索引,这是唯一的不同点
Create Index idx2 on TestDefaultOrder_Contrast(Col2,Col3)

接下来的查询,或许会有一点一点出乎你的意料,

上面说了,两张表的数据是一模一样的,聚集索引结构也是一样的,只是对照表多个一个非聚集索引

发现对照表的结果返回顺序,根本是按照聚集索引的排序返回的

 

那么原因在哪里呢?我们要从不同类似索引占用的空间情况进行分析,通过dm_db_index_physical_stats发现,在数据数据完全一致的情况下,

因为TestDefaultOrder_Contrast这个表上的非聚集索引,占用的空间更少(248个page,而TestDefaultOrder的聚集索引是285个page),

正因为此,sqlserver在进行全表扫描的时候,会选择一个代价更小的索引(进行扫描),

因为TestDefaultOrder表上只有一个聚集索引,按照聚集索引扫描进行查询,返回的结果的顺序是按照聚集索引列排序的

但是TestDefaultOrder_Contrast就不同了,因为在非聚集索引idx2 上,包含了全部的数据(Col2,Col3以及指向聚集索引键值的Id),

但idx2这个索引是占用的空间更小,所以对于TestDefaultOrder_Contrast的查询,是按照idx2这个非聚集索引进行扫描的

 

因为,在TestDefaultOrder_Contrast这个表上,

直接select * TestDefaultOrder_Contrast进行查询的话,

跟对表TestDefaultOrder进行 select * TestDefaultOrder查询

是用两种完全不同的方式进行的,出来的结果自然也就不同了

 

 

而事实上,sqlserver在对TestDefaultOrder_Contrast进行查询的时候,通过走idx2这个索引扫描,代价确实要比TestDefaultOrder的聚集索引扫描,代价要小

 

如果有兴趣的话,再次分析为什么存储同样的数据(TestDefaultOrder上的聚集索引和TestDefaultOrder_Contrast的非聚集索引idx2),

TestDefaultOrder表上的聚集索引,要比TestDefaultOrder_Contrast上的idx2(Create Index idx2 on TestDefaultOrder_Contrast(Col2,Col3))占用的空间大呢

这里的原因在于,一个表上的聚集索引(于非聚集索引相比),除了要存储数据,要维护的信息更多的元数据信息,占用的空间自然就较多一点

而sqlserver在进行查询的时候,总是会选择一个代价相对较低的方式。

 

总结:千万不要以为,只要表上建立了聚集索引,在查询的时候,返回结果的默认的排序方式,是按照聚集索引来的

 

 

 

后记:为什么要研究这个问题?

因为之前遇到过,某些查询没有显式指定排序列,但是借助表上聚集索引,返回结果的时候,会得一个想要的顺序。

这种情况其实会潜在一种问题,如果发生类似上面这种情况,想要对查询结果按照聚集索引的顺序排序,而又不显式制定排序列,查询结果的显示顺序,可就不一定了。

 

目录
相关文章
|
SQL 数据库 Windows
若依代码生成详细教程
我觉得若依官方的代码生成教程过于简单,网上的教程很多连个效果图都没有。 本文要达到的效果如下:[学生管理] 下有个 [学生信息] 菜单,里面可以增删改查。
6003 0
若依代码生成详细教程
|
域名解析 缓存 网络协议
如何解决域名解析不生效问题?
文中对域名解析不生效的原因进行了分析,并针对最常见的本地递归域名服务器缓存不生效的问题提出了解决方案,尤其移动域名解析HTTPDNS对无线场景下的应用特别有效。
32329 0
|
11月前
|
SQL 监控 测试技术
SQL现在到哪个版本及版本更新技巧与方法
SQL(Structured Query Language)作为数据库管理和操作的标准语言,随着技术的不断进步和数据库管理系统(DBMS)的持续发展,其版本也在不断更新和完善
1000 5
|
8月前
|
缓存 Unix 应用服务中间件
Nginx,最强单体之一
Nginx是一款高性能的HTTP Web服务器、反向代理、内容缓存及负载均衡器,由伊戈尔·赛索耶夫开发并开源。它采用多进程和I/O多路复用技术,支持高并发和高效处理请求,广泛应用于各大互联网公司。Nginx不仅具备基本的HTTP服务功能,如静态文件处理、反向代理和负载均衡,还支持高级特性如SSL、HTTP/2、动静分离等。其架构设计使其在性能、可靠性、扩展性等方面表现出色,成为Web技术学习和应用的首选工具之一。本文将分两部分介绍Nginx的架构及其原生常用功能。
433 25
Nginx,最强单体之一
|
9月前
|
SQL JSON 前端开发
若依RuoYi脚手架二次开发教程(二次开发必学技能)
本次我们将通过一个菜品管理模块开发的案例,来演示拿到若依框架后,如何在若依管理系统上进行二次开发,升级改造为自己的管理系统。适合以若依作为项目脚手架的公司开发人员、毕业设计的学生及开源项目学习者。
5249 1
若依RuoYi脚手架二次开发教程(二次开发必学技能)
|
8月前
|
存储 人工智能 Kubernetes
MiniMax云上AI数据湖最佳实践
本简介介绍MiniMax云上AI数据湖的最佳实践。MiniMax成立于2021年,专注于通用人工智能领域,提供ToB和C端产品。面对每日3万亿token、2000万张图片及7万小时语音数据的处理需求,MiniMax基于阿里云构建了稳定灵活的基础设施,采用多云策略实现全球化部署。通过引入Kubernetes、Ray等技术,优化了多模态数据处理效率,并利用对象存储与数据湖技术降低成本。此外,与阿里云合作开发边缘缓存方案,提升跨地域数据传输效率。主讲人:阿里云弹性计算技术专家高庆端。
344 10
|
11月前
|
监控 数据可视化 数据挖掘
一文带你了解如何通过数据可视化与仪表盘提升工作效率?
在数据驱动的时代,快速、准确地从海量信息中提取有用部分成为核心挑战。**数据可视化**和**仪表盘**是解决这一问题的有效工具。它们将复杂数据转化为直观图表,帮助用户快速掌握关键指标、跟踪进展,并做出更好决策。本文将介绍数据可视化的常见方法、仪表盘的作用,并通过经典案例展示这些工具的实际应用。
239 0
软件交付质量问题之要提升发布成功率,如何实现
软件交付质量问题之要提升发布成功率,如何实现
|
SQL 存储 缓存
老司机总结的12条 SQL 优化方案(非常实用)(一)
老司机总结的12条 SQL 优化方案(非常实用)
老司机总结的12条 SQL 优化方案(非常实用)(一)
|
存储 Java 测试技术
深度优化 | PolarDB-X 基于向量化SIMD指令的探索
本文将介绍PolarDB-X对于向量化SIMD指令的探索和实践,包括基本用法及实现原理,以及在具体算子实现中的思考和沉淀。

热门文章

最新文章