Sql order by并选择最高执行顺序

时间:2015-10-19 16:04:24

标签: sql sql-server select sql-order-by

我有以下查询返回基于两个值的记录间隔

SELECT TOP 3 
    a.* 
FROM 
    (SELECT TOP 5 
         ID, Name, CountryCode 
     FROM city 
     ORDER BY ID) a 
ORDER BY  
     ID desc

结果:

ID  Name                                CountryCode
5   Amsterdam                           NLD
4   Mazar-e-Sharif                      AFG
3   Herat                               AFG

这是来自城市表的日期:

ID  Name                            CountryCode
1   Kabul                               AFG
2   Qandahar                            AFG
3   Herat                               AFG
4   Mazar-e-Sharif                      AFG
5   Amsterdam                           NLD
6   Rotterdam                           NLD
7   Haag                                NLD
8   Utrecht                             NLD
9   Eindhoven                           NLD
10  Tilburg                             NLD
11  Groningen                           NLD
.   .                                   .
.   .                                   .
4076    Hebron                          PSE
4077    Jabaliya                        PSE
4078    Nablus                          PSE
4079    Rafah                           PSE

但是当我从子查询中删除顺序时,我得到了不同的结果:

SELECT TOP 3 
    a.* 
FROM 
    (SELECT TOP 5 
         ID, Name, CountryCode 
     FROM city) a 
ORDER BY 
     ID asc

结果:

ID      Name                                CountryCode
4079    Rafah                               PSE
4078    Nablus                              PSE
4077    Jabaliya                            PSE

问题出在哪里?

1 个答案:

答案 0 :(得分:1)

顺序将在select top指令之前发生。因此,在您给出的示例中,它将按ID排序,然后选择前5个记录。这是一个子查询,因此外部查询将按ID降序排列这5条记录,然后选择前3条。

当您在子查询中删除订单时,前5个指令将只返回它遇到的前5个记录。这可能会受到聚集索引的影响,如果表中有一个聚合索引,那么如果ID是聚类的,它可能会给出相同的结果,但如果它是其他类似创建日期的东西会影响订单结果返回。请注意,即使考虑聚集索引,也无法保证订单无法保证。查询并行性也可能发挥作用。

基本上,检查表上的聚集索引,因为这可能表示订单但不能保证。希望这是有道理的。