使用临时表进行数据迁移与查询优化
当我们需要把一个数据库的数据迁移到另外一个数据库的时候,就可以大量使用临时表。临时表可以帮我们缓存临时数据,避免多次执行相同的查询。我们先把数据保存到临时表中,以后就不需要再反复执行 SELECT 查询。使用临时表也会使思路更清晰。
SELECT name,
(SELECT TOP 1 age FROM person p WHERE p.name = per.name AND p.id != per.id) AS age
INTO #temp
FROM person per
GROUP BY per.name, per.id
SELECT * FROM #temp -- 不需要每次都读取硬盘,因为数据已经保存到内存中的临时表了Code language: PHP (php)
有临时表的操作
SELECT * FROM person
WHERE age IN
(
SELECT age FROM #temp
)Code language: CSS (css)
没有临时表的情况
如果没有临时表,每次都要执行 IN 里面的 SELECT 语句,该语句读取的是硬盘中的实体表:
SELECT * FROM person
WHERE age IN
(
SELECT (SELECT TOP 1 age FROM person p WHERE p.name = per.name AND p.id != per.id) AS age
FROM person per
GROUP BY per.name, per.id
)Code language: PHP (php)
通过临时表将中间结果物化到 tempdb 中,后续多次引用时直接读取临时表,既减少了重复计算,也降低了 IO 开销,在复杂数据迁移场景中尤为实用。
Previous: timestamp
Next: ISNULL 函数用法