我在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]
我能够获得合并连接而不是连接。 (见下面的答案)。
答案 0 :(得分:1)
你说“当从一个表单独加载(即没有UNION ALL)时,排序可以利用索引并有效排序”因此在表上有一个带有前导键列S或至少覆盖索引的PK前导键列S,这两个表都是如此。这意味着查询中的所有连接都是MERGE连接(临时表的连接也在排序列上),因此计划中不会有任何其他类型