【问题标题】:Database Join Performance Comparison [duplicate]数据库连接性能比较 [重复]
【发布时间】:2016-03-08 16:56:30
【问题描述】:

我在一个项目中,通过在 FROM 子句中包含多个表来执行大部分查询。我知道这是合法的,但我一直使用显式 JOIN。

例如,两个表(使用 SQL Server DDL)

CREATE TABLE Manufacturers(
    ManufacturerID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
    Name varchar(100))

CREATE TABLE Cars (
    ModelID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
    ManufacturerID INT CONSTRAINT FOREIGN KEY FK_Manufacturer REFERENCES Manufacturers(ManufacturerID),
    ModelName VARCHAR(100))

如果我想找到通用汽车的模型,我可以这样做:

SELECT ModelName FROM Cars c, Manufacturers m WHERE c.ManufacturerID=m.ManufacturerID AND m.Name='General Motors'

SELECT ModelName FROM Cars c INNER JOIN Manufacturers m ON c.ManufacturerID=m.ManufacturerID WHERE m.Name='General Motors'

我的问题是:一种形式是否比另一种表现更好?除了在 Oracle 和 SQL Server 中如何定义表之外,在 Oracle 或 SQL Server 中,一种形式的连接是否比另一种更好?如果你包含更多的表,比如 3 个或 4 个呢?假设查询被构造为返回等效的记录集,这是否会改变性能特征?

【问题讨论】:

标签: sql-server oracle join


【解决方案1】:

我的问题是:一种形式是否比另一种表现更好?

他们不应该。您可以检查您的执行计划以确定,但我使用过的每个 RDBMS 都会为逗号 (ANSI-89) 连接生成与 ANSI-92 显式连接相同的计划。 (请注意,逗号连接并没有停止成为 ANSI SQL,只是 ANSI-92 是显式语法首次出现的地方。)

除了在 Oracle 和 SQL Server 中如何定义表之外,在 Oracle 或 SQL Server 中,一种形式的连接是否比另一种形式更好?

就服务器而言,没有。

如果您包含更多表(例如 3 个或 4 个)怎么办?假设查询被构造为返回等效的记录集,这是否会改变性能特征?

这是可能的。使用逗号连接,我不确定是否可以像使用显式连接一样控制带括号的 JOIN 顺序:

SELECT *
FROM Table1 t1
INNER JOIN (
    Table2 t2
    INNER JOIN Table3 t3
        t2.id = t3.id)
    ON t1.id = t2.id

可能影响整体查询性能(无论好坏)。我不确定如何使用逗号连接实现相同级别的控制,但我从未完全学习过逗号连接语法。我不知道你能不能说Table1 t1, (Table2 t2, Table3 t3),但我不相信你能。我认为你必须使用子查询来做到这一点。

显式连接的主要优点是:

  1. 更易于阅读。它非常清楚哪些条件与哪个连接一起使用。您永远不会看到Table1 t1, Table2 t2, Table3 t3,然后必须深入研究 WHERE 子句以确定其中一个连接是否是外连接。这也意味着 WHERE 子句没有塞满所有这些您知道在修改查询时不关心更改的连接条件。
  2. 更容易使用外连接。在外连接的情况下,您甚至可以在外表中指定文字过滤器值,而无需处理来自外连接的空值。
  3. 更容易重用现有的联接。如果你只想从相同的关系中查询,你可以抓住 FROM 子句。您不必担心需要 WHERE 子句中的哪些位以及不需要哪些位。
  4. 跨 RDBMS 的语法相同。当您整天在 Oracle 和 SQL Server 之间切换时,您最不想担心的就是混淆 +*= 以正确进行外部连接。

以上所有使显式连接语法更易于维护,这对于软件来说是一个非常重要的因素。

【讨论】:

    猜你喜欢
    • 2020-06-26
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多