当前位置: 首页 > 面试题库 >

加快大表和小表之间的内部联接

端木狐若
2023-03-14
问题内容

这可能是一个愚蠢的问题,但可能会为联接在内部的工作方式提供一些启示。

假设我有一个大表L和一个小表S(100K行vs. 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相比如何?


问题答案:

不,顺序无关紧要。

几乎所有的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值得一读。

需要注意的是“加入顺序无关紧要”。

如果您的RDBMS基于成本的查询优化器在创建查询计划时超时,则连接顺序可能很重要。基于成本的优化器在构造查询计划时具有有限的资源(CPU时间和内存)。如果他们在编译阶段超时,那么您将获得迄今为止找到的最佳计划。

TLDR;如果您的复杂查询收到计划编译超时(而不是查询执行超时),则应将限制性最强的联接放在首位。这样,在查询计划优化器超时的那一点上,它将增加找到“更好”计划的机会。

当然,如果遇到查询计划编译超时,则可能应该简化查询。



 类似资料:
  • 编辑(完全重新制定的方法): 我试图在一个新项目中推广JPA的使用,但我正在努力解决一个据说微不足道的问题:两个表(父表和子表)之间的内部连接。 我只提供必要的信息,其余的都不提供。如果需要,请随时询问更多信息。有两个表LANGUAGE和MESSAGE\u RESOURCE,其中父表是LANGUAGE(主键ID\u LANGUAGE),子表有一个指向父表的外键(也称为ID\u LANGUAGE)。

  • 问题内容: 我的本地Postgres数据库中有3个表: 在运行时,我会知道。我需要运行SQL来更新与此项目关联的内容,因此类似: 我可能必须执行某种嵌套或在子句中进行操作,但不确定如何执行此操作。提前致谢! 编辑 : 假设我有一条具有以下值的记录: 相应的(id = 23)具有以下值: 在运行时,我只有(458)。我需要在单个UPDATE语句中查找对应的(23)并将其更改为。 问题答案:

  • 问题内容: 我似乎无法内部连接到教师表以获得名字和姓氏。 我收到的错误消息是 问题答案: 以下错误是因为您未指定列: Msg 8156,第16级,状态1,第3行 为“ MaxBookingDays”多次指定了“ ID”列。 因此,我将您的查询稍作更改,如下所示:

  • 我用的是bootstrap3。我想使登录表单更小,并在输入之间更改大小,因为现在它们太近了。 这是我的密码 怎么做呢? 形式

  • 问题内容: 我有一个简单的表,用于记录针对特定访问的事件: 个人与访问次数(VisitId)相关联。对于每次访问,一个人可能有多个历史记录。活动可以是入场,转场或出场。 我试图编写一个查询来计算每个位置在每个位置的持续时间。请注意,他们每次访问可能会多次访问一个位置。个人通过录取或转移事件进入场所,然后通过放电或转移离开场所。 如果某人进入位置“ A”,其录取或转移记录将列出位置“ A”,但是如果

  • 我正在Windows 8.1 64位上开发java swing应用程序,带有4GB内存和JDK版本8u20 64位。 问题是当我使用带有监视器选项的Netbeans profiler启动应用程序时。 加载第一个Jframe时,应用程序Memory Heap约为18mb,JVM进程大小约为50mb(Image1)。 然后,当我启动另一个Jframe时,它包含一个带有webView的JFxPanel,