優化過程詳解 1.1. 第一次優化處理龐" name="description" />
本文已經發表在ITPUB優化技術叢書,未經許可,不得轉載。
本文已經發表在ITPUB優化技術叢書,未經許可,不得轉載。
回到我們最初的需求,首先看看這個刪除工作的基本語句,請注意這個IN 操作,由于這個TEMP_MID_HUBEI 表有130多萬行記錄,這將是一個多么龐大的IN-LIST!
DELETE from SSF WHERE mid IN (SELECT mid FROM TEMP_MID_HUBEI);
|
下面,我們在測試環境下看看,系統機器空閑,資源極大豐富,數量比真實環境小很多的情況下,這條刪除語句的執行效率:
SQL> DELETE from SSF WHERE mid IN (SELECT mid FROM TEMP_MID_HUBEI);
18 rows deleted.
Elapsed: 00:05:35.79 SQL>rollback;
|
我你們看到原始的刪除語句需要大約5分半鐘。
現在,我們使用RBO(加上 RULE HINT),觀察一下語句的執行情況:
SQL> DELETE /*+ RULE */ from SSF WHERE mid IN (SELECT mid FROM TEMP_MID_HUBEI);
18 rows deleted.
Elapsed: 00:00:47.27 SQL>rollback;
|
我們看到,這條語句的執行時間縮短到只需要47秒鐘,單條語句的執行效率提高了7倍以上,這也就是我們常說的,對付IN-LIST或者大量OR條件的一大有利武器。
好了,我們現在如果在生產庫上直接運行修改后的delete語句來刪除數據性能會提高多少呢?會是我們看到的7倍么?
我將刪除操作所涉及到的所有表的操作寫成一個腳本,首先使用少量行刪除的操作做測試,得到如下的測試結果:
oracle@db02:/oracle/lunar > cat nohup.out
SQL*Plus: Release
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to: Oracle9i Enterprise Edition Release With the Partitioning and Real Application Clusters options JServer Release
37 rows deleted. henan_SUBSO
Elapsed: 00:06:39.81
Commit complete.
Elapsed: 00:00:00.01
4 rows deleted. hubei_SUB
Elapsed: 00:02:42.71
Commit complete.
Elapsed: 00:00:00.01
1 row deleted. hubei_SUBSC
Elapsed: 01:31:51.25
Commit complete.
Elapsed: 00:00:00.01
18727 rows deleted. hubei_SUBNFO
Elapsed: 00:01:35.55
Commit complete.
Elapsed: 00:00:00.01
21 rows deleted. fujian_SUINFO
Elapsed: 00:00:15.49
Commit complete.
Elapsed: 00:00:00.01
35423 rows deleted. GINFO
Elapsed: 00:02:19.80
Commit complete.
Elapsed: 00:00:00.04 Disconnected from Oracle9i Enterprise Edition Release With the Partitioning and Real Application Clusters options JServer Release oracle@db02:/oracle/lunar > |
嗯,看到上面可喜的結果,我決定進行第二次優化,分段處理,也就是將所有超過10000條以上的刪除操作拆分成小段操作(比如,以10000條記錄為標準刪除記錄,然后提交)。