2010-07-14 23 views
1

TABLE_A = 7022536行計數()查詢到20秒以上

表-B(GTT)= 5601行

查詢:

SELECT COUNT (a.ssn_head) 
    FROM table_a a, table_b b 
    WHERE b.hoh = a.head AND a.flag = 'Y'; 

花費20多秒,使17214條記錄。

解釋計劃是:

Plan hash value: 1901401324 
-------------------------------------------------------------------------------- 
| Id | Operation   | Name       | Rows | Bytes | C 
-------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT |        |  1 | 25 | 1 
| 1 | SORT AGGREGATE  |        |  1 | 25 | 
|* 2 | HASH JOIN   |        | 114K| 2801K| 1 
| 3 | TABLE ACCESS FULL| table_b      | 49188 | 528K| 
| 4 | REMOTE   | table_a      | 7022K| 93M| 1 
-------------------------------------------------------------------------------- 

table_b(GTT)上有沒有索引...我想既然查詢正在經歷的所有表-B的,它會永遠做一個全表scan..right?

table_ahead

什麼其他辦法還有什麼能讓這個查詢運行得更快指數?

+1

將table_a移動到與table_b相同的服務器? – 2010-07-14 23:04:34

+0

希望這是一個選項> _ < – 2010-07-14 23:08:46

+0

考慮b.hoh上的索引和NOT NULL約束。 請參閱http://stackoverflow.com/questions/721556/oracle-10g-optimize-where-is-not-null – PenFold 2010-07-15 10:41:24

回答

5

是不是在table_b獨特?如果是這樣,那麼

SELECT COUNT (a.ssn_head) 
FROM table_a a, table_b b 
WHERE b.hoh = a.head AND a.flag = 'Y'; 

是邏輯上等同於

SELECT COUNT (a.ssn_head) 
FROM table_a a 
WHERE a.flag = 'Y' 
and a.head in (select hoh FROM table_b); 

鑑於較大的數據量是在遠程服務器上,我建議推查詢那邊與DRIVING_SITE提示。

SELECT /*+DRIVING_SITE (r) */ COUNT (r.col_a) 
FROM [email protected] r 
WHERE r.col_b in (select l.col_c FROM local l); 

這應該使用同義詞而不是table @ dblink。但它可能不會有意見。

3

在本地服務器上創建table_a的物化視圖並以此爲操作。

它也可能有助於(溫和地)在a.flag上設置索引,但與本地操作相比,這將是次要的。

+0

您將需要在遠程系統上添加物化視圖日誌,否則您將無法執行'快速刷新'你的'本地化'MV。 – PenFold 2010-07-15 13:46:34