所有基于SQL的RDBMS(最早10年的版本):
直接连接查询(不带提示指令)中表的顺序对优化性能和内存管理有影响吗?我听说最后一个连接应该是最大的表。数据库的查询优化器是如何处理这种情况的?
发布于 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
发布于 2012-07-10 15:21:21
回答你的问题-是的,表的顺序在连接中会有所不同。
您还可以让优化器知道执行计划。
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) */发布于 2012-07-10 14:56:44
编号:
无论如何,就Informix而言。优化器将自己决定处理这些表的顺序,它们在FROM子句中出现的顺序是无关紧要的。除非您选择覆盖默认行为。
您可以使用查询优化器的+ORDERED提示,强制它按照表在WHERE子句中的显示顺序联接表,即:
SELECT --+ORDERED
x.col1, y.col2, z.col3
FROM z, y, x
WHERE ...强制优化器扫描z,连接到y,并连接到x,即使这会创建一个中间笛卡尔乘积。所以应该小心使用它。
注:此答案是在问题仅标记为Informix时编写的,而不是多种RDBMS技术。
https://stackoverflow.com/questions/11407605
复制相似问题