邹兄!救急!!!关于非聚集索引排序问题

路人乙e 2010-12-28 02:12:02
一个user表,包含如下索引,都是非聚集的


查询语句A:
SELECT TOP 100 UserId FROM User

得到如下结果

是按UserId排的序

查询语句B:
SELECT TOP 100 UserId,Username FROM User

得到如下结果

看上去是按Username排的序,但接着看如下语句

查询语句C:
SELECT TOP 100 UserId,Username FROM User ORDER BY Username

得到如下结果

确实是按Username排序,是在全表中排序后查询top 200,而语句B貌似是top 200后的order by Username

这是怎么回事呢,SQL总得有一种默认排序方式吧,到底是怎么排的序
...全文
361 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
feilniu 2010-12-30
  • 打赏
  • 举报
回复
总而言之就是:

如果想要使查询的结果顺序固定,则必须指定ORDER BY。
否则,结果顺序由数据的物理存储形式和查询引擎选择的执行计划决定。
xiaoxiangqing 2010-12-30
  • 打赏
  • 举报
回复
最好自己指定排序
feilniu 2010-12-30
  • 打赏
  • 举报
回复
没有聚焦索引的堆,就是一堆页的线性链表。默认是插入顺序,如果更新和删除导致页面重组,顺序就会改变。
feilniu 2010-12-29
  • 打赏
  • 举报
回复
SELECT TOP 100 UserId FROM User
====
IX_UserID的Non-clustered Index Scan,扫出前100,按索引默认顺序输出。

SELECT TOP 100 UserId,Username FROM User
====
无聚集索引,则是Table Scan,扫出前100,按堆默认顺序输出。

SELECT TOP 100 UserId,Username FROM User ORDER BY Username
====
估计是IX_Username的Non-clustered Index Scan,扫出前100,再Table Lookup,找到对应UserId,强制按Username顺序输出。
Q315054403 2010-12-29
  • 打赏
  • 举报
回复
因为查询的内容有从索引得数据,有从索引+Seek得数据,所以不同喽
renwenli07461 2010-12-29
  • 打赏
  • 举报
回复
执行计划执行的是怎样的呢,可以找出原因
-晴天 2010-12-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sq_zhuyi 的回复:]
引用 6 楼 haiwer 的回复:
前两个语句,没有order by的top,返回的纪录是不确定的,这是你写法的问题造成的

NO,是确定的!
没有order by每次查询返回结果一致,无论top多少
[/Quote]
当发生 insert update 时,数据排序就可能会变化.
路人乙e 2010-12-29
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 feilniu 的回复:]
SELECT TOP 100 UserId FROM User
====
IX_UserID的Non-clustered Index Scan,扫出前100,按索引默认顺序输出。

SELECT TOP 100 UserId,Username FROM User
====
无聚集索引,则是Table Scan,扫出前100,按堆默认顺序输出。

SELECT TOP 100 UserId,Username FROM User ORDER BY Username
====
估计是IX_Username的Non-clustered Index Scan,扫出前100,再Table Lookup,找到对应UserId,强制按Username顺序输出。
[/Quote]
一点不错,是这样,但SQL堆的排序却是一大问题,到底怎么排序的呢?非插入,非更新,非索引
starseeker7 2010-12-28
  • 打赏
  • 举报
回复
再补充下
当你再删除索引- -
查询结果又回复原来效果
select top 100 id,col1 from t2
效果又于select top 100 * from t2相同
看来应该是若查询中只包含索引列,,,就会按索引列走
若不完全是索引列,,就是默认吧
starseeker7 2010-12-28
  • 打赏
  • 举报
回复
初步测试8楼说得是正确的-w-
以下是测试数据- -


CREATE TABLE [dbo].[T2](
[id] [int] NULL,
[col1] [char](5) COLLATE Chinese_Taiwan_Bopomofo_CI_AS NULL,
[col2] [char](5) COLLATE Chinese_Taiwan_Bopomofo_CI_AS NULL
) ON [PRIMARY]

go

declare @i int
set @i=1
while (@i<5)
begin
insert t2
select @i,cast (@i as varchar)+'a',cast (@i as varchar)+'0b'
set @i=@i+1
end
go

insert t2
select 0,'0a','0b'

go


select top 100 * from t2
select top 100 id from t2
select top 100 id from t2 order by id

go


/*
id col1 col2
----------- ----- -----
1 1a 10b
2 2a 20b
3 3a 30b
4 4a 40b
0 0a 0b

(5 行受影响)

id
-----------
1
2
3
4
0

(5 行受影响)

id
-----------
0
1
2
3
4

(5 行受影响)
*/

create nonclustered
index IX_1 on t2(id asc)

select top 100 * from t2
select top 100 id from t2
select top 100 id from t2 order by id

/*
id col1 col2
----------- ------ ------
1 1a 10b
2 2a 20b
3 3a 30b
4 4a 40b
0 0a 0b

(5 行受影响)

id
-----------
0
1
2
3
4

(5 行受影响)

id
-----------
0
1
2
3
4

(5 行受影响)


*/


xyytuo 2010-12-28
  • 打赏
  • 举报
回复
王向飞 2010-12-28
  • 打赏
  • 举报
回复
需要你做两件事所花的时间肯定大于做一件事的时间,并且是分先后的。讨论此问题没意义
叶子 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 yhtapmys 的回复:]
江湖上还有邹老大的传说
[/Quote]
邹老大远离江湖了
yhtapmys 2010-12-28
  • 打赏
  • 举报
