日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CTAS VS create table and then insert

發布時間:2025/3/14 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CTAS VS create table and then insert 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
很多情況下我們都會需要復制源表數據以達到冗余數據的目的,那么到底是使用CREATE TABLE AS SELECT的CTAS方式,還是先建好表的結構然后再插入數據好呢? 我們來看看這2種方式的不同表現: SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi PL/SQL Release 10.2.0.4.0 - Production CORE 10.2.0.4.0 Production TNS for Linux: Version 10.2.0.4.0 - Production NLSRTL Version 10.2.0.4.0 - ProductionSQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 1 Next log sequence to archive 2 Current log sequence 2/* 數據庫處于歸檔模式下 */SQL> select ss.name,ms.value from v$mystat ms,v$sysstat ss2 where3 ms.statistic#=ss.statistic#4 and ss.name in ('undo change vector size','redo size'); NAME VALUE ---------------------------------------------------------------- ---------- redo size 0 undo change vector size 0SQL> create table YOUYUS as select * from dba_objects; Table created.SQL> select ss.name,ms.value from v$mystat ms,v$sysstat ss2 where3 ms.statistic#=ss.statistic#4 and ss.name in ('undo change vector size','redo size'); NAME VALUE ---------------------------------------------------------------- ---------- redo size 5783384 undo change vector size 15408 /* CTAS方式產生了少量的undo,可以猜想其使用直接路徑方式插入,Oracle僅產生維護數據字典的undo */SQL> drop table YOUYUS; Table dropped.SQL> conn / as sysdba Connected./* 清理現場 */SQL> create table YOUYUS as select * from dba_objects where 0=1; Table created.SQL> select ss.name,ms.value from v$mystat ms,v$sysstat ss2 where3 ms.statistic#=ss.statistic#4 and ss.name in ('undo change vector size','redo size');NAME VALUE ---------------------------------------------------------------- ---------- redo size 19492 undo change vector size 5680/* 建立空表YOUYUS,同樣需要維護數據字典 */SQL> insert into YOUYUS select * from dba_objects;50729 rows created.SQL> commit;Commit complete.SQL> select ss.name,ms.value from v$mystat ms,v$sysstat ss2 where3 ms.statistic#=ss.statistic#4 and ss.name in ('undo change vector size','redo size');NAME VALUE ---------------------------------------------------------------- ---------- redo size 5743540 undo change vector size 203904/* 普通insert操作產生了遠大于CTAS的undo */SQL> drop table YOUYUS; Table dropped.SQL> conn / as sysdba Connected.SQL> select ss.name,ms.value from v$mystat ms,v$sysstat ss2 where3 ms.statistic#=ss.statistic#4 and ss.name in ('undo change vector size','redo size');NAME VALUE ---------------------------------------------------------------- ---------- redo size 0 undo change vector size 0SQL> create table YOUYUS as select * from dba_objects where 0=1; Table created.SQL> insert /*+ append */ into YOUYUS select * from dba_objects; 50729 rows created.SQL> commit;Commit complete.SQL> select ss.name,ms.value from v$mystat ms,v$sysstat ss2 where3 ms.statistic#=ss.statistic#4 and ss.name in ('undo change vector size','redo size'); NAME VALUE ---------------------------------------------------------------- ---------- redo size 5781712 undo change vector size 14808/* 建表后直接路徑插入方式與CTAS產生的redo和undo數量大致相仿 */ 從資源消耗的角度講CTAS或直接路徑插入方式有一定優勢,如果啟用nologging選項的話這種優勢會更加顯著。

轉載于:https://www.cnblogs.com/macleanoracle/archive/2010/09/07/2967529.html

總結

以上是生活随笔為你收集整理的CTAS VS create table and then insert的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。