回答

收藏

SQL Server使用中临时表

技术问答 技术问答 324 人阅读 | 0 人回复 | 2023-09-14

这是一个悬而未决的问题,但我真的很想听听人们的意见。
; A* I5 t8 i1 `我很少使用显式声明的临时表(表变量或常规)#tmp表),因为我认为不这样做会导致更简洁、可读性和可调试性T-- H$ c5 {! U2 u& m' H7 J
SQL。我还认为,当需要临时存储时(例如,在查询中使用衍生表)SQL相比,SQL能做得更好。
8 t3 h9 _. F- \% A唯一的例外是,当数据库不是典型的关系数据库,而是星形或雪花模式时。我知道最好先将过滤器应用于事实表,然后使用生成的临时表从维度中获得值。0 f( B1 p- h* N3 [
这是普遍观点还是有人反对?
, z) e' d1 F/ k# K9 s* [) q0 w2 B                                                                $ V, L/ T8 j1 o2 Q2 D4 L" F/ I; o
    解决方案:                                                               
) R- M" T( N5 \$ Q                                                                临时表等ETL复杂的批处理,如操作,是最有用的。通常,你希望在事务应用程序中很少使用它们。
- K8 B) e/ h+ d* Z如果您想使用包含多个大表(可能是报表)的连接进行复杂的查询,查询优化器实际上可能无法一次完成优化,因此临时表将在这里非常成功-
: y4 ~# q: X: F, e" K- V2 _它们将查询分解为一系列简单的解决方案,以减少查询优化器搞砸计划的机会。有时你根本不能在一个人SQL在句子中完成一个操作,所以要完成这个工作,必须执行多个处理步骤。同样,我们在这里讨论的是更复杂的操作。
# k8 Q6 y# Y( ?0 f您还可以为中间结果创建一个临时表,然后为表建立索引,甚至可以放置集群索引来优化后续查询。这也可能是一种快速和肮脏的方法,在系统上优化报表查询,不允许向数据库架构添加索引。SELECT
% H+ T& O# i3 G1 s! `INTO这种类型的操作非常有用,因为它的日志记录最少速度快),不需要对齐select和insert的列。- H6 I6 u, J, B, n9 ?
其他原因可能包括使用CROSS0 t( u# V# Z( {/ ]% b7 o1 z
APPLY和xpath查询从XML从字段中提取数据。通常,将其提取到临时表中,然后在临时表中工作会更有效。它们比某些任务更有效CTE更快,因为它们实现了查询结果,而不是重新评估查询。0 M8 |* D5 y( k* O9 ?' ]
需要注意的是,临时表与存储中间连接结果的查询引擎完全相同,因此不会造成性能损失。临时表也允许使用set操作多阶段任务,使T-
! r( M) w' ?9 x2 K' ]" c, `( A. `% MSQL代码中的游标几乎(不是,但几乎但几乎)不必要。" C( c  ^$ N. M' b+ c) E& f
代码气味是一种夸张的说法,但如果我看到很多简单的临时表操作,我想知道发生了什么。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则