1
set statistics time on;
DECLARE @sort_order varchar(10)
DECLARE @order_by varchar(10)
set @sort_order = 'DESC'; 
set @order_by = 'lastmodified';
WITH results AS
(
    SELECT id, title, LastModified, ROW_NUMBER() over
    (ORDER BY 
        CASE @sort_order
          WHEN 'ASC' THEN
               CASE @order_by
                    WHEN 'lastmodified' THEN CAST(LastModified AS VARCHAR(50))
                    WHEN 'title' THEN title
                    ELSE CAST(LastModified AS VARCHAR(50))
               END
          ELSE '1'
     END ASC,
     CASE @sort_order
          WHEN 'DESC' THEN
               CASE @order_by
                    WHEN 'lastmodified' THEN CAST(LastModified AS VARCHAR(50))
                    WHEN 'title' THEN title
                    ELSE CAST(LastModified AS VARCHAR(50))
               END
          ELSE '1'
     END DESC) RowNum

    FROM dbo.EmploymentOpportunities
    where CompanyId = 148

)
SELECT id, title, LastModified, (select count(*) from results) totalcount
FROM results
where RowNum between 1 and 9 OPTION(Maxdop 8)
4

1 回答 1

3

好吧,您的外部查询没有ORDER BY. 如果您添加一个,它将更加可预测。例如

...
WHERE RowNum BETWEEN 1 and 9
ORDER BY id 
OPTION (MAXDOP 8);

如果您没有ORDER BY,SQL Server 可以自由地以它认为最有效的任何顺序返回结果。在很多情况下,这种行为将是一致且可预测的(这与保证不同);但是,它可以根据多种因素在查询执行之间发生变化 - 数据倾斜、统计信息更改、计划缓存刷新、缓冲池刷新、过期计划、服务重启、服务包、累积更新、升级、故障转移等。等等

当涉及并行时,它的可靠性要低得多,因为不同的线程可能正在处理数据的不同部分,并在不同的时间完成。由于您没有ORDER BY,SQL Server 只是在线程完成时重新组装数据,并且不会以任何方式重新排序,因为您没有说您关心。

如果您想要某个订单,请始终在外部查询中使用 ORDER BY。时期。

于 2013-10-24T13:51:53.400 回答