前1名未订购

时间:2015-08-05 16:51:18

标签: sql-server tsql

我遇到了查询结果的问题。结果在实时环境和测试环境中并不相同。

表A

id, name
1,ValueA1

表B

Id, name
1,ValueB1
2,ValueB2
3,ValueB3
4,ValueB4

在测试环境中,结果为ValueB1,在实时环境中为ValueB2

经过快速调查后,我发现问题在于该程序使用top 1而没有一起订购。好的,对于每个人来说,如果我们使用前1,我们必须添加order by子句,这一点很清楚。

但我试图向非技术人员解释这个问题。

所以我写了一个带有1 000 000次迭代的简单while循环。我明确了执行计划:

DBCC FREEPROCCACHE

sp_recompile 'ProcedureName'

然后我正在执行程序。

不幸的是结果总是一样的。在这两种环境中。 (在测试中:ValueB1,在live:ValueB2上)

我尝试更改调用过程以仅复制过程的内容。 结果仍然与之前的情况完全相同。

我尝试用top 1编写一个非常简单的连接查询而不进行排序。两个服务器上的时间相同的结果:所有1M次迭代中的ValueB1。

db过程非常复杂,它使用CTE并且多次连接到表B.

我非常沮丧,因为我没有设法向非技术人员展示问题。

任何人都可以解释我做错了什么或应该怎么做?

1 个答案:

答案 0 :(得分:0)

你不能。

如果您没有指定order by子句,则引擎可以自由地将结果发送给您。

在实践中,这主要意味着它按聚集索引排序,但它不一定是!