所有基于 SQL 的 RDBMS(版本长达 10 年):
直接连接查询(没有提示指令)中的表顺序是否会影响最佳性能和内存管理?听说最后一个join应该是最大的表。您的数据库的查询优化器如何处理这种情况?
所有基于 SQL 的 RDBMS(版本长达 10 年):
直接连接查询(没有提示指令)中的表顺序是否会影响最佳性能和内存管理?听说最后一个join应该是最大的表。您的数据库的查询优化器如何处理这种情况?
回答您的问题 - 是的,表的顺序在连接中有所不同。
您还可以让优化器了解执行计划。
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) */
只是为了添加更多关于这个主题......是和否,取决于。这就是我的回答。它取决于许多因素,您使用的 RDBMS(MySQL、MSSQL Server、Oracle、DB2 ......)、连接类型、表大小(也就是行数)、索引等等。
先前的答案说是和否,并呼吁在查询中使用提示。但你的问题是:
连接语句中表的顺序是否有所不同...
在我看来,这忽略了查询提示的使用,因为您正在强制查询优化器使用您喜欢的顺序。
因此,重用我对您的问题的第一条评论中发布的答案,@Mark Brackett 正确指出重新排列您的联接(没有查询提示)不会影响性能,因为查询优化器仍将使用最有效的执行计划来执行当前查询. 也许这不是最有效的,因此您可以使用提示并强制在连接上使用您想要的顺序,从而修改查询的执行计划。
有关以下链接的更多讨论: 顺序在 JOIN 子句中是否重要? 优化连接方法
不。
无论如何,就 Informix 而言。优化器将自行决定处理表的顺序,它们出现在FROM
子句中的顺序无关紧要。除非您选择覆盖默认行为。
您可以使用+ORDERED
查询优化器的提示来强制它按照它们在WHERE
子句中出现的顺序加入表,即:
SELECT --+ORDERED
x.col1, y.col2, z.col3
FROM z, y, x
WHERE ...
强制优化器扫描 z、连接到 y 并连接到 x,即使这会创建中间笛卡尔积。所以应该小心使用。
注意:这个答案是在问题仅标记为 Informix,而不是多个 RDBMS 技术时编写的。