问题,如题目所示环境:winXP SP3,数据库服务器是MSDE,数据库客户端microsoft SQL Server Manegement Studio2005
这些,都在我的机器上,只有我用我的机器,没有其他人连接我的数据库。
(我的环境都是日文环境,下面的叙述可能多少和中文环境有些语言上的出入,不理解的请问我)SQL文如下:
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
where dbo.POSTotalSectionSales.SalesDate = '2009/10/12'dbo.POSSectionMaster表里只有SectionCode和Name,共21G条数据,就是各个部门的名称,主KEY是SectionCode。
dbo.POSTotalSectionSales表里,有ShopCode,SalesDate,SalesHour,SectionCode,Name,Type,Count,Amount,
主KEY是(ShopCode,SalesDate,SalesHour,SectionCode,),表中有很多天的数据,
但是POSTotalSectionSales.ShopCode字段可以无视,因为这个字段的内容都是同一个商店CODE。现在分别执行两次这个SQL文,
第一次,设定查询条件SalesDate = '2009/10/12'
第二次,设定查询条件SalesDate = '2009/10/13'现象:第一次的查询结果,是乱序的,第二次的查询结果,是按照SectionCode排好序的,
看了看执行计划,这两次查询,不同的地方是,第一次有个Hash Match(aggregate),第二次有个Sort(Distinct Sort)
(其他的日期也反复的查询了几次,和第二次一个样,按照SectionCode排序的,执行计划里面也有个Sort或者Sort(Distinct Sort))
问题:
为什么同一条查询语句,只有查询的条件值不同,出的结果的排序会不同呢
这些,都在我的机器上,只有我用我的机器,没有其他人连接我的数据库。
(我的环境都是日文环境,下面的叙述可能多少和中文环境有些语言上的出入,不理解的请问我)SQL文如下:
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
where dbo.POSTotalSectionSales.SalesDate = '2009/10/12'dbo.POSSectionMaster表里只有SectionCode和Name,共21G条数据,就是各个部门的名称,主KEY是SectionCode。
dbo.POSTotalSectionSales表里,有ShopCode,SalesDate,SalesHour,SectionCode,Name,Type,Count,Amount,
主KEY是(ShopCode,SalesDate,SalesHour,SectionCode,),表中有很多天的数据,
但是POSTotalSectionSales.ShopCode字段可以无视,因为这个字段的内容都是同一个商店CODE。现在分别执行两次这个SQL文,
第一次,设定查询条件SalesDate = '2009/10/12'
第二次,设定查询条件SalesDate = '2009/10/13'现象:第一次的查询结果,是乱序的,第二次的查询结果,是按照SectionCode排好序的,
看了看执行计划,这两次查询,不同的地方是,第一次有个Hash Match(aggregate),第二次有个Sort(Distinct Sort)
(其他的日期也反复的查询了几次,和第二次一个样,按照SectionCode排序的,执行计划里面也有个Sort或者Sort(Distinct Sort))
问题:
为什么同一条查询语句,只有查询的条件值不同,出的结果的排序会不同呢
因为distinct会引起排序的。
那就很奇怪了
为什么那么多天的数据,单单10/12那天的数据特殊呢?实在想不明白。
数据是客户那里拿过来的。本身的物理逻辑------好象这么解释也不太让客户明白啊。
SectionCode Name
00000 利用料金
10001 物品
10002 たばこ
10003 食品
10004 飲料
10005 シャワールーム
10006 女性販売
20001 DVD
20002 PS2
略ShopCode SalesDate SalesHour SectionCode Name Type Count Amount
026 2009/10/12 2009/10/12 11:00 00000 利用料金 1 50 12800.0000
026 2009/10/12 2009/10/12 11:00 10003 食品 1 1 50.0000
026 2009/10/12 2009/10/12 12:00 00000 利用料金 1 47 18300.0000
026 2009/10/12 2009/10/12 12:00 10003 食品 1 4 630.0000
026 2009/10/12 2009/10/12 12:00 30002 ポイントカード割引 1 3 -2100.0000
026 2009/10/12 2009/10/12 12:00 30009 ビッグバン割引 1 1 -1000.0000
026 2009/10/12 2009/10/12 13:00 00000 利用料金 1 13 9300.0000
026 2009/10/12 2009/10/12 13:00 10002 たばこ 1 1 300.0000
026 2009/10/12 2009/10/12 13:00 10003 食品 1 1 300.0000
026 2009/10/12 2009/10/12 13:00 30002 ポイントカード割引 1 1 -700.0000
026 2009/10/12 2009/10/12 13:00 30003 ティッシュ割引 1 1 -100.0000
026 2009/10/12 2009/10/12 14:00 00000 利用料金 1 22 15100.0000
026 2009/10/12 2009/10/12 14:00 10002 たばこ 1 1 320.0000
026 2009/10/12 2009/10/12 14:00 10003 食品 1 3 400.0000
026 2009/10/12 2009/10/12 14:00 10005 シャワールーム 1 1 200.0000
026 2009/10/12 2009/10/12 14:00 30002 ポイントカード割引 1 1 -700.0000
026 2009/10/12 2009/10/12 15:00 00000 利用料金 1 48 15400.0000
026 2009/10/12 2009/10/12 15:00 10002 たばこ 1 1 320.0000
026 2009/10/12 2009/10/12 15:00 10003 食品 1 5 830.0000
026 2009/10/12 2009/10/12 15:00 30002 ポイントカード割引 1 1 -700.0000
026 2009/10/12 2009/10/12 16:00 00000 利用料金 1 41 12600.0000
026 2009/10/12 2009/10/12 16:00 10003 食品 1 2 240.0000
026 2009/10/12 2009/10/12 16:00 30002 ポイントカード割引 1 2 -400.0000
026 2009/10/12 2009/10/12 17:00 00000 利用料金 1 43 9800.0000
026 2009/10/12 2009/10/12 17:00 10003 食品 1 1 100.0000
026 2009/10/12 2009/10/12 17:00 30002 ポイントカード割引 1 1 -700.0000
026 2009/10/12 2009/10/12 18:00 00000 利用料金 1 77 10100.0000
026 2009/10/12 2009/10/12 18:00 30002 ポイントカード割引 1 1 -200.0000
026 2009/10/12 2009/10/12 19:00 00000 利用料金 1 39 4300.0000
026 2009/10/12 2009/10/12 19:00 10003 食品 1 4 710.0000
026 2009/10/12 2009/10/12 19:00 30002 ポイントカード割引 1 1 -700.0000
026 2009/10/12 2009/10/12 20:00 00000 利用料金 1 52 7300.0000
026 2009/10/12 2009/10/12 20:00 10003 食品 1 2 390.0000
026 2009/10/12 2009/10/12 21:00 00000 利用料金 1 36 8100.0000
026 2009/10/12 2009/10/12 21:00 10003 食品 1 1 180.0000
026 2009/10/12 2009/10/12 21:00 30002 ポイントカード割引 1 1 -700.0000
026 2009/10/12 2009/10/12 22:00 00000 利用料金 1 35 6400.0000
026 2009/10/12 2009/10/12 22:00 10002 たばこ 1 3 960.0000
026 2009/10/12 2009/10/12 22:00 10003 食品 1 6 860.0000
026 2009/10/12 2009/10/12 23:00 00000 利用料金 1 42 4800.0000
026 2009/10/12 2009/10/12 23:00 10003 食品 1 1 180.0000
026 2009/10/12 2009/10/13 00:00 00000 利用料金 1 16 1900.0000
026 2009/10/12 2009/10/13 00:00 10003 食品 1 2 410.0000
026 2009/10/12 2009/10/13 01:00 00000 利用料金 1 40 4600.0000
026 2009/10/12 2009/10/13 01:00 10003 食品 1 1 150.0000
026 2009/10/12 2009/10/13 02:00 00000 利用料金 1 3 3600.0000
026 2009/10/12 2009/10/13 02:00 10001 物品 1 1 30.0000
026 2009/10/12 2009/10/13 02:00 10003 食品 1 1 200.0000
026 2009/10/12 2009/10/13 03:00 00000 利用料金 1 2 3200.0000
026 2009/10/12 2009/10/13 03:00 10003 食品 1 1 170.0000
026 2009/10/12 2009/10/13 04:00 00000 利用料金 1 14 2400.0000
026 2009/10/12 2009/10/13 04:00 10003 食品 1 1 100.0000
026 2009/10/12 2009/10/13 05:00 00000 利用料金 1 18 5700.0000
026 2009/10/12 2009/10/13 05:00 10002 たばこ 1 1 300.0000
026 2009/10/12 2009/10/13 05:00 10003 食品 1 1 120.0000
026 2009/10/12 2009/10/13 06:00 00000 利用料金 1 18 7500.0000
026 2009/10/12 2009/10/13 07:00 00000 利用料金 1 12 1500.0000
026 2009/10/12 2009/10/13 08:00 00000 利用料金 1 67 14500.0000
026 2009/10/12 2009/10/13 08:00 10005 シャワールーム 1 1 200.0000
026 2009/10/12 2009/10/13 09:00 00000 利用料金 1 48 12200.0000
026 2009/10/12 2009/10/13 09:00 10001 物品 1 5 525.0000
026 2009/10/12 2009/10/13 09:00 10002 たばこ 1 2 620.0000
026 2009/10/12 2009/10/13 09:00 10005 シャワールーム 1 1 200.0000
026 2009/10/12 2009/10/13 09:00 30002 ポイントカード割引 1 1 -700.0000
026 2009/10/12 2009/10/13 10:00 00000 利用料金 1 59 9500.0000
026 2009/10/13 2009/10/13 11:00 00000 利用料金 1 35 7900.0000
026 2009/10/13 2009/10/13 11:00 10003 食品 1 2 330.0000
026 2009/10/13 2009/10/13 12:00 00000 利用料金 1 32 11900.0000
026 2009/10/13 2009/10/13 12:00 10003 食品 1 1 120.0000
026 2009/10/13 2009/10/13 12:00 30003 ティッシュ割引 1 2 -200.0000
026 2009/10/13 2009/10/13 13:00 00000 利用料金 1 51 11100.0000
026 2009/10/13 2009/10/13 13:00 10001 物品 1 1 100.0000
026 2009/10/13 2009/10/13 13:00 10003 食品 1 1 110.0000
026 2009/10/13 2009/10/13 13:00 30002 ポイントカード割引 1 1 -700.0000
026 2009/10/13 2009/10/13 14:00 00000 利用料金 1 46 11500.0000
026 2009/10/13 2009/10/13 14:00 10002 たばこ 1 2 600.0000
026 2009/10/13 2009/10/13 14:00 10003 食品 1 4 860.0000
026 2009/10/13 2009/10/13 15:00 00000 利用料金 1 132 19200.0000
026 2009/10/13 2009/10/13 15:00 10001 物品 1 3 90.0000
026 2009/10/13 2009/10/13 15:00 10002 たばこ 1 1 300.0000
026 2009/10/13 2009/10/13 15:00 10003 食品 1 4 460.0000
026 2009/10/13 2009/10/13 15:00 30002 ポイントカード割引 1 1 -700.0000
026 2009/10/13 2009/10/13 16:00 00000 利用料金 1 64 7500.0000
026 2009/10/13 2009/10/13 16:00 10002 たばこ 1 1 320.0000
026 2009/10/13 2009/10/13 17:00 00000 利用料金 1 80 11000.0000
026 2009/10/13 2009/10/13 17:00 10002 たばこ 1 1 320.0000
026 2009/10/13 2009/10/13 17:00 10003 食品 1 3 520.0000
026 2009/10/13 2009/10/13 18:00 00000 利用料金 1 67 11600.0000
026 2009/10/13 2009/10/13 18:00 10002 たばこ 1 2 620.0000
026 2009/10/13 2009/10/13 19:00 00000 利用料金 1 67 13600.0000
026 2009/10/13 2009/10/13 19:00 30002 ポイントカード割引 1 1 -700.0000
026 2009/10/13 2009/10/13 20:00 00000 利用料金 1 39 6400.0000
026 2009/10/13 2009/10/13 20:00 10001 物品 1 10 300.0000
026 2009/10/13 2009/10/13 20:00 10002 たばこ 1 2 620.0000
026 2009/10/13 2009/10/13 20:00 10003 食品 1 3 440.0000
026 2009/10/13 2009/10/13 21:00 00000 利用料金 1 35 9600.0000
026 2009/10/13 2009/10/13 22:00 00000 利用料金 1 89 11100.0000
026 2009/10/13 2009/10/13 22:00 10003 食品 1 6 640.0000
026 2009/10/13 2009/10/13 22:00 30002 ポイントカード割引 1 2 -900.0000
026 2009/10/13 2009/10/13 22:00 30009 ビッグバン割引 1 1 -400.0000
026 2009/10/13 2009/10/13 23:00 00000 利用料金 1 44 5200.0000
026 2009/10/13 2009/10/13 23:00 10002 たばこ 1 1 320.0000
026 2009/10/13 2009/10/13 23:00 10003 食品 1 2 200.0000
026 2009/10/13 2009/10/14 00:00 00000 利用料金 1 63 7900.0000
026 2009/10/13 2009/10/14 00:00 10003 食品 1 2 370.0000
026 2009/10/13 2009/10/14 00:00 10004 飲料 1 1 100.0000
026 2009/10/13 2009/10/14 01:00 00000 利用料金 1 19 4100.0000
026 2009/10/13 2009/10/14 02:00 00000 利用料金 1 27 6900.0000
026 2009/10/13 2009/10/14 02:00 30002 ポイントカード割引 1 1 -700.0000
026 2009/10/13 2009/10/14 03:00 00000 利用料金 1 4 5800.0000
026 2009/10/13 2009/10/14 03:00 10003 食品 1 4 620.0000
026 2009/10/13 2009/10/14 04:00 00000 利用料金 1 3 400.0000
026 2009/10/13 2009/10/14 04:00 10003 食品 1 2 270.0000
026 2009/10/13 2009/10/14 05:00 00000 利用料金 1 36 5200.0000
026 2009/10/13 2009/10/14 05:00 30002 ポイントカード割引 1 1 -700.0000
026 2009/10/13 2009/10/14 06:00 00000 利用料金 1 18 7600.0000
026 2009/10/13 2009/10/14 06:00 30002 ポイントカード割引 1 1 -700.0000
026 2009/10/13 2009/10/14 07:00 00000 利用料金 1 28 11800.0000
026 2009/10/13 2009/10/14 07:00 10005 シャワールーム 1 1 200.0000
026 2009/10/13 2009/10/14 08:00 00000 利用料金 1 63 16000.0000
026 2009/10/13 2009/10/14 08:00 10005 シャワールーム 1 1 200.0000
026 2009/10/13 2009/10/14 09:00 00000 利用料金 1 33 9500.0000
026 2009/10/13 2009/10/14 09:00 30002 ポイントカード割引 1 1 -700.0000
026 2009/10/13 2009/10/14 10:00 00000 利用料金 1 44 10400.0000
026 2009/10/13 2009/10/14 10:00 10002 たばこ 1 1 300.0000
026 2009/10/13 2009/10/14 10:00 10003 食品 1 1 120.0000
026 2009/10/13 2009/10/14 10:00 30002 ポイントカード割引 1 1 -700.0000
026 2009/10/13 2009/10/14 11:00 00000 利用料金 1 2 2600.0000
不过还是无法解释,为什么这么多天的数据没事儿,只有那一天的数据特殊呢
麻烦你你给我解释一下吧,我自己都说服不了自己。
那个帖子,让我懂得,没有order by的情况下,SQLServer会按照
其他方式(索引,主键,数据库排序规则)排序。 但是,在同一个数据据,同一个条件下,为什么出现了不同的结果呢
> 你是哪儿的呀 怎么叫sql文呢
呵呵,你叫什么。我一直叫个东西,我是做对日开发的。汉语叫SQL语句对吗
排序规则,我觉得不应该从这里考虑阿,为什么同一个规则,出不同顺序的数据阿
我把数据贴出来的,你帮忙分析一下。to 大家
如果我把dbo.POSTotalSectionSales表的数据export出来,再把这表清空,再把刚才导出的数据
导入,就没有这个问题了
> 先去掉distinct看看结果怎样?
> 因为distinct会引起排序的。
谢谢你回答我的问题。
我试了试,去掉了后
12号那天的数据是
SELECT
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
where dbo.POSTotalSectionSales.SalesDate = '2009/10/12'026 2009/10/13 00000 利用料金 0
026 2009/10/13 00000 利用料金 0
026 2009/10/13 00000 利用料金 0
.
.
.
026 2009/10/13 10001 物品 1
026 2009/10/13 10001 物品 1
.
.
.
026 2009/10/13 10002 たばこ 1
026 2009/10/13 10002 たばこ 1 13号那天的数据是
SELECT
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
where dbo.POSTotalSectionSales.SalesDate = '2009/10/13'026 2009/10/18 00000 利用料金
026 2009/10/18 10001 物品
026 2009/10/18 10002 たばこ
.
.
.
026 2009/10/18 00000 利用料金
026 2009/10/18 10001 物品
026 2009/10/18 10002 たばこ
.
.
.
在多表连接时,结果集顺序并不确定,sqlserver依具具体的情况来确定采用的连接方式(算法),不同的连接算法,导至结果集顺序会有差异。
> 我的解释为:你第一次查询后这个表的记录就按照顺序存在内存里面了
> 不相信你把数据库重新启动一下试试
你好,按照你的意思,我第一次查询后(10/12),这个表的记录就按照顺序存在
内存里了,那么第二次查询(10/13 ),就应该按照刚才存在内存的顺序查询了。
可是,第二次查询,是不同的顺序啊。
可能是不是我理解错你的意思了?!
我重新启动了数据库好几次,分不同的顺序测试了这2个SQL,和先执行后执行没有关系
乱序的还是乱序,有序的还是有序。
我发现,DB里,
2009/10/13以后的数据可以有序的表示出来
2009/10/12以前的数据,按照相同的顺序,也就是说,10/12和10/11,10/10等等,
这几天的表示顺序相同,乱序的表示出来 难道我看到的乱序,也是一种顺序?只不过我看不出是按照什么顺序排序的。
没有order by 的查询,结果从理论上讲顺序是不一定的,他会按物理上最先访问的到的顺序排,你看的乱序也是正常的
> 没有order by 的查询,结果从理论上讲顺序是不一定的,
> 他会按物理上最先访问的到的顺序排,你看的乱序也是正常的
有没有办法看一下某一条数据的物理位置。
oracle里面不是有个rowID吗?SQLServer里面有没有类似的属性之类的啊
如何才能看到,某一条数据所在的页数。
比如,写一个SQL,可以看到每一条数据所在的页数。我要确认一下。
好像有个RID,可以表示哪一行。不过还不会使用呢 是不是按照 Page:RID这样的形式表示每一条的数据物理位置的啊 继续调查中,请大家帮忙。
> SQL Server即可以使用Aggregate的方法消除重复,也可以使用Sort後再消除重复.
你好,那个东西我都不懂,查了查,好像是做成集合的方式。 你说的很有道理,就是消除重复的方式。
我以为,Sort(Distinct Sort) ,就是进行了排序,Aggregate,没有进行排序。
但是,同一个数据库,同一个表,同一条SQL,为什么会有着两种排序的方式呢。
毫不夸张的说,同一条sql语句会有成千上万个不同的执行计划可供选择。sql server基於成本去选择执行计划, 而不同的条件就会导至成本上的差异。你要想都要排序就加上order by
你要想都不排序就加上option(hash group), 总之要给1个确切的指令给sqlserver。
谢谢啊!!!
如果我要察看数据库A,表B的物理结构的话,怎么写SQL啊? dbcc page ('A', 1, 115, 3) WITH TABLERESULTS
5年了,中文都快说的不利落了
大家常说的SQL语句,我们都说SQL文,呵呵
当然,除了添加 order by语句这个办法。
有没有这样的SQL啊
但是,目前的情况是,这个系统运行了3年多了,在没写order by 的前提下
还没有听说出现乱序的问题。现在就是要弄清楚,为什么!!!
还没有听说出现乱序的问题。每天都要打印一次帐票,一般是正常排序,怎么突然有一天打印的时候,成了乱序了?天长日久,以前的数据就不是正常排序了,现在就是要弄清楚是什么改变了以前数据的存储顺序