Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在没有提示指令的情况下,直接联接中表的顺序是否会影响性能?_Mysql_Sql_Sql Server_Oracle_Informix - Fatal编程技术网

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

Mysql 在没有提示指令的情况下,直接联接中表的顺序是否会影响性能?,mysql,sql,sql-server,oracle,informix,Mysql,Sql,Sql Server,Oracle,Informix,所有基于SQL的RDBMS(最早10年的版本): 在直接连接查询(没有提示指令)中,表的顺序是否会对最佳性能和内存管理产生影响?我听说最后一个连接应该是最大的表。数据库的查询优化器如何处理这种情况 否。 无论如何,就Informix而言。优化者将自行决定处理表格的顺序,它们在FROM子句中出现的顺序无关紧要。除非您选择覆盖默认行为 您可以使用对查询优化程序的+ORDERED提示,强制其按照WHERE子句中显示的顺序加入表,即: SELECT --+ORDERED x.col1,

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

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

否。

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

您可以使用对查询优化程序的
+ORDERED
提示,强制其按照
WHERE
子句中显示的顺序加入表,即:

SELECT --+ORDERED 
       x.col1, y.col2, z.col3
  FROM z, y, x
  WHERE ...
强制优化程序扫描z、连接到y和连接到x,即使这会创建一个中间笛卡尔积。因此,应小心使用



注意:这个答案是在问题只被标记为Informix,而不是多个RDBMS技术时写的。

回答您的问题-是的,表的顺序在联接中会有所不同

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

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提示来指定联接顺序。这样的信息可以让您比优化器更好地选择内部和外部表

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

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

只是想补充更多关于这个主题的内容。。。是和否,视情况而定。这就是我的答案。这取决于许多因素,您使用的是哪种RDBMS(MySQL、MSSQL服务器、Oracle、DB2…),连接类型、表的大小(即行数)、索引等等

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

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

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

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

有关此主题的更多讨论,请访问以下链接:

是否可能重复?是的,特别是在MySql上。虽然在某些数据库上这并不重要,但我曾经将一个使用MySql的应用程序移植到Postgresql,MySql中的一个慢速查询在Postgresql中变得更快。在MySql上,我必须执行不同的连接顺序来进行查询faster@Yaroslav我的问题不涉及外部连接,也不涉及完整连接。我的评论只是一个轶事,但我忘了写博客了。因此,我只是在谷歌上搜索了一些类似的情况,我发现如下:如果您的RDBMS在计算最佳连接顺序(包含较少中间行的连接)方面不是很聪明,那么您必须自己覆盖连接顺序,例如在MySQL中,为了遵守您加入表的顺序,您应该使用
直联
;在Oracle中,您应该使用以下指令:
/*+ORDERED*/
尽管问题被标记为“Informix”,但此线程中的大多数答案(甚至是“勾选”的答案)都特定于其他数据库技术。非常奇怪。连接列上的索引或缺少索引会影响表的顺序吗?一般来说,这是准确的。在处理Frank的问题时,你需要注意的是,有些时候他会问关于DOS上SE4.10的问题,大约是1989年。你所说的不是真的。@FrankComputer:是的,索引的存在与否会改变查询的执行方式。这适用于启发式和基于成本的优化器(SE 4.10使用启发式优化器;其他(较新)版本的Informix数据库使用基于成本的优化器)。@JonathanLeffler:是的,SE 4.10 DOS,还有:SE 7.2 UNIX和11.70.TC4DE(WinVista)。我很确定4.10是基于成本的,文档上说是这样,然后解释相应的行为,尽管SE2.10肯定是启发式的!不管怎么说,我只是想知道构建连接是否是一个好习惯,比如:“smalltable.fk_id=bigtable.pk_id”或“bigtable.indexedcolumn=smalltable.nonindexedcolumn”?@FrankComputer:当你想要一个答案来涵盖软件的前版本和后版本时(在任何这样的论坛中),您应该确定您感兴趣的版本。否则,人们会(合理地)认为您对几乎最新的版本感兴趣(比如说那些不到5年不受支持的版本),而不是旧版本。我了解你的背景,理解你的观点;不是每个人都遇到过你不寻常的情况。我不知道还有谁在使用5.x版之前的Informix软件(但我不知道所有人)。根据我使用MySQL的第一手经验,RE“正确地指出重新排列联接(没有查询提示)不会影响查询优化器的性能”,重新安排连接顺序可以使查询更快,即使没有提示(我没有)