问题 在SQL中使用临时表是不好的做法?


也就是说,使用具有一些初始唯一数据的临时表,然后一次填充一个或多个字段。有时它会使代码看起来更具可读性,但它也会导致程序类型的思考。它也比使用派生表或其他方法慢。它在行业中是否气馁?


13115
2018-03-18 19:34


起源

@保罗: SQL?程序? - Quassnoi
@Quassnoi:我正在考虑在T-SQL / PL-SQL /等中使用临时表。在UDF和存储过程中,而不是基于集合的方式。这就是为什么我想看一个例子。 - Paul Sasik
@保罗: TSQL 和 PL/SQL 是可以嵌入声明性的过程语言 SQL 声明。你不应该被混淆 SQL 在他们的名字。 - Quassnoi
@Quassnoi:对于他们与SQL的关系并不感到困惑。我只是假设(可能很差)OP正在考虑通过特定SQL实现的过程功能来使用临时表。我应该首先要求澄清。 - Paul Sasik


答案:


如果所有基于集合的操作都是a)实现并且b)在所有引擎中有效,那将是一种不好的做法。

但是,对于某些任务(如模拟 LAG 和 LEAD 在 SQL Server,自动生成的级联上的长插入链 id 是几个表等),临时表或表变量是一个很好的解决方案。

您应该注意,临时表经常由引擎本身创建并删除,以用于涉及的操作 using temporary 在 MySQLspool 在 SQL Server 等等

因此,每次创建临时表时,您都应该问自己一个问题:

  • 我是否创建临时表因为我不知道基于集合的方式,或者因为我知道基于集合的方式但服务器(或优化器)不知道?

如果答案是“我知道但优化器没有”,则创建表。如果可能,优化器也会这样做。


13
2018-03-18 19:38