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

Zai*_*aid 32 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;
Run Code Online (Sandbox Code Playgroud)

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

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

Mit*_*eat 19

不,订单无关紧要.

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

要确定要使用的查询策略,Jet Engine优化程序将使用统计信息.以下因素是这些统计数据所依据的一些因素:

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

注意:您无法查看Jet数据库引擎优化方案,也无法指定如何优化查询.但是,您可以使用数据库文档管理器来确定索引是否存在以及索引的唯一性.

根据这些统计信息,优化程序然后选择最佳的内部查询策略来处理特定查询.

无论何时编译查询,都会更新统计信息.当您保存对查询(或其基础表)的任何更改以及压缩数据库时,将标记一个查询以进行编译.如果标记了查询以进行编译,则下次运行查询时将进行统计信息的编译和更新.编译通常需要一秒到四秒.

如果向数据库中添加大量记录,则必须打开然后保存查询以重新编译查询.例如,如果您使用一小组示例数据设计然后测试查询,则必须在将其他记录添加到数据库后重新编译查询.执行此操作时,您需要确保在使用应用程序时实现最佳查询性能.

参考.

可能会有兴趣:ACC:如何优化Microsoft Access 2.0,Microsoft Access 95和Microsoft Access 97中的查询

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