首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在没有提示指令的情况下,直接连接中表的顺序是否会影响性能?

在没有提示指令的情况下,直接连接中表的顺序是否会影响性能?
EN

Stack Overflow用户
提问于 2012-07-10 14:13:25
回答 3查看 1.1K关注 0票数 2

所有基于SQL的RDBMS(最早10年的版本):

直接连接查询(不带提示指令)中表的顺序对优化性能和内存管理有影响吗?我听说最后一个连接应该是最大的表。数据库的查询优化器是如何处理这种情况的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-10 20:04:56

只是在这个主题上添加更多...是也不是,看情况而定。这就是我的答案。这取决于许多因素,您使用的RDBMS (MySQL、MSSQL Server、Oracle、DB2...)、连接类型、表的大小(也称为行数)、索引等。

前面的答案是yes和no,并呼吁在查询中使用提示。但你的问题是:

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

在我看来,这省去了查询提示的使用,因为您强制查询优化器使用您喜欢的顺序。

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-07-10 15:21:21

回答你的问题-是的,表的顺序在连接中会有所不同。

您还可以让优化器知道执行计划。

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

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

代码语言:javascript
复制
 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子句中的表进行排序,最后是大表。然后使用以下提示:

代码语言:javascript
复制
/*+ ORDERED USE_NL(FACTS) INDEX(FACTS FACT_CONCAT) */
票数 4
EN

Stack Overflow用户

发布于 2012-07-10 14:56:44

编号:

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

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

代码语言:javascript
复制
SELECT --+ORDERED 
       x.col1, y.col2, z.col3
  FROM z, y, x
  WHERE ...

强制优化器扫描z,连接到y,并连接到x,即使这会创建一个中间笛卡尔乘积。所以应该小心使用它。

注:此答案是在问题仅标记为Informix时编写的,而不是多种RDBMS技术。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11407605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档