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

Jia*_*iah 0 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
Run Code Online (Sandbox Code Playgroud)

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

use*_*983 6

我将对此进行详细说明作为答案,但 Veljko89 和 tarheel 在他们对 OP 问题的评论中都一针见血。

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

唯一的(是的,这是正确的ONLY)的方式机制保障的结果集的顺序是(意料之中)使用ORDER BY条款。如果省略该子句,SQL Server 将按照它处理这些行的任何顺序返回这些行,这可能是任何顺序。对于小桌子,是的,您可能会得到相同的订单,如果您有一个CLUSTERED INDEXthen 可以提高这种可能性,但仅此而已,这是一种可能性。

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

因此,总而言之:添加一个ORDER BY子句(以便每列都有一个唯一的集合)以确保您的查询始终以相同的顺序返回数据。