为什么使用带有SELECT语句的临时表可以提高逻辑I/O计数?这难道不会增加对数据库的访问次数而不是减少吗?这是因为“问题”被分解成了几个部分吗?我想知道背后的原理。
为什么使用带有SELECT语句的临时表可以提高逻辑I/O计数?这难道不会增加对数据库的访问次数而不是减少吗?这是因为“问题”被分解成了几个部分吗?我想知道背后的原理。
没有通用的答案。这取决于临时表的使用方式。
临时表可以通过缓存复杂过滤/连接后创建的行,以便在批处理的后续多次使用中减少IO。这样,当只需要记录的子集时,数据库可以避免多次访问基本表。
临时表可能会增加IO,因为它存储了在查询后面从未使用的记录,或者占用了引擎缓存中本应更好地用于其他数据的大量空间。
创建一个仅使用其所有内容的临时表比将临时表的查询包含在主查询中要慢,因为查询优化器无法看到临时表,并且它强制执行(可能)不必要的spool数据,而不是允许它从源表流式传输。
有一类问题,在数据库端构建结果集合结构比将结果的部分返回给客户端并为每个部分进行往返处理要好得多。
例如:任意深度递归关系(老板)
还有一类查询问题,数据不会且不会以使查询运行高效的方式进行索引。将结果拉入集合结构中,可以按自定义方式进行索引,从而减少这些查询的逻辑IO。