临时表和SQL SELECT性能

时间:2020-03-05 18:56:02  来源:igfitidea点击:

为什么将临时表与SELECT语句一起使用会改善逻辑I / O数量?它不会增加而不是减少数据库的点击量。这是因为"问题"分为几部分吗?我想知道幕后发生的事情。

解决方案

回答

AFAIK,至少在mysql中,tmp表保存在RAM中,从而使SELECT的速度比达到HD的速度快得多

回答

存在一类问题,即在数据库侧在集合结构中构建结果要比将结果的部分返回给客户端(每个部分往返)更可取。

例如:任意深度递归关系(的老板)

还有另一类查询问题,在这些问题中,数据不会也不会以使查询有效运行的方式建立索引。将结果提取到可以以自定义方式建立索引的集合结构中,将减少这些查询的逻辑IO。

回答

我将通过临时表假设我们是指WHERE子句中的子选择。 (这称为半联接操作,通常可以在查询的文本执行计划中看到它。)

当查询优化器遇到子选择/临时表时,它将对如何处理该数据做出一些假设。本质上,优化器将创建一个执行计划,该执行计划对子选择的结果集执行联接,从而减少了需要从其他表读取的行数。由于行数较少,因此查询引擎能够从磁盘/内存中读取较少的页面,并减少了所需的I / O量。

回答

没有普遍的答案。这取决于如何使用临时表。

临时表可以通过缓存在复杂的筛选器/联接之后创建的行来减少IO,这些行将在批处理中多次使用。这样,当只需要记录的一个子集时,DB可以避免多次访问基表。

临时表可以通过存储在查询中以后不再使用的记录,或者通过占用引擎缓存中很多本可以由其他数据更好地使用的空间来增加IO。

创建临时表以一次使用其所有内容比在主查询中包括临时查询要慢,因为查询优化器看不到临时表,并且强制(可能)不必要的数据后台处理而不是允许它从源表流式传输。