Oracle100w資料大表割接

2022-08-15 16:18:20 字數 1142 閱讀 4545

以下:表名:tb_name 欄位名:col_name 現網資料量估計100w

【失敗嘗試1】

alter table tb_name modify (col_name nvarchar2(128));
因為現網字段有資料,所以會報錯誤「ora-01439:要更改資料型別,則要修改的列必須為空」。

注意:不是所有修改字段型別,有資料就都會報這個錯誤,像給nvarchar2增加長度,不會影響原來的資料,肯定就不報這個錯。

【失敗嘗試2】

--修改原欄位名col_name為col_namebak

alter table tb_name rename column col_name to col_namebak;

--增加乙個和原欄位名同名的字段col_name

alter table tb_name add col_name varchar2(128);

--將備份col_namebak資料更新到增加的字段col_name

update tb_name set col_name=col_namebak;

--更新完,刪除備份欄位col_namebak

alter table tb_name drop column col_namebak;

這樣儘管不會報ora-01439錯誤,但是因為現網有100w的內容,在更新完統一commit會,消耗很多時間,這樣就需要分批次提交。

【成功嘗試】

--待編輯cur的定義,檢查sql的daemon

declare

v_count number;

begin

for cur in (select t.rowid from tb_name t) loop

update tb_name set col_name=col_namebak;

v_count := v_count + 1;

if v_count >= 5000 then

commit;

end if;

end loop;

commit;

end;

/

這樣,更新語句會每5000次提交1次,消耗時間會縮短一半多。

【參考】

mysql 聯表查詢 100w 資料優化

閒來無事,使用vue封裝了個table元件,封裝完成後想測試下,資料量小的情況下,能迅速展現資料,資料上了100w後,直接超時,結果一步步排查,發現是sql查詢的問題 使用表 訂單表 order 100w 商品表goods 使用者表 user 未優化前sql查詢語句 select o.order i...

快速向表中插入100W條資料 sql

set nocount on use master go 判斷資料庫testdb是否存在,即建立資料庫 ifdb id testdb is null create database testdb gouse testdb go 判斷nums 表是否存在,存在即將其刪除 ifobject id dbo...

oracle大表刪除資料方案

需求簡介 生產資料庫乙個表有27億多資料,要刪除其中其中2014年之前的歷史資料 大約4億左右 表資訊 5個字段的主鍵 乙個欄位的單列索引 hash分割槽。資料庫情況 每日1 00 9 00會跑增量資料程式,其他sql不能影響增量程式。所以資料要在9 00 24 00之內跑完 解決方案1 delet...