使用UNION ALL时的ORDER BY - 利用索引?

时间:2017-06-02 06:50:23

标签: sql sql-server tsql

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

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

当从一个表单独加载时(即没有UNION ALL),排序可以利用索引并有效排序,但是如何受到UNION ALL的影响?

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

-- Creates #distinctMatches temporary table etc. above..

CREATE CLUSTERED INDEX idx ON #distinctMatches (s)  

SELECT 
  'C' AS [source]
  ,P.[Id]
  ,P.[A]
  ,P.[B]
  ,P.[C]
  ,P.[D]
  ,P.[E]
  ,C.[S] AS [sortValue]
FROM 
    [dbo].[data_current] AS P
    INNER JOIN #distinctMatches AS C ON P.[s] = C.[s]

UNION ALL   

SELECT 
  'A' AS [source]
  ,P.[Id]
  ,P.[A]
  ,P.[B]
  ,P.[C]
  ,P.[D]
  ,P.[E]
  ,C.[S] AS [sortValue]
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
    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]

我能够获得合并连接而不是连接。 (见下面的答案)。

1 个答案:

答案 0 :(得分:1)

你说“当从一个表单独加载(即没有UNION ALL)时,排序可以利用索引并有效排序”因此在表上有一个带有前导键列S或至少覆盖索引的PK前导键列S,这两个表都是如此。这意味着查询中的所有连接都是MERGE连接(临时表的连接也在排序列上),因此计划中不会有任何其他类型