相同的查询产生不同的结果

时间:2018-01-26 15:47:16

标签: sql sql-server ssms

以下是我的询问:

CREATE TABLE #TEMP(CID INT,PID INT,STAT VARCHAR(20),TIN DATETIME, TOUT DATETIME)

INSERT INTO #TEMP(CID,STAT,PID,TIN,TOUT)
    SELECT DISTINCT CID,STST,PID,TIN,TOUT 
    FROM CVTBL
    WHERE STAT = 'YES' 
    AND PID = '12' 
    ORDER BY CID DESC;

select * from #temp

drop table #temp

这是一个非常直接的查询。但是每当我从#temp运行select *时,它产生不同的结果集,但总行数是相同的。这有什么作用?

1 个答案:

答案 0 :(得分:3)

我将详细阐述这个问题作为答案,但Veljko89和tarheel在他们对OP的问题所作的评论中已经敲定了头部。

SQL Server中的数据存储在无序 HEAPS中。无论您INSERT数据的顺序如何,无论您是否有CLUSTERED INDEX,在没有SELECT的情况下执行ORDER BY语句都没有保证订单。周期。

唯一(肯定是 ONLY )保证结果集顺序的方法是(不出所料)使用ORDER BY子句。如果省略该子句,SQL Server将以处理该行的任何顺序返回行,这些行可以是任何顺序。对于小型表,是的,您可能会得到相同的订单,如果您有CLUSTERED INDEX那么可以提高这种可能性,但就是这样,这是可能的。

一旦你进入更大的表,并开始引入处理信息的多个核心,那么订单将变得越来越随机化;与较大的数据集一样,首先读取的数据更可能发生变化,并且对于多个核心,可能首先完成对其数据的处理,但是,表格中的数据来自“进一步”。

因此,总结:添加ORDER BY子句以确保您的查询始终以相同的顺序返回数据。