2013-11-28 51 views
0

在Oracle pl/sql中,我加入了幾張表並將其插入到另一個表中,這會導致成千上萬/拉赫或它可能以百萬計。可以插入爲將行插入到表中的限制(Oracle)

insert into tableA 
select * from tableB; 

由於行數會有任何失敗的機會嗎? 或者有沒有更好的方法來插入更​​多的記錄的情況下的值。

由於提前

+1

一個使用關係數據庫,因此您不必通過將數據歸一化到單獨的表中並將它們按需連接到過濾器來重複數據。創建產品表與此理念背道而馳。如果您想混淆連接,請使用VIEW而不是創建另一個表。 –

+1

這是一個生產系統嗎?數據是否需要在先前的備份中可以恢復,以備稍後發生介質故障時使用?你有足夠的磁盤空間嗎? –

+0

@大衛:是的,它是一個生產系統。我們將在Lakhs中記錄最大記錄數不是Milliions。 –

回答

2

好了,一切都在機器內部有限的,所以如果選擇返回太多行,它肯定是不行的(雖然有一定maaany行,數量取決於你的存儲和內存大小,操作系統以及其他方面)。

如果您認爲您的查詢可以超出限制,那麼請批量插入,並在每批之後提交。當然,你需要知道,如果你決定取消該過程的50%的插入物,你必須做一些事情(因爲rollback在這裏不會有用)。

+0

我們可以使用批量收集選項嗎? –

+0

對於BULK,您需要首先將所有內容放入變量中,如果您的行數太多,您會嘗試在一次調用中遇到問題。我建議你檢查一下你是否真的有很多行,也許你低估了你的系統(因爲在某些機器設置中,甚至數百萬行可能是一個簡單的任務)。如果您不低估它,那麼請確保:通過提交每個X行來執行批量插入。 – MondKin

+0

我看不出結果集的最大大小如何取決於操作系統......可能是內存,當然可用的磁盤空間。 –

1

我推薦的步驟是不同的,因爲當你使用SQL和PL/SQL的一個SQL語句來裝載更多數據性能通常會增加:

  1. 我會建議您檢查您的回滾段(RBS段)的大小和可能會爲此類交易帶來更大的專用網絡。
  2. 對於插入,您可以說'回滾消耗'='插入的數據量'。您知道數據庫統計信息中的典型行寬(請參閱analyze table tableB compute statistics for table for all columns for all indexes之後的user_tables)。
  3. 確定每次迭代可以插入多少行。
  4. 在大插入和提交中插入此數據量。
  5. 重複。
  6. 鎖定通常是不插一個問題,因爲什麼還不存在,無法被鎖定:-)

當分區表上運行,你可能要考慮不同的方案,允許(子)分區一起分配工作。當通過從文本文件加載來使用SQL * Loader時,您可能也會使用不同的方法,例如直接路徑,它會在不使用SQL引擎的情況下將預格式化的數據塊添加到數據庫,而不是讓RDBMS處理SQL。

0

要創建有限數量的行,您可以使用ROW_NUM這是一個僞列。

例如,可以從另一個表中創建10,000行的表格,您可以使用其中的50,000行。

insert into new_table_name select * from old_table_name where row_num<10000;