回复
江湖上还有邹老大的传说
lixiaocai123 2010-12-28
  • 打赏
  • 举报
回复
排序肯定花时间
billpu 2010-12-28
  • 打赏
  • 举报
回复
如果你不加order by 那表里至少定个聚集索引 决定你的物理排序
abuying 2010-12-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 coleling 的回复:]

引用楼主 sq_zhuyi 的回复:
这是怎么回事呢,SQL总得有一种默认排序方式吧,到底是怎么排的序


1.一个表在没有聚集索引的情况下,默认是按插入数据的先后来排序的(但Microsoft并不保证总是如此).
2.在存在索引覆盖时,SQL Server将只读取索引页,而不读取数据页,即在这种情况下,返回的是索引的顺序。

具体到你这里,
语句A: SELECT TOP 10……
[/Quote]
邹兄就是邹健大哥!
nzperfect 2010-12-28
  • 打赏
  • 举报
回复
你这样的用户表,应该有聚集索引。
另外,你的
SELECT TOP 100 UserId,Username FROM User ORDER BY Username
索引应该为:
create index ix_Username_userid on User(Username)include(Userid)
nzperfect 2010-12-28
  • 打赏
  • 举报
回复
排序本来就应该写order by ,不要指望sql的逻辑排序。
nzperfect 2010-12-28
  • 打赏
  • 举报
回复
select * from users 不需要排序
select * from users order by username 是需要排序的

时间当然不一样喽
加载更多回复(11)
内容概要:本文详细介绍了基于Simulink仿真实现的单相交流电压控制器,该控制器采用两个背靠背连接的晶闸管结构,用于实现对单相交流电压的精确调节。文中系统阐述了系统的建模过程、控制策略设计及仿真验证方法,重点分析了晶闸管触发角的控制原理及其对输出电压调节的影响。通过构建完整的Simulink仿真模型,全面展示了控制器在不同负载条件和输入电压波动下的动态响应特性与稳态性能,验证了该方案在交流调压应用中的有效性与可行性。; 适合人群:具备电力电子与电力系统基础知识,熟悉Simulink仿真环境,从事相关领域研究或工程应用的研发人员及高年级本科生、研究生。; 使用场景及目标:①用于电力电子课程教学,帮助学生深入理解晶闸管在交流调压中的工作机理;②为工业现场的交流电压调节设备提供仿真验证平台;③支持科研人员开展新型控制算法(如PID、模糊控制、触发角优化等)在交流电压控制器中的应用研究与性能对比; 阅读建议:建议读者结合提供的Simulink模型文件进行同步操作,重点关注晶闸管触发控制子系统的设计逻辑、触发角计算模块的实现方式以及仿真参数的配置,通过调整负载类型、电源电压和触发角等变量,深入探究系统在不同工况下的运行特性与控制效果。
内容概要:本文围绕电动汽车参与电力系统运行备用的能力评估展开研究,通过构建数学模型并利用Matlab进行仿真分析,系统探讨了电动汽车作为灵活性资源在不同场景下参与电网运行备用的潜力与可行性。研究内容涵盖电动汽车聚合商的调控架构设计、车辆充放电行为建模、备用容量评估方法、经济性分析等多个方面,并结合实际算例验证了所提模型与方法的有效性。仿真结果表明,规模化电动汽车可通过有序充放电参与电网调频、调峰等辅助服务,不仅提升了电力系统对新能源的消纳能力与运行灵活性,也为用户带来了可观的经济收益。研究成果为高比例可再生能源背景下移动储能资源的优化调度与市场化运营提供了理论依据和技术支撑。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事新能源并网、智能电网、电动汽车调度、需求响应及辅助服务市场等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①评估大规模电动汽车集群在多时间尺度下的可用备用容量;②构建基于Matlab的电动汽车参与运行备用的仿真模型;③分析电动汽车参与电网辅助服务的技术可行性与经济性;④支撑高比例新能源电力系统的灵活性提升与源荷互动优化研究。; 阅读建议:此资源以Matlab代码实现为核心,注重理论建模与仿真实践相结合,建议读者在学习过程中结合文中模型逐步调试代码,理解各模块功能,并可根据实际需求扩展至多时间尺度优化、车网互动(V2G)策略设计、不确定性建模等方向进行深入研究。
内容概要:本文研究了基于粒子群优化算法的面向配电网的多微电网协调运行与优化问题,并通过Matlab代码实现仿真与验证。在新型电力系统背景下,针对分布式能源高密度接入导致配电网呈现弱电网特征所带来的稳定性挑战,文章构建了多微电网与配电网互动的优化模型,采用粒子群优化(PSO)算法实现对功率平衡、运行成本、电能质量等多目标的协同优化。重点探讨了多微电网系统在经济调度、能量管理及协调控制方面的关键技术,通过仿真分析验证了该方法在提升系统经济性、增强运行稳定性与适应性方面的有效性与实用性。; 适合人群:具备一定电力系统基础知识和优化算法理解能力,从事新能源、微电网、智能配电网等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①学习粒子群优化算法在多微电网协调运行中的建模与应用方法;②实现面向配电网的微电网群经济调度与优化仿真;③深入理解高比例分布式能源接入下多微电网系统的协同控制策略与稳定性优化机制。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点关注优化模型的设计、粒子群算法的参数配置与收敛特性分析,同时可通过引入需求响应、储能协同控制等扩展因素深化对系统优化能力的理解与应用。

22,296

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