加速大桌子和小桌子之间的内部连接

时间:2010-02-13 08:46:27

标签: sql query-optimization

这可能是一个愚蠢的问题,但它可能会说明联盟如何在内部工作。

假设我有一个大表L和一个小表S(100K行对100行)。

以下两个选项之间的速度方面是否存在差异?:

OPTION 1:                 OPTION 2:
---------                 ---------
SELECT *                  SELECT *
FROM L INNER JOIN S       FROM S INNER JOIN L
ON L.id = S.id;           ON L.id = S.id;

请注意,唯一的区别是表的连接顺序。

我意识到不同的SQL语言之间的性能可能会有所不同。如果是这样,MySQL将如何与Access进行比较?

2 个答案:

答案 0 :(得分:19)

不,订单无关紧要。

几乎所有RDBMS(例如MS Access,MySQL,SQL Server,ORACLE等)都使用基于列统计信息的基于成本的优化器。在大多数情况下,优化程序将选择正确的计划。在您给出的示例中,订单无关紧要(提供的统计信息是最新的)。

  

决定使用哪种查询策略,   Jet Engine优化器使用   统计。以下因素是   这些的一些因素   统计数据基于:

     
      
  • 表格中的记录数
  •   
  • 表格中的数据页数
  •   
  • 表格的位置
  •   
  • 是否存在索引
  •   
  • 索引的独特性
  •   
     

注意:您无法查看Jet数据库引擎优化方案   无法指定如何优化a   查询。但是,你可以使用   数据库文件管理员确定   索引是否存在以及如何存在   唯一的索引是。

     

基于这些统计数据,   优化器然后选择最好的   处理的内部查询策略   具有特定查询。

     

每当a。时,统计信息都会更新   查询已编译。标记了一个查询   用于保存任何时候进行编译   对查询的更改(或其更改)   基础表)和什么时候   数据库被压缩了。如果查询是   标记为编译,编译   并且更新统计数据   下次运行查询时。   编译通常需要一个   秒到四秒。

     

如果添加大量的   记录到您的数据库,您必须   打开然后保存您的查询   重新编译查询。例如,如果   你设计然后测试一个查询   使用一小组样本数据,你   之后必须重新编译查询   其他记录被添加到   数据库。当你这样做,你想要   确保最佳查询   你的表现是达到的   申请正在使用中。

Ref

可能感兴趣:ACC: How to Optimize Queries in Microsoft Access 2.0, Microsoft Access 95, and Microsoft Access 97

Tony Toews的Microsoft Access Performance FAQ值得一读。

答案 1 :(得分:2)

我知道Oracle不在您的列表中,但我认为大多数现代数据库都会以这种方式运行。

您可以在以下执行计划中看到,两个语句之间没有区别。

它是对两个表中每个表的完全访问权限(在我的情况下没有索引),然后是HASH JOIN。由于您需要两个表中的所有内容,因此需要读取和连接两个表,序列不会产生影响。

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |   100 |   700 |    42  (12)| 00:00:01 |
|*  1 |  HASH JOIN         |      |   100 |   700 |    42  (12)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| S    |   100 |   300 |     2   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| L    |   100K|   390K|    38   (8)| 00:00:01 |
---------------------------------------------------------------------------