这是一个有点悬而未决的问题,但我真的很想听听人们的意见。
我很少使用显式声明的临时表(表变量或常规的#tmp表),因为我认为不这样做会使T-SQL更加简洁、可读和可调试。我还认为,在需要临时存储时(例如在查询中使用派生表时),SQL可以比我更好地利用临时存储。
唯一的例外是数据库不是典型的关系数据库,而是星形或雪花模式。我知道最好先对事实表应用筛选器,然后使用生成的临时表从维度中获取值。
这是普遍的观点,还是有人持相反的观点?
发布于 2009-01-15 15:38:46
临时表对于报告或ETL作业等复杂的批处理过程最有用。通常,您希望在事务性应用程序中很少使用它们。
如果您正在进行涉及多个大表(可能是针对报表)的连接的复杂查询,那么查询优化器实际上可能无法在一次命中中优化这一点,因此临时表在这里成为一种优势-它们将查询分解成一系列更简单的查询,从而减少查询优化器搞砸计划的机会。有时,您有一个操作根本无法在一条SQL语句中完成,因此必须执行多个处理步骤才能完成此工作。同样,我们在这里讨论的是更复杂的操作。
您还可以为中间结果创建一个tempory表,然后对该表进行索引,甚至可以将聚集索引放在该表上以优化后续查询。在不允许将索引添加到数据库架构的系统上,这也可能是优化报表查询的一种快速而糟糕的方法。SELECT INTO对于这种类型的操作很有用,因为它的日志记录最少(因此速度也很快),并且不需要对齐select和insert的列。
其他原因可能包括使用交叉应用和xpath查询从XML字段提取数据。通常,将其提取到临时表中,然后在临时表中工作,效率会高得多。对于某些任务,它们也比CTE快得多,因为它们物化了查询结果,而不是重新评估查询。
需要注意的一点是,临时表与查询引擎用来存储中间连接结果的结构完全相同,因此使用临时表不会影响性能。临时表还允许使用集合操作的多阶段任务,并使游标在T-SQL代码中几乎(不完全但几乎)是不必要的。
“代码气味”有点言过其实,但如果我看到很多涉及临时表的简单操作,我会想这是怎么回事。
发布于 2009-01-15 15:33:10
这真的取决于你在做什么。我通常尽量避免它们,但有时你需要做一些复杂的事情,需要多个步骤。一般来说,这远远超出了简单的select from table内容。就像其他工具一样,它是一个你必须知道什么时候使用的工具。
我同意你的看法,我通常让数据库在幕后处理事情,但有时它的优化是关闭的,你必须进入并手动完成。
发布于 2009-01-15 15:16:30
我认为临时表是一种SQL代码味道,只能作为最后的手段使用。如果你必须在得到最终结果集之前缓存数据,那么在我看来,这通常意味着糟糕的DB设计。
https://stackoverflow.com/questions/447115
复制相似问题