SQLSERVER 没有指定order by,查询视图view时,默认下是根据什么排序的啊

CreatBird 2009-10-21 10:05:41
数据库是MSDE,用C++写的代码
查询对象是下面的视图View

USE [MyDatabase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE VIEW [dbo].[V_POSTotalRepSectionSales]
AS
SELECT dbo.V_POSTotalRepSectionHeader.ShopCode,
dbo.V_POSTotalRepSectionHeader.SalesDate,
dbo.V_POSTotalRepSectionHeader.SectionCode,
dbo.V_POSTotalRepSectionHeader.Name,
dbo.V_POSTotalRepSectionHeader.Type,
ISNULL(SUM(dbo.POSTotalSectionSales.[Count]), 0) AS [Count],
ISNULL(SUM(dbo.POSTotalSectionSales.Amount), 0) AS Amount

FROM dbo.POSTotalSectionSales RIGHT OUTER JOIN
dbo.V_POSTotalRepSectionHeader ON
dbo.POSTotalSectionSales.SectionCode = dbo.V_POSTotalRepSectionHeader.SectionCode
AND
dbo.POSTotalSectionSales.SalesDate = dbo.V_POSTotalRepSectionHeader.SalesDate
AND
dbo.POSTotalSectionSales.ShopCode = dbo.V_POSTotalRepSectionHeader.ShopCode

GROUP BY dbo.V_POSTotalRepSectionHeader.ShopCode,
dbo.V_POSTotalRepSectionHeader.SalesDate,
dbo.V_POSTotalRepSectionHeader.SectionCode,
dbo.V_POSTotalRepSectionHeader.Name,
dbo.V_POSTotalRepSectionHeader.Type

查询SQL是下面的语句(没有指定order by)
SELECT
ShopCode,SalesDate,Type,SectionCode,Name,Count,Amount
FROM dbo.V_POSTotalRepSectionSales
WHERE SalesDate = '2009/07/01'

注释:表中,都是一个店铺的数据,任何一天的数据,前面的ShopCode都是相同的,
Type是SectionCode的第一位数字(字符类型),
问题:一般情况下,查询的时候,出来的结果是按照SectionCode排序的,
但是,有时候,查出来的结果是乱序的,请告诉我,在未指定order by的时候,
是根据什么字段或什么数据排序的啊?

*************************参考视图V_POSTotalRepSectionHeader********************************

USE [MyDatabase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE VIEW [dbo].[V_POSTotalRepSectionHeader]
AS
SELECT DISTINCT
dbo.POSTotalSectionSales.ShopCode, dbo.POSTotalSectionSales.SalesDate,
dbo.POSSectionMaster.SectionCode, dbo.POSSectionMaster.Name,
SUBSTRING(dbo.POSSectionMaster.SectionCode, 1, 1) AS Type
FROM dbo.POSSectionMaster CROSS JOIN
dbo.POSTotalSectionSales
...全文
1377 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
xman_78tom 2009-10-22
  • 打赏
  • 举报
回复
我的意思就是说工作线程从不同的位置开始扫描表会造成结果集顺序的不同。
fwacky 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 creatbird 的回复:]
to fwacky

> 有索引就索引排,没有的话,按照物理存储来排.
  你说的物理存储,是不是说按照数据登陆的先后顺序排序啊
[/Quote]

====================
就是 按照,“打开表”看到的那个顺序!
CreatBird 2009-10-22
  • 打赏
  • 举报
回复
to 各位大虾

我一个哥们儿,找到了一个有关未指定order by 的时候,查询没有保障的连接,大家看看,
说说各位的感想。


没有安全带—期待用 ORDER BY 排序
http://www.cftea.com/c/2009/04/YZNSRK1DWLTRR8GE.asp

引用作者:
“我今天的建议是:如果你需要查询结果有序,使用 ORDER BY,它挺简单的。否则的话,就像是没有系安全带驾驶一辆汽车。”
CreatBird 2009-10-22
  • 打赏
  • 举报
回复
to xman_78tom
我现在要的是解释,就是说,为什么在没有指定order by 的时候,
通常,出正确结果,偶尔出乱序的结果???
刚开始,感觉和数据有关,但是昨天,把客户的数据拿过来一测试,没有出乱序。

你回答的内容好象和我的问题没有关系吧?!还是我没有理解你的意思啊?
xman_78tom 2009-10-22
  • 打赏
  • 举报
回复
旋转木马(merry-go-round)扫描,旋转木马扫描是 SQL SERVER 2000 企业版针对非顺序扫描的优化算法。当有两个线程在同时扫描一张表时,在不使用此算法的情况下,第一个线程对表进行扫描并进行到 20% 时,另一个线程将从头开始扫描该表,如果缓冲区空闲页面较少,则会出现第一个线程读取过的页面在第二个线程读取前被释放,以至第二个线程需要重新将页面读入缓冲区,从而增加了磁盘 I/O,严重时可能会导致性能急剧下降。而使用此算法,第二个线程会从第一个线程的当前位置开始扫描,当第一个线程结束后再开始扫描剩下的,这样对相同的数据页两个线程只会从磁盘中读取一次。
CreatBird 2009-10-22
  • 打赏
  • 举报
回复
谢谢大家的回复,我学习了好多知识。
结贴
xman_78tom 2009-10-21
  • 打赏
  • 举报
回复
该说都说了。但是还有一点,如果 select 语句中有 group by 子句,返回的结果集会根据使用的 group 算法来显示。

ORDER GROUP 算法,在处理 GROUP BY 操作时先进行排序,再从已排序的数据中进行分组,此时返回的分组结果将是排序顺序。
HASH GROUP 算法,在处理 GROUP BY 操作时将数据按分组的条件组织到哈希表中,哈希桶中存放的即是分组结果,此时返回的分组结果将是数据在哈希桶中的存放顺序。
SQL77 2009-10-21
  • 打赏
  • 举报
回复
CREATE TABLE A( ID INT,NUM INT)
INSERT A SELECT 1,2 UNION ALL SELECT 2,1


CREATE TABLE B( ID INT)
INSERT B SELECT 2 UNION ALL SELECT 1 UNION ALL SELECT 3



SELECT A.ID,A.NUM ,B.ID AS BID FROM A,B WHERE A.ID=B.ID
/*
ID NUM BID
----------- ----------- -----------
2 1 2
1 2 1

(所影响的行数为 2 行)

*/


CREATE VIEW AB_VIEW
AS
SELECT A.ID,A.NUM ,B.ID AS BID FROM A,B WHERE A.ID=B.ID


SELECT * FROM AB_VIEW
/*
ID NUM BID
----------- ----------- -----------
2 1 2
1 2 1

(所影响的行数为 2 行)

*/

--DROP TABLE A,B
--DROP VIEW AB_VIEW


应该是你查询时的顺序呀
sdhdy 2009-10-21
  • 打赏
  • 举报
回复
不指定的话,是按照缺省顺序排列的。
--小F-- 2009-10-21
  • 打赏
  • 举报
回复
3楼你的理解是正确的
--小F-- 2009-10-21
  • 打赏
  • 举报
回复
2005的话是这样看
对象资源管理器---(选中服务器名\实例名)右键---属性---服务器属性 就可以看见了
dawugui 2009-10-21
  • 打赏
  • 举报
回复
既然这样,你不如指定一个排序.
CreatBird 2009-10-21
  • 打赏
  • 举报
回复
感谢各位的回复

to fredrickhu
> 按照字段的ASII码来排序的 不过要看你指定的排序规则是怎么样的才知道
怎么看我指定的排序规则啊
to dawugui,navy887
> 有索引就索引排,没有的话,按照物理存储来排.
我没有看到关于V_POSTotalRepSectionSales视图的CREATE INDEX 语句啊
是不是没有索引啊?
如果是按照物理存储的话,怎么来确认啊,我需要给客户解释清楚啊
你说的物理存储是不是,像orcal的rowID之类的字段啊?

to fredrickhu
> 比如汉字 默认的情况下就是按照拼音的首字母来排序
> 数字 就是按照1,2,3,4。。。这样排的
> 都是升序
如果是char类型的话,10001,30001,20003,10002,这样的数据排序的话,
10001,10002,20003,30001,是不是这样的顺序阿?

to js_szy
> 没有order by 的好像是随机的
现在看来,一般情况下是按照SectionCode排序的,
但是,个别时候,是随机的
这个系统用了3年多了,只是偶尔出现这个问题,并不是每次都是随机。

to SQL77
> 是按你从表中提取出来的顺序吧
从表中提取出来的时候,也没有看到order by,是不是按照表的主键排序的啊?
navy887 2009-10-21
  • 打赏
  • 举报
回复
数据存储的基本单位是页,没有索引的话,查询的时候是按照物理数据页来读取。
xiequan2 2009-10-21
  • 打赏
  • 举报
回复
有索引就索引就按索引,没有的话,按照物理上优先访问到的顺序;
SQL77 2009-10-21
  • 打赏
  • 举报
回复
是按你从表中提取出来的顺序吧,
华夏小卒 2009-10-21
  • 打赏
  • 举报
回复
没有order by 的好像是随机的
--小F-- 2009-10-21
  • 打赏
  • 举报
回复
比如汉字 默认的情况下就是按照拼音的首字母来排序
数字 就是按照1,2,3,4。。。这样排的
都是升序
dawugui 2009-10-21
  • 打赏
  • 举报
回复
有索引就索引排,没有的话,按照物理存储来排.
--小F-- 2009-10-21
  • 打赏
  • 举报
回复
按照字段的ASII码来排序的 不过要看你指定的排序规则是怎么样的才知道
加载更多回复(8)

22,210

社区成员

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

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