在数据库里,“临时表性能更好”这个说法是有前提的,并不是所有场景都更快。通常大家觉得临时表快,主要是因为它在特定用法下减少了重复计算、隔离了数据、或利用了特殊存储机制。下面分点说明原因,并补充什么时候它并不快。
如果一条复杂 SQL 要在多处用到同一份中间结果:
SELECT ...
FROM (
SELECT ... FROM big_table WHERE ...
) t1
JOIN (
SELECT ... FROM big_table WHERE ...
) t2 ON ...
子查询会被重复执行多次。
改成临时表:
CREATE TEMPORARY TABLE tmp_t AS
SELECT ... FROM big_table WHERE ...;
SELECT ...
FROM tmp_t t1
JOIN tmp_t t2 ON ...;
✅ 只算一次,后续直接读结果
✅ 对复杂报表、ETL 很有效
临时表:
✅ 并发场景下更稳定
✅ 不会阻塞其他业务表
很多数据库允许在临时表上建索引:
CREATE TEMPORARY TABLE tmp (
id INT,
name VARCHAR(100)
);
CREATE INDEX idx_name ON tmp(name);
而子查询 / CTE 往往不能用索引(取决于数据库和执行计划)
✅ 对多轮 JOIN、过滤非常有用
如:
MEMORY 引擎临时表temp_bufferstempdb 优化✅ 比磁盘表快很多
✅ 适合中小数据量
优化器对一条超长 SQL 容易“算错计划”
拆成临时表后:
SELECT * FROM t WHERE id=1;
用临时表纯属多此一举
tempdb 容易成为瓶颈(SQL Server 典型问题)| 方式 | 是否缓存结果 | 是否可建索引 | 适合场景 |
|---|---|---|---|
| 子查询 | 否 | 否 | 简单、一次性 |
| CTE | 通常否 | 否 | 可读性优先 |
| 临时表 | ✅ 是 | ✅ 是 | 复杂、复用 |
临时表性能更好,是因为它把“算一次、存下来、反复用”这件事做对了;
而不是因为它本身天生比普通表快。
如果你愿意,可以告诉我:
我可以直接帮你判断该不该用临时表。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。