有时我们可以同时使用派生表和临时表编写查询。我的问题是哪个更好?为什么?
派生表是一种逻辑构造。
可以将其存储在中tempdb,在运行时通过在每次访问时重新评估基础语句来构建,甚至可以对其进行优化。
tempdb
临时表是一种物理构造。它是在tempdb其中创建的表,并在其中填充了值。
哪种更好取决于查询所使用的查询,用于派生表的语句以及许多其他因素。
例如,每次使用时都可以(并且很可能会)重新评估CTEin中的(公用表表达式)SQL Server。该查询:
CTE
SQL Server
WITH q (uuid) AS ( SELECT NEWID() ) SELECT * FROM q UNION ALL SELECT * FROM q
将 最有可能 产生两个不同NEWID()的。
NEWID()
在这种情况下,应使用临时表,因为它可以保证其值持久存在。
另一方面,此查询:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn FROM master ) q WHERE rn BETWEEN 80 AND 100
最好使用派生表,因为使用临时表将需要从中获取所有值master,而此解决方案将只100使用索引on扫描第一条记录id。
master
100
id