没有提示指令的直接连接中表的顺序是否会影响性能?

时间:2012-07-10 06:13:25

标签: mysql sql sql-server oracle informix

所有基于SQL的RDBMS(版本不超过10年):

直接连接查询中的表顺序(没有提示指令)是否会对最佳性能和内存管理产生影响?我听说最后一次加入应该是最大的表。您的DB的查询优化器如何处理这种情况?

3 个答案:

答案 0 :(得分:4)

回答你的问题 - 是的,表的顺序在加入时有所不同。

您也可以让优化程序了解执行计划。

ORDERED提示使Oracle按照它们在FROM子句中出现的顺序连接表。

例如,此语句将表TAB1连接到表TAB2,然后将结果连接到表TAB3:

 SELECT /*+ ORDERED */ TAB1.COL1, TAB2.COL2, TAB3.COL3
     FROM TAB1, TAB2, TAB3
    WHERE TAB1.COL1 = TAB2.COL1
         AND TAB2.COL1 = TAB3.COL1;

如果从执行连接的SQL语句中省略ORDERED提示,优化程序将选择连接表的顺序。如果您知道优化程序没有从每个表中选择的行数,则可能需要使用ORDERED提示来指定连接顺序。这样的信息将允许您比优化器更好地选择内部和外部表。

通常,如果您分析表格,优化程序会选择有效的星型计划。您还可以使用提示来改进计划。最精确的方法是按照索引中键的顺序对FROM子句中的表进行排序,最后使用大表。然后使用以下提示:

/*+ ORDERED USE_NL(FACTS) INDEX(FACTS FACT_CONCAT) */

答案 1 :(得分:2)

只是在主题上添加更多内容......是和否,取决于。这是我的答案。这取决于许多因素,您使用的是RDBMS(MySQL,MSSQL Server,Oracle,DB2 ...),连接类型,表的大小(也称为行数),索引等等。

之前的答案是肯定和否,并呼吁对查询使用提示。但你的问题是:

  

join语句中表的顺序是否有所不同......

在我看来,当你强制查询优化器使用你喜欢的顺序时,这就省去了查询提示的使用。

因此,在问题中重用答案posted on my first comment,@ Mark Brackett正确地指出重新排列联接(没有查询提示)不会影响性能,因为查询优化器仍将使用最有效的执行计划目前的查询。也许它不是最有效的,所以你可以使用提示和强制在连接上使用你想要的顺序,从而修改查询的执行计划。

以下链接有关该主题的更多讨论: Does order matter in a JOIN clause? Optimize join methods

答案 2 :(得分:1)

就Informix而言,无论如何。优化器将自行决定处理表的顺序,它们在FROM子句中出现的顺序无关紧要。 除非您选择覆盖默认行为。

您可以使用+ORDERED提示查询优化器,强制它按照WHERE子句中显示的顺序连接表,即:

SELECT --+ORDERED 
       x.col1, y.col2, z.col3
  FROM z, y, x
  WHERE ...

强制优化器扫描z,加入y,然后加入x,,即使这会创建一个中间笛卡尔积。因此应谨慎使用。


注意:当问题仅被标记为Informix而不是多个RDBMS技术时,就会写出这个答案。