哪个SQL查询更好,为什么?

时间:2012-07-09 15:38:34

标签: sql optimization

我还在学习SQL。我用两种不同的方式做了类似的查询,并且想知道哪个更好,为什么。

UPDATE R
    SET R.something = 1
    FROM Table1 R
    JOIN Table2 U
    ON R.value1 = U.value2
    WHERE
        U.value3 BETWEEN 1 AND 5

UPDATE R
    SET R.something = 1
    WHERE R.value1 IN
    (SELECT U.value2
    FROM U
    WHERE
        U.value3 BETWEEN 1 AND 5
    )

6 个答案:

答案 0 :(得分:2)

您的问题没有一个答案。 SQL是一种描述性语言,而不是一种过程语言。这取决于数据库引擎,它将更有效。此外,索引会对性能产生很大影响。

顺便说一句,你的两个问题并不等同。当“U”中有多个值时,第一行可以返回多行。带有“IN”的版本隐含“DISTINCT”。要解决此问题,您需要添加特定的“DISTINCT”。

UPDATE R
    SET R.something = 1
    FROM Table1 R
         JOIN (select distinct value2
               from Table2 U
               WHERE U.value3 BETWEEN 1 AND 5 
              ) u
         ON R.value1 = U.value2  

此外,虽然我个人喜欢更新中的“FROM”语句,但并非所有数据库都支持它。具有“IN”的版本兼容更广泛的数据库引擎。

答案 1 :(得分:1)

这一切都取决于您计划使用的数据库(Oracle,SQL Server等),其版本以及有时基于表中的数据量。但通常你应该更喜欢JOIN,因为它们对于大多数优化器来说更容易,并且具有更少的带有空值的陷阱。

答案 2 :(得分:1)

首先查询更好。

关系数据库,无论您使用的是哪个实际DBMS,都是为了以这种方式连接数据并使用where子句对其进行过滤而构建的。这是他们的面包和黄油。在第二个查询中,您使用子查询来收集其他数据。这非常酷,关系型数据库也会很好地完成。但是,使用子查询,在这种特定情况下,您将最终得到两个查询,一个用于获取U数据,然后外部查询将使用子查询中的数据来设置R数据。 / p>

虽然这是一个棘手的问题。在查询中,子查询完全引用单独的表。所以它仍然很快。该子查询仅包含在U数据中。您将获得2个查询 - 获取U数据,然后使用U数据更新R数据。但是如果您编写了一个类似的查询,其中子查询引用了R中的数据,那么您将不会获得两个单独的查询。你最终会对R中的所有数据进行全表扫描,这会相当慢。

编辑以获得更完整性:正如其他人所说,其中很多都归结为您正在使用的DBMS以及它最擅长的内容。当第一次学习SQL(我不是专家)时,其中一个障碍是意识到有很多方法可以做同样的事情,得到相同的结果,然后经常最终得到优化到同一个东西。所以找到“正确”的方式通常是徒劳的,因为没有明确的“正确”方式。我试着写不仅仅是为了正确性和速度,还为了可维护性 - 我发现子查询在大脑上可能比必要时更难。如果我可以避免它们,我会尝试不使用它们(只要替代品不是光标或其他东西:-D)。

答案 3 :(得分:0)

最好用JOIN查询,因为它比子选择更快。

答案 4 :(得分:0)

这取决于数据库和数据库版本 搜索IN或JOIN是否更好(更快)返回不同 结果(IN更快或JOIN更快)取决于数据库 甚至在SQL语句上 - 它甚至可以根据而改变 数据库版本。使用多个数据进行测试总是一个好主意 尺寸和不同的平台!

(查询#2是最容易阅读的,但可能会或可能不会慢)

答案 5 :(得分:0)

这可能取决于您使用的引擎,但我相信MS SQL Server会优化两个相同的查询计划。

如果发动机没有,我会建议它在这种情况下是劣质的。