對錶進行ROWID切片

2021-09-19 15:56:19 字數 1380 閱讀 3137

前言

對於乙個很大的分割槽表驚喜update,delete,想要加快執行速度,可以按照分割槽,在不同的會話中對每個分割槽表單獨進行update,delete。但是對乙個很大的非分割槽表進行update,delete,如果只在乙個會話裡執行sql,很容易引起undo不夠,如果會話連線中斷,會導致大量資料從undo回滾,這將是一場災難!

解決方法

對於非分割槽表,我們可以對錶按照rowid切片,然後開啟多個視窗同時執行sql,這樣既能加快執行速度,還能減少對undo的占用。

例項

我們對scott賬戶下emp表按照每個extent進行rowid切片

select ' and rowid between ' || '''' ||

dbms_rowid.rowid_create(1,

b.data_object_id,

a.relative_fno,

a.block_id,

0) || '''' || ' and ' || '''' ||

dbms_rowid.rowid_create(1,

b.data_object_id,

a.relative_fno,

a.block_id + a.blocks - 1,

999) || ''';'

from dba_extents a, dba_objects b

where a.segment_name = b.object_name

and a.owner = b.owner

and b.object_name = 'emp'

and b.owner = 'scott'

order by a.relative_fno, a.block_id;

執行結果如下:

假如要執行delete from emp where empno > 50000000,emp表有1億的資料,

要刪除其中5000萬行資料, 根據上述方法對錶按照rowid切片

delete from emp where empno > 50000000 and rowid between 'aaar3saaeaaaacqaaa' and 'aaar3saaeaaaacxapn';

如果有多個切片, 則在不同的視窗去執行不同的sql語句就可以了。

補充

對字典表賦權

grant select on dba_extents to scott;

grant select on dba_objects to scott;

對錶進行水平劃分

如果乙個表的記錄數太多了,比如上千萬條,經常需要檢索,那麼我們就有必要化整為零。如果我拆成100個表,那麼每個表只有10萬條資料,當然這血藥在邏輯上可以分,乙個好的劃分依據,有利於資料的簡實現,也可以充分利用水平分表的優勢,比如系統介面上只提供按月查詢的功能,那麼把表差分成12個,每個查詢只查詢乙個...

oracle對錶空間進行操作

1.更改資料檔案大小 alter database datafile filename resize 大小 2.向表空間新增資料檔案 alter tablespace 表空間名 add datafile filename size 10 autoextend on 3.表空間唯讀 alter tab...

如何對錶操作進行監控

如何對錶操作進行監控 我們在跟蹤定位一些系統問題的時候,經常需要知道哪些地方對乙個表進行了操作,查詢 很麻煩,其實有乙個簡單的方法,就是跟蹤表,如下語句,就可以給表t table增加監控了。begin dbms fga.add policy test t table fga end 我們可以用下面語...