为什么CREATE TABLE AS SELECT比SELECT INSERT更快
技术问答
195 人阅读
|
0 人回复
|
2023-09-14
|
我使用INNER JOIN进行查询,结果为1200万行。我喜欢把它放在桌子上。我做了一些测试,当我使用AS# ?& F6 I& e5 B2 Y
SELECT子句创建表时,比先创建表并在运行SELECT之后运行INSERT更快。我不明白为什么。有人可以为我解释吗?ks/ @1 C3 u) e6 R% |
3 d) { P6 @; @1 U0 V! O解决方案:
. k0 O: w% ^' d9 N$ e& I% g: w
! G) w+ ~2 n! C9 ^5 G" O) Q: Z0 ?6 x. |. U" ~
; \ e3 h& n' J
如果您使用“选择创建表”(CTAS)8 m% W/ R" }2 }' D
CREATE TABLE new_table AS
" \ C( N: G: i SELECT *
! T5 \4 `; o3 ?7 A4 @, ^1 K FROM old_table
$ ]# Q; F8 P0 t6 e您会自动对数据进行 直接路径插入 。如果你做一个
2 R/ \! w, D* k- gINSERT INTO new_table AS ' A. v6 Z6 R2 Y* n6 O$ n8 I
SELECT * ' f. }; W7 n$ c0 V( U0 ]* l. R2 u6 N
FROM old_table5 t( F" T% e: U' |: S3 R
您执行 常规插入操作 。如果要执行直接路径插入,则必须使用APPEND提示。所以你要做
6 o2 \# j" }, L; Z) j" e9 B3 j/ xINSERT /*+ APPEND */ INTO new_table AS ! I7 x- z$ Y0 [. @% [: m
SELECT * ) L- f2 w, n! ?* i9 n
FROM old_table
& z3 O3 h0 T+ q, D( q' K获得与“在创建表中进行选择时相似”的性能。
0 V: E1 e9 L$ b- s9 G. ]5 N常规的常规刀片如何工作?
4 h. V, [ j& J& j( ~# k, WOracle检查 表的
6 h; l0 S( a# y3 P- _9 H3 ~' O可用列表5 [$ A# `3 }5 ^7 p8 g
中是否有可用空间的表段已使用块。如果该块不在缓冲区高速缓存中,则将其读入缓冲区高速缓存。最终,该块被读回到磁盘。在此过程中,将写入该块的撤消操作(此处仅需要少量数据),将更新数据结构,例如,如有必要,将更新的数据表保留在段头中,并将所有这些更改写入重做-
# n5 m5 O6 f8 `- i, ~6 T缓冲区也一样。
& ]' j6 ]. ?5 M! @1 ?直接路径插入如何工作?- ~( t0 u# h6 f3 b: S, z
该过程在表的 高水位线上方
& l& S, H4 v! S0 j) e% Z; j4 x分配空间,即超出已使用的空间。它将数据直接写入磁盘,而无需使用缓冲区高速缓存。并且还将其写入重做缓冲区。提交会话后,高水位标记将超出新的书面数据,并且其他会话现在可以看到此数据。5 _0 b6 G( o, D+ g, G
如何改善CTAS和直接路径插入?
1 F& F, B; J# \1 o0 k7 x* I您可以在NOLOGGING模式下创建故事,而不写入任何重做信息。如果执行此操作,则应在插入后对包含该表的表空间进行备份,否则,如果需要,将无法恢复该表。
; |$ m* ~; m$ h2 L, E, O) O% I3 b. z
您可以并行选择% D! p2 u" R" q$ o. h$ O
4 o" M0 y5 N- V
您可以并行插入
3 }0 w* s, u8 l9 ]! f6 b! j0 p8 ]) I( Q
如果在插入操作期间必须维护索引和约束,甚至触发,这可能会大大降低插入操作的速度。因此,您应该避免这种情况,并在插入之后创建索引,并可能使用novalidata创建约束。
5 t7 F5 B8 G5 s! A. A# p- J
4 D4 s6 _2 |1 X0 o7 N |
|
|
|
|
|