sql - 提高添加具有单个值的列的性能

标签 sql sql-server join

通过实验和令人惊讶的是,我发现 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

Join table to a point

现在是我问题的核心。有人能告诉我如何去掉整个 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/

相关文章:

sql - 必须声明变量标量

php - Mysql Where Column A = X and Column B = Y and or Column B = Z

mysql - 使用/用户输入连接三个表

sql-server - 根据行值合并表

sql-server - 为什么我们需要CDC或CT才能在SQL Server 2016中要求时态表?

php - 从第二个表中提取某些信息但没有 "Where"约束

MySQL(版本 5.5): Why `JOIN` is faster than `IN` clause?

mysql - MySQL 中何时使用单引号、双引号和反引号

sql-server - SQL Server : Must numbers all be specified with latin numeral digits?

sql - 不是独立地连接多个表,而是使用单独的查询?