SQL查询 - 它们是否相同?

时间:2016-11-07 07:06:48

标签: sql sql-server common-table-expression

我这里有两个查询会生成相同的结果。 您认为哪个更好,或者它们完全相同。

查询1

SELECT
    ISNULL(col_1, col_2) AS col_1
FROM table_1
INNER JOIN table_2 ON table_2.col = ISNULL(col_1, col_2)

或查询2

WITH cte_table_1 AS
(
    SELECT
         ISNULL(col_1, col_2) AS col_1
    FROM table_1
)

SELECT
    cte_table_1.*
FROM cte_table_1
INNER JOIN table_2 ON table_2.col = col_1

3 个答案:

答案 0 :(得分:2)

预测这一点并不容易。

一般情况下:SQL-Server是不是程序引擎一个接一个地处理语句,因为您已经在代码中设置了它。您告诉SQL-Server您想要什么,引擎将决定,实现此目的的最佳方式是什么。并且完成得非常好!根据统计信息,并行操作,内存使用情况,CPU或HD,这可能会因呼叫而异。

即使看起来像这样, CTE也不会像表那样处理。具有多个CTE的查询看起来像哦,选择此结果,而不是获取这些结果,现在让我们调用这些行,现在进入主查询!引擎可能会决定完全不同的执行顺序

在您的简单案例中,我假设引擎足够聪明,您的查询结构相同。

检查执行计划以查看更多详细信息。

更新

你说:如果它们具有相同的EP结果,那么我们可以说它取决于用户哪个更适合他们?

为什么您的用户应该考虑查询的内部结构?这取决于你无法控制的许多因素!你甚至不能确定,下一个电话将与之前的电话相同......

我的强烈建议是:甚至不要试图超越引擎!其算法花费了数千小时......您应该考虑可读性和维护等问题......

答案 1 :(得分:1)

  1. CTE基本上只是一次性视图。除了将CTE代码作为表表达式放入FROM子句之外,它几乎不会更快地进行查询。

  2. 您必须使用ISNULL(col_1, col_2)代替ISNULL(col_1, col_2, col_1)

  3. 第一个查询是更好的选择,因为使用一个连接的简单查询比使用CTE具有更好的性能

  4. 详细了解CTE Here

答案 2 :(得分:0)

ISNULL需要2个argumnets

COALESCE我们可以传递多个参数

第一个查询与性能相比更好,因为它是简单的内连接,但第二个查询是一些不被视为

的查询