【发布时间】:2015-04-11 19:59:18
【问题描述】:
通过实验并且令人惊讶的是,我发现在大型表上左连接点表比将单个值简单地分配给列要快得多。点表是指 1x1(1 行 1 列)的表。
方法 1。简单的赋值,我的意思是这个(慢):
SELECT A.*, 'Value' as NewColumn,
FROM Table1 A
方法 2。左连接点表,我的意思是(更快):
WITH B AS (SELECT 'Value' as 'NewColumn')
SELECT * Table1 A
LEFT JOIN B
ON A.ID <> B.NewColumn
现在是我问题的核心。有人可以告诉我如何摆脱整个 ON 子句:
ON A.ID <> B.NewColumn?
检查连接条件似乎是不必要的浪费时间,因为表 A 的键不能等于表 B 的键。如果 t1.ID 的值与 'Value' 相同,它将从结果中丢弃行。删除该条件或可能将 <> 更改为 = 符号,似乎有更多空间来促进连接的性能。
2015 年 2 月 23 日更新
向性能专家提出的赏金问题。我的问答中提到的哪种方法最快。
方法 1 简单赋值,
方法 2 左连接点表,
方法 3 交叉连接积分表(感谢 Gordon Linoff 的回答)
方法 4 在赏金期间可能建议的任何其他方法。
正如我在 3 种方法中以秒为单位测量查询执行的经验时间一样 - 使用 LEFT JOIN 的第二种方法是最快的。然后是 CROSS JOIN 方法,最后是简单的赋值。令人惊讶的是。需要有所罗门之剑的表演专家来确认或否认。
【问题讨论】:
-
如果这实际上更快,我会感到非常惊讶。这两个查询具有相同的执行计划。但是,是的,戈登是正确的,你想要一个
CROSS JOIN。 -
我尝试了 3 种方法 (1) 值 SELECT * 的简单别名,1 AS NewColumn - 这是我调用较慢的解决方案,(2) LEFT JOIN B 在不能满足的条件下,(3 ) 交叉连接。在 41 秒的同一时间内,3 个查询选择了 (1) 177497 行,(2) 234708 行,(3) 198036 行。所以获胜者是 LEFT JOIN。我不确定我是否能够在我的机器上的所有 3 个查询中保持相同的可比情况。尽管如此,这场比赛还是值得专家仲裁者关注的。
-
也许这是 LEFT JOIN 快速性能的罕见场景,在 dbenham 的回答中描述了 +50 赏金(不是顶部标记为已接受的那个)stackoverflow.com/questions/2726657/…
-
您给出的示例距离现实世界使用还有很长的路要走,现实世界示例中的性能可能会受到其他因素的影响,例如存储的数据、可能需要的其他连接、索引等。如果您可以显示更多详细信息以及为什么/为什么需要提高性能,它可能会帮助您获得更好的答案。为什么需要为输出中的所有行分配相同的值?是否存在您可能需要该列中的其他值而导致您更改所需连接的情况(这无论如何都会影响您的整个查询计划,使示例无效)?
-
也许我遗漏了一些明显的东西,但是您的外连接连接标准
ON A.ID <> B.NewColumn会导致数据集中的额外列始终具有 NULL 值,这与原始要求背道而驰?
标签: sql sql-server join