Sql server 数据库连接性能比较

Sql server 数据库连接性能比较,sql-server,oracle,join,Sql Server,Oracle,Join,我参与了一个项目,其中大部分查询都是通过在FROM子句中包含多个表来执行的。我知道这是合法的,但我总是使用显式联接 例如,两个表(使用SQL Server DDL) 如果我想找到通用汽车的车型,我可以: 从汽车c、制造商m中选择型号名称,其中c.ManufacturerID=m.ManufacturerID和m.Name='General Motors' 或 从c.ManufacturerID=m.ManufacturerID中选择车型名,其中m.Name='General Motors' 我的

我参与了一个项目,其中大部分查询都是通过在FROM子句中包含多个表来执行的。我知道这是合法的,但我总是使用显式联接

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

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

从汽车c、制造商m中选择型号名称,其中c.ManufacturerID=m.ManufacturerID和m.Name='General Motors'

从c.ManufacturerID=m.ManufacturerID中选择车型名,其中m.Name='General Motors'

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

我的问题是:一种形式比另一种更好吗

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

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

就服务器而言,没有

如果包括更多的表,比如3或4,会怎么样?假设查询被构造为返回一个等价的记录集,那么这会改变性能特征吗

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

SELECT *
FROM Table1 t1
INNER JOIN (
    Table2 t2
    INNER JOIN Table3 t3
        t2.id = t3.id)
    ON t1.id = t2.id
这可能会影响整体查询性能(无论好坏)。我不确定如何使用逗号连接实现相同级别的控制,但我从未完全学习过逗号连接语法。我不知道你是否能说
table1t1,(table2t2,table3t3)
,但我不相信你能。我认为您必须使用子查询来实现这一点

显式联接的主要优点是:

  • 更容易阅读。它非常清楚地说明了哪些条件与哪个join一起使用。您永远不会看到
    table1t1、table2t2、table3t3
    ,然后必须深入WHERE子句以确定其中一个连接是否是外部连接。这还意味着WHERE子句中没有填充所有这些连接条件,您知道在修改查询时不关心更改这些条件
  • 更容易使用外部联接。对于外部联接,您甚至可以在外部表中指定文字过滤器值,而不必处理外部联接中的空值
  • 更易于重用现有联接。如果您只想从相同的关系中进行查询,那么只需获取from子句即可。您不必担心WHERE子句中的哪些位需要,哪些位不需要
  • RDBMS中的语法相同。当您整天在Oracle和SQL Server之间切换时,最不需要担心的是混淆
    +
    *=
    以正确进行外部联接
  • 所有这些使得显式连接语法更易于维护,这对于软件来说是一个非常重要的因素。

    执行计划(至少在sql server中)是相同的。但是,您确实应该避免使用第一种联接样式。这是较旧的ANSI-89样式。近30年前,内部连接在语法上被引入。
    SELECT *
    FROM Table1 t1
    INNER JOIN (
        Table2 t2
        INNER JOIN Table3 t3
            t2.id = t3.id)
        ON t1.id = t2.id