通过实验和令人惊讶的是,我发现 LEFT JOINING 点表在大型表上比简单地将单个值分配给列要快得多。我所说的点表是指 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 具有与“值”相同的值,它会从结果中丢弃行。删除该条件或可能更改 <>
至 =
sign,似乎有更多的空间来促进连接的性能。
2015 年 2 月 23 日更新
针对性能专家的赏金问题。我的问题和答案中提到的哪种方法最快。
方法一简单赋值,
方法 2 左连接点表,
方法 3 交叉连接点表(感谢 Gordon Linoff 的回答)
方法 4 赏金期间可能建议的任何其他方法。
正如我根据经验测量的 3 种方法的查询执行时间(以秒为单位)——第二种使用 LEFT JOIN 的方法是最快的。然后是 CROSS JOIN 方法,最后是简单的赋值。令人惊讶的是。需要持所罗门之剑的性能专家来证实或否定它。
最佳答案
我很惊讶这对于一个简单的表达式来说更快,但你似乎想要一个cross join
:
WITH B AS (SELECT 'Value' as NewColumn)
SELECT *
FROM Table1 A CROSS JOIN
B;
我使用此构造将“参数”放入查询中(可以轻松更改的值)。但是,我不明白为什么它会更快。如果表达式比较复杂(比如子查询或者非常复杂的计算),那么这个方法只计算一次。在原始查询中,它通常只会被评估一次,但可能会出现对每一行都进行评估的情况。
关于sql - 提高添加具有单个值的列的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28454500/