我使用 INNER JOIN 进行查询,结果是 1200 万行。
我喜欢把它放在桌子上。
我做了一些测试,当我使用子句 AS SELECT 创建表时,比先创建表然后使用 SELECT 运行 INSERT 更快。
我不明白为什么。
有人可以帮我解释一下吗?
塔克斯
如果您使用“创建表作为选择”(CTAS)
CREATE TABLE new_table AS
SELECT *
FROM old_table
你会自动做一个直接路径插入的数据。如果你做一个
INSERT INTO new_table AS
SELECT *
FROM old_table
你做了一个传统刀片。如果您想进行直接路径插入,则必须使用 APPEND 提示。所以你必须做
INSERT /*+ APPEND */ INTO new_table AS
SELECT *
FROM old_table
获得与“CREATE TABLE AS SELECT”类似的性能。
普通的传统刀片是如何工作的?
Oracle 检查空闲列表表段中已使用且仍有可用空间的块。如果该块不在缓冲区高速缓存中,则会将其读入缓冲区高速缓存。最终这个块被读回磁盘。
在此过程中,写入块的撤消(这里只需要少量数据),更新数据结构,例如如有必要,段头中的空闲列表和所有这些更改也会写入重做缓冲区。
直接路径插入如何工作?
该进程在上面分配空间高水位线表的空间,即超出已使用的空间。它将数据直接写入磁盘,不使用缓冲区高速缓存。并且它也被写入重做缓冲区。提交会话后,高水位线将超出新写入的数据,并且该数据现在对其他会话可见。
如何改进 CTAS 和直接路径插入?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)