Sql 使用UNION ALL时按顺序-利用索引?

Sql 使用UNION ALL时按顺序-利用索引?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我在MSSQL中有两个相当大的模式相同的表(1亿条以上的记录),我需要创建一个SP,该SP使用下面定义的查询返回联合结果集。 在某些情况下,结果可能只是几条记录,而在其他情况下,可能是数百万条记录,具体取决于SP的输入 我还需要根据“S”值对其进行排序,这是一个类似Guid的值,即非顺序值 单独从一个表加载(即不使用UNION ALL)时,排序可以有效地利用索引和排序,但UNION ALL如何影响排序 使用这些值的客户端应用程序希望有一个数据流,即,我们不希望等待所有记录被读取/加载,以便能够返

我在MSSQL中有两个相当大的模式相同的表(1亿条以上的记录),我需要创建一个SP,该SP使用下面定义的查询返回联合结果集。 在某些情况下,结果可能只是几条记录,而在其他情况下,可能是数百万条记录,具体取决于SP的输入

我还需要根据“S”值对其进行排序,这是一个类似Guid的值,即非顺序值

单独从一个表加载(即不使用UNION ALL)时,排序可以有效地利用索引和排序,但UNION ALL如何影响排序

使用这些值的客户端应用程序希望有一个数据流,即,我们不希望等待所有记录被读取/加载,以便能够返回第一组“S”匹配

我无法通过操作验证此订单是否可以利用索引

我试图阅读查询计划,但未能围绕这一点进行解释。 有什么想法或其他建议吗

这是一个遗留应用程序,因此此时不可能对架构进行大型模式/数据更改或其他重大的重新设计

根据以下答案更新信息:

通过改变

FROM 
    [dbo].[data_archive] AS P
    INNER JOIN #distinctMatches AS C ON P.[s] = C.[s]
ORDER BY [sortValue]


我能够得到一个合并连接而不是连接。(请参阅下面的答案)。

您说过“当单独从一个表加载时(即不使用UNION ALL),排序可以利用索引并有效地进行排序”,因此表上有一个主键列为S的主键,或者至少有一个包含主键列为S的覆盖索引,这两个表都是如此。这意味着您查询中的所有联接都是合并联接(与临时表的联接也在排序列上),因此在计划中不会有任何额外的排序

注意,列名/表只是场景的示例名称,即不称为a、b、c等。您是否知道您只对第二个结果集进行排序?您必须执行一个子查询,如SELECT*FROM(SELECT…union SELECT…)order by。。。在这种情况下,将不使用索引。sql server中有几种排序算法,可以在查询计划中看到。我建议你读一读这些。@PawełKucharski这实际上是不正确的,使用UNION所有的ORDER BY都适用于完整的集合,而不仅仅是最后一个集合。我会研究排序算法,谢谢。你说得对,对不起。此外,查询执行计划在有子查询和没有子查询时是相同的。我在聚集索引列上使用ORDERBY运行UNIONALL查询,这导致ORDERBY操作中的合并联接,这是一种非常有效的算法。希望你的情况也能如此。一项基本技能:学会获取和阅读。每个SQL dbms都有一种或多种方法来实现这一点。我们有包含排序列的索引,据我所知,只要查询优化器知道找到了第一组“S”匹配项,就应该能够开始进行键查找。就像这里描述的:例如,排序操作甚至没有显示在查询计划中,但我不知道如何使用UNION ALLNo实现这一点,仅仅在索引中使用SORT colunm是不够的。它应该是索引的前导列,如果不是,它将是计划中的排序运算符。你是对的,这就是我的实际意思,谢谢你的解释。
FROM 
    [dbo].[data_archive] AS P
    INNER JOIN #distinctMatches AS C ON P.[s] = C.[s]
ORDER BY [sortValue]
FROM 
    [dbo].[data_archive] AS P
WHERE EXISTS (SELECT C.[s] FROM #distinctMatches AS C WHERE P.[s] = C.[s])
ORDER BY [sortValue]