代码之家  ›  专栏  ›  技术社区  ›  Jiah

同一查询产生不同结果[重复]

  •  0
  • Jiah  · 技术社区  · 7 年前

    以下是我的疑问:

    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
    

    这是一个非常直截了当的问题。但是,每次运行select*from#temp时,它都会生成不同的结果集,但总行数是相同的。这是怎么回事?

    1 回复  |  直到 7 年前
        1
  •  6
  •   Thom A    5 年前

    我将对此进行详细阐述,作为回答,但Veljko89和tarheel对OP问题的评论都一针见血。

    SQL Server中的数据存储在 无序的 堆。无论您的订单是什么 INSERT 数据,无论您是否有 CLUSTERED INDEX 或不执行,执行 SELECT 不带 ORDER BY 没有保证的秩序。时期

    唯一的(是的,没错 仅限 )确保结果集顺序的方法是(毫不奇怪地)使用 订购人 条款如果省略该子句,SQL Server将以其处理这些行的任何顺序返回这些行,可以是任何顺序。对于小桌子,是的,您可能会得到相同的订单,如果您有 聚集索引 这就提高了这种可能性,但这只是一种可能性。

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

    综上所述: 添加 订购人 子句(以便每个列都有一个唯一的集),以确保您的查询 总是 以相同的顺序返回数据。