T-SQL——关于将有序数据插入临时表
shanzm-2024年7月30日
0.背景
-
问题:需要将排序后的数据结果集插入到临时表中,少量数据发现没有任何问题,插入到临时表中的结果集保留了插入前的顺序。
但是当待插入的临时表的结果集数据量足够大,可以发现插入后,临时表中的数据并没有按照我们期待的那样,保留插入前的排序 -
原因:在SQL Server 2005/2008中,如果将有序的记录插入临时表,则从临时表查询出来的记录是有序的(不依赖ORDER BY也是有序状态),但是从SQL SERVER 2012开始,即使插入的记录集有序,查询出来的结果变成无序了。需要依赖ORDER BY来或得到一个有序结果
1. 解决方案1:使用ROW_NUMBER() OVER (ORDER BY…… )
DROP TABLE #result;
CREATE TABLE #result
(
RowID INT NULL,
Id INT NULL,
Name NVARCHAR(100) NULL,
);
INSERT INTO #result
SELECT ROW_NUMBER() OVER (ORDER BY b.CreatedTime DESC) RowID,--指定需要的排序方式
Id,
Name,
CreatedTime,
FROM
XXX_Table
2.解决方案2:给临时表创建聚集索引
CREATE TABLE #result
(
Id INT NOT NULL,
Name NVARCHAR(100) ,
CreateTime DATETIME
);
CREATE CLUSTERED INDEX IDX_#tables_CreateTime ON #result (CreateTime DESC);
INSERT INTO #result
SELECT Id,
Name,
CreatedTime
FROM XXX_Table
ORDER BY CreatedTime DESC;
SELECT *
FROM #result;