我正在嘗試對洗掉程序使用以下陳述句,它必須洗掉大約 23566424 行,但 oracle 需要將近 3 個小時才能完成該程序,而且我們已經在“SCHEDULE_DATE_KEY”上創建了一個索引,但該程序仍然很慢. 有人可以建議如何在 oracle 中更快地洗掉
DELETE
FROM
EDWSOURCE.SCHEDULE_DAY_F
WHERE
SCHEDULE_DATE_KEY >
(
SELECT
LAST_PAYROLL_DATE_KEY
FROM
EDWSOURCE.LAST_PAYROLL_DATE
WHERE
CURRENT_FLAG = 'Y'
);
uj5u.com熱心網友回復:
我認為這里沒有任何索引會有所幫助,可能 Oracle 會決定最好的方法是全表掃描以從 300M 中洗掉 20M 行。它以每秒超過 2000 行的速度洗掉,這還不錯。事實上,任何額外的索引都會減慢它的速度,因為它也必須從索引中洗掉行條目。
一種更快的方法可能是創建一個包含要保留的行的新表,例如:
create table EDWSOURCE.SCHEDULE_DAY_F_KEEP
as
select * from EDWSOURCE.SCHEDULE_DAY_F
where SCHEDULE_DATE_KEY <=
(
SELECT
LAST_PAYROLL_DATE_KEY
FROM
EDWSOURCE.LAST_PAYROLL_DATE
WHERE
CURRENT_FLAG = 'Y'
);
然后重新創建任何約束和索引以使用新表。
最后洗掉舊表并重命名新表。
uj5u.com熱心網友回復:
您可以嘗試測驗過濾后的表格移動。這有一個在線條款。因此,您可以在應用程式仍在運行時執行此操作。
注意 12.2 和更高版本的索引將保持有效。在早期版本中,您將需要重建索引,因為它們將變得無效。祝你好運
移動表 創建并填充新的測驗表。
DROP TABLE t1 PURGE;
CREATE TABLE t1 AS
SELECT level AS id,
'Description for ' || level AS description
FROM dual
CONNECT BY level <= 100;
COMMIT;
檢查表的內容。
SELECT COUNT(*) AS total_rows,
MIN(id) AS min_id,
MAX(id) AS max_id
FROM t1;
TOTAL_ROWS MIN_ID MAX_ID
---------- ---------- ----------
100 1 100
SQL>
移動表,過濾掉 ID 值大于 50 的行。
ALTER TABLE t1 MOVE ONLINE
INCLUDING ROWS WHERE id <= 50;
檢查表的內容。
SELECT COUNT(*) AS total_rows,
MIN(id) AS min_id,
MAX(id) AS max_id
FROM t1;
TOTAL_ROWS MIN_ID MAX_ID
---------- ---------- ----------
50 1 50
SQL>
ID 值介于 51 和 100 之間的行已被洗掉。
如上所述,如果最好對表進行磁區,則作為日常任務的一部分,每 N 天洗掉一個磁區。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/369926.html
