讓我重新:
CREATE TABLE RNS_RECON_HO (PROD_CODE NUMBER,
REFR_NUMB NUMBER,
NARR_1 VARCHAR2 (25),
SEQN_NUMB NUMBER primary key );
CREATE INDEX TESTTT ON RNS_RECON_HO (PROD_CODE);
CREATE INDEX TESTTT1 ON RNS_RECON_HO (REFR_NUMB);
CREATE INDEX TESTTT2 ON RNS_RECON_HO (NARR_1);
現在複製你的計劃:
SET AUTOTRACE ON
UPDATE
RNS_RECON_HO C
SET
C.REFR_NUMB =
(SELECT
SEQN_NUMB
FROM
RNS_RECON_HO P
WHERE
P.NARR_1 = C.NARR_1
AND P.SEQN_NUMB = P.REFR_NUMB
AND P.PROD_CODE = PROD_CODE)
WHERE
C.PROD_CODE = 0
AND C.REFR_NUMB = 0
AND C.NARR_1 = '3/13/201211013198693442091';
0 rows updated.
Execution Plan
----------------------------------------------------------
0 UPDATE STATEMENT Optimizer Mode=ALL_ROWS (Cost=2 Card=1 Bytes=78)
1 0 UPDATE RNS_RECON_HO
2 1 TABLE ACCESS FULL RNS_RECON_HO (Cost=2 Card=1 Bytes=78)
3 1 TABLE ACCESS BY INDEX ROWID RNS_RECON_HO (Cost=5 Card=1 Bytes=91)
4 3 INDEX RANGE SCAN TESTTT (Cost=1 Card=1)
Statistics
----------------------------------------------------------
190 recursive calls
0 spare statistic 3
0 gcs messages sent
25 db block gets from cache
0 physical reads direct (lob)
0 queue position update
0 queue single row
0 queue ocp pages
0 HSC OLTP Compressed Blocks
0 HSC IDL Compressed Blocks
0 rows processed
原因:
優化只會選擇,如果它是便宜,使用索引(少讀取)比表掃描。這通常意味着WHERE子句條件需要映射到索引的前導(即最左邊)列。因此,在where子句列中添加一個索引(PROD_CODE,REFR_NUMB,NARR_1)可以避免這種情況。
爲了確認檢查這一個
CREATE INDEX TESTTT3 ON RNS_RECON_HO (PROD_CODE, REFR_NUMB, NARR_1);
SET AUTOTRACE ON
UPDATE
RNS_RECON_HO C
SET
C.REFR_NUMB =
(SELECT
SEQN_NUMB
FROM
RNS_RECON_HO P
WHERE
P.NARR_1 = C.NARR_1
AND P.SEQN_NUMB = P.REFR_NUMB
AND P.PROD_CODE = PROD_CODE)
WHERE
C.PROD_CODE = 0
AND C.REFR_NUMB = 0
AND C.NARR_1 = '3/13/201211013198693442091';
0 rows updated.
Execution Plan
----------------------------------------------------------
0 UPDATE STATEMENT Optimizer Mode=ALL_ROWS (Cost=1 Card=1 Bytes=78)
1 0 UPDATE RNS_RECON_HO
2 1 INDEX RANGE SCAN TESTTT3 (Cost=1 Card=1 Bytes=78)
3 1 TABLE ACCESS BY INDEX ROWID RNS_RECON_HO (Cost=27 Card=1 Bytes=91)
4 3 INDEX FULL SCAN TESTTT3 (Cost=26 Card=1)
Statistics
----------------------------------------------------------
1 recursive calls
0 spare statistic 3
0 gcs messages sent
0 db block gets from cache
0 physical reads direct (lob)
0 queue position update
0 queue single row
0 queue ocp pages
0 HSC OLTP Compressed Blocks
0 HSC IDL Compressed Blocks
0 rows processed
但這僅僅是改變計劃,但從來沒有承諾任何性能提升,與你給有限的投入。
跟進:
外部查詢是怎麼回事FTS因爲它忽略了指數。所以,當我們放置一個組合鍵時,索引對於優化器是直接的,並且使用相同的索引。子查詢使用索引,因爲它與索引列上的外部查詢連接。
如何確定確切的計劃無法達到100%,儘管您可以通過遵循核心規則接近可能的執行計劃。
什麼是您的主鍵?你有什麼指數?你有分區嗎? – SriniV
@realspirituals'seqn_numb'是PK,所有查詢的字段都被索引,並且表被分區。 – bjan
您可以發佈您的創建表,索引腳本嗎?或者在sqlfiddle.com中設置它 – SriniV