临时表和SQL SELECT性能

4

为什么使用带有SELECT语句的临时表可以提高逻辑I/O计数?这难道不会增加对数据库的访问次数而不是减少吗?这是因为“问题”被分解成了几个部分吗?我想知道背后的原理。


什么数据库管理系统?你说的是哪种SQL语言 -- 把它粘贴进来! - Matt Rogish
4个回答

3

没有通用的答案。这取决于临时表的使用方式。

临时表可以通过缓存复杂过滤/连接后创建的行,以便在批处理的后续多次使用中减少IO。这样,当只需要记录的子集时,数据库可以避免多次访问基本表。

临时表可能会增加IO,因为它存储了在查询后面从未使用的记录,或者占用了引擎缓存中本应更好地用于其他数据的大量空间。

创建一个仅使用其所有内容的临时表比将临时表的查询包含在主查询中要慢,因为查询优化器无法看到临时表,并且它强制执行(可能)不必要的spool数据,而不是允许它从源表流式传输。


值得一提的是,通常情况下,如果您的RAM或配置不允许使用如此大的内存表,则临时表只会被构建为MEMORY类型,否则它将使用磁盘,这会显著降低临时表的速度。 - Rufinus

1
我将假设你所说的临时表是指WHERE子句中的子查询。 (这被称为半连接操作,你通常可以在查询的文本执行计划中看到它。)
当查询优化器遇到子查询/临时表时,它会对如何处理该数据进行一些假设。本质上,优化器将创建一个执行计划,对子查询结果集执行联接操作,从而减少需要从其他表中读取的行数。由于行数较少,查询引擎能够从磁盘/内存读取更少的页面,并减少所需的I/O量。

0
据我所知,至少在mysql中,临时表存储在内存中,使得SELECT操作比任何需要访问硬盘的操作都要快。

0

有一类问题,在数据库端构建结果集合结构比将结果的部分返回给客户端并为每个部分进行往返处理要好得多。

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

还有一类查询问题,数据不会且不会以使查询运行高效的方式进行索引。将结果拉入集合结构中,可以按自定义方式进行索引,从而减少这些查询的逻辑IO。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接