Transact SQL并行查询执行

时间:2011-11-23 12:50:20

标签: sql-server tsql

假设我有

INSERT INTO @tmp1 (ID) SELECT ID FROM Table1 WHERE Name = 'A'
INSERT INTO @tmp2 (ID) SELECT ID FROM Table2 WHERE Name = 'B'
SELECT ID FROM @tmp1 UNION ALL SELECT ID FROM @tmp3

我想运行查询1& 2并行,然后在结束后合并结果。

有没有办法在纯T-SQL中执行此操作,或者检查它是否会自动执行此操作?

对于那些想要它的人的背景:我调查一个复杂的搜索,其中有多个条件后来合并(术语OR(术语2和术语3)或术语4和项目5 =术语5)因此我调查它是否有用并行地执行那些 - 很大程度上不相关的条件,稍后组合结果表(以及计算等级,权重等)。

E.g。应该是几个结果集:

SELECT COUNT(*) @tmp1 union @tmp3
SELECT ID from (@tmp1 union @tmp2) WHERE ...
SELECT * from TABLE3 where ID IN (SELECT ID FROM @tmp1 union @tmp2)
SELECT * from TABLE4 where ID IN (SELECT ID FROM @tmp1 union @tmp2)

3 个答案:

答案 0 :(得分:3)

你没有。 SQL不能像那样工作:它不是程序性的。由于其他连接,它会导致竞争条件和数据问题

表变量也限定为批处理和连接,因此如果您想知道,则无法通过2个连接共享结果。

无论如何,除非你给我们一个不好的例子,否则你需要的就是这个:

SELECT ID FROM Table1 WHERE Name = 'A'
UNION
SELECT ID FROM Table2 WHERE Name = 'B'

由于这种程序性思维,我怀疑你正在考虑“并行运行”。您的实际期望的问题和目标是什么?

注意:表变量不允许并行操作:Can queries that read table variables generate parallel exection plans in SQL Server 2008?

答案 1 :(得分:2)

您不确定要并行化的内容 - SQL Server的优化程序。优化器将使用的最大工作单元是单个语句 - 因此,您可以找到一种方法将查询表示为单个语句,然后依靠SQL Server来完成其工作,它通常会做得很好。

如果构建了您的查询后,性能是不可接受的,那么您可以查看应用提示或强制使用某些计划。许多人将他们的查询分成多个语句,或者相信他们可以比SQL Server做得更好,或者因为他们“自然地”想到手头的任务。两者都是“错误的”(对于某些错误值),但是如果存在自然故障,您可以使用公用表表达式复制它 - 这些将允许您命名问题的每个子部分,然后将它们组合在一起这些都是一个声明的一部分。

E.g:

;WITH TabA AS (
     SELECT ID FROM Table1 WHERE Name = 'A'
), TabB AS (
     SELECT ID FROM Table2 WHERE Name = 'B'
)
SELECT ID FROM TabA UNION ALL SELECT ID FROM TabB

这将允许服务器决定如何最好地解决此查询(例如,决定是否将中间结果存储在“临时”表中)


在你的其他评论中看到你讨论过必须“使用”中间结果 - 这仍然可以用CTE完成(如果不是你不能表达“最终”结果的情况)作为单个查询),例如:

;WITH TabA AS (
   SELECT ID FROM Table1 WHERE Name = 'A'
), TabAWithCalcs AS (
   SELECT ID,(ID*5+6) as ModID from TabA
)
SELECT * FROM TabAWithCalcs

答案 2 :(得分:1)

为什么不呢:

SELECT ID FROM Table1 WHERE Name = 'A'
UNION ALL
SELECT ID FROM Table2 WHERE Name = 'B'

然后,如果SQL Server想要并行运行两个选择,它将自己进行violition。

否则,如果不切实际,我们需要更多关于你想要实现的内容。