4

为什么使用带有 SELECT 语句的临时表会提高逻辑 I/O 计数?它不会增加对数据库的点击量而不是减少它。这是因为“问题”被分解成几个部分吗?我想知道幕后发生了什么。

4

4 回答 4

3

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

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

临时表可能会通过存储以后在查询中永远不会使用的记录来增加 IO,或者通过占用引擎缓存中本可以更好地被其他数据使用的大量空间来增加 IO。

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

于 2008-09-16T18:57:07.980 回答
1

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

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

于 2008-09-16T16:04:23.633 回答
0

AFAIK,至少对于 mysql,tmp 表保存在 RAM 中,这使得 SELECT 比任何命中 HD 的东西都快得多

于 2008-09-16T14:04:58.447 回答
0

有一类问题是在数据库端的集合结构中构建结果比将结果的部分返回给客户端、每个部分往返更可取。

例如:任意深度递归关系(boss of)

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

于 2008-09-16T14:53:26.473 回答