簡體   English   中英

如何使用新分區將數據從TableA復制到TableB?

[英]How to copy data from TableA to TableB with new partitions?

我有具有成千上萬行的TableA,並且它的大小仍在增加。 在沒有分區的情況下,速度已顯着下降。

因此,我創建了一個名為TableB的新表,該表與Oracle SQL Developer中的TableA(名稱和類型)完全相同。 (TableA和TableB在同一數據庫中,但不在同一表中)我還為TableB創建了分區。

現在,我要做的就是從TableB復制TableA的所有數據,以測試查詢的速度。

為了測試帶有分區的表的速度,由於TableB具有與A相同的列,因此我決定復制所有數據。

insert into TableB ( select * from TableA);

我從上面的語句中期望的是要復制的數據,但是我得到了錯誤:

從第1行開始的錯誤-插入TableB(從TableA中選擇*)從命令行開始的錯誤:1列:1錯誤報告-SQL錯誤:ORA-54013:在虛擬列54013上不允許執行INSERT操作。0000-“ INSERT操作不允許在虛擬列上使用” * *原因:試圖將值插入虛擬列中*操作:重新發布該說明,但不提供虛擬列的值

我查了看虛擬專欄,好像是

“當查詢虛擬列時,它們似乎是普通表列,但是它們的值是派生的而不是存儲在磁盤上。下面列出了定義虛擬列的語法。”

但是,我在TableB中沒有任何數據。 TableB僅具有與TableA匹配的列,因此我不確定在沒有什么可派生的情況下如何派生我的列?

您可以使用查詢

SELECT column_name, virtual_column
  FROM user_tab_cols
 WHERE table_name = 'TABLEA';

COLUMN_NAME VIRTUAL_COLUMN
----------- --------------
ID          NO
COL1        NO
COL2        NO
COL3        YES

然后使用

INSERT INTO TABLEB(ID,COL1,COL2) SELECT ID,COL1,COL2 FROM TABLEA;

要從虛擬列中排除,這些是從其他列的值中計算出來的。

您是否還使用派生列創建表B? 從您的問題,我想您也用虛擬列創建了tableB。

您需要注意的一件事是,由於您要插入大量記錄,請使用批量模式以加快操作速度。 請注意-您無需在下面的語句中包含虛擬列,因為它們會即時計算出來。

insert  /*+ APPEND */   into tableB (column1, column2,...columnn) select column1, column2,...columnn from TableA

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM