2013-05-28 111 views
0

我有3個表交易者,city_state,city_present。Oracle SQL查詢性能

我在交易員表中有400萬行,我的查詢至少需要20秒。 city_present和cities表中幾乎沒有記錄。

以下是我的查詢。

 
    

select t.trader_id, t.name, t.city, t.state from ( SELECT distinct c.city, c.state FROM city_present p,city_state c WHERE p.name = 'TEST_TEST' AND c.city = p.city AND c.state = p.state ) cs, trader t where AND t.city = cs.city AND t.state = cs.state AND t.name = 'john test' AND t.is_valid= 1

我對客戶(市,州,名稱,valid_customer)指數 子查詢所需的時間比第二個是20秒左右服用..它是外部查詢較少。

有人可以幫助我如何減少查詢時間。

+1

對於初學者來說,顯示解釋計劃將有所幫助。 – OldProgrammer

+0

您的查詢返回了多少行? –

回答

0

我假設你有一個trader.name的索引,可能還包括trader.is_valid?

而且是真正需要的區別嗎?這是否真的需要成爲一個內聯視圖,還是可以成爲一個常規聯接?

+0

約返回35行。 – user12121

+0

我是否需要在交易者名稱,is_valid,城市,州列或只是名稱和is_valid列索引? – user12121

+0

您幾乎可以肯定需要將trader.name作爲最小索引。無論您是否需要is_valid上的一個,都取決於它能夠節省多少時間,以便能夠從索引中找到is_valid = 1,而無需轉到表格。每個is_valid值有多少行?您可能不需要索引中的所有交易者列 - 請先嚐試。 –

0

有一些事情你可以嘗試不添加任何東西到您的模式:在你的子查詢,你永遠不會選擇city_present什麼,所以你可以把它變成IN/EXISTS

select t.trader_id, t.name, t.city, t.state from 
(
SELECT c.city, c.state 
FROM city_state c 
WHERE EXISTS (
    select null 
    from city_present p 
    where 
    p.name = 'TEST_TEST' 
    AND c.city = p.city 
    AND c.state = p.state) 
) 
cs, trader t 
where 
AND t.city = cs.city 
AND t.state = cs.state 
AND t.name = 'john test' 
AND t.is_valid= 1 

然後,同樣的道理也適用到CS。所以,你可以改寫爲:

select t.trader_id, t.name, t.city, t.state from 
trader t 
where 
exists (
    SELECT null 
    FROM city_state c 
    WHERE EXISTS (
     select null 
     from city_present p 
     where 
     p.name = 'TEST_TEST' 
     AND c.city = p.city 
     AND c.state = p.state) 
    AND t.city = c.city 
    AND t.state = c.state 
) 
AND t.name = 'john test' 
AND t.is_valid= 1 

您也可以嘗試壓扁的子查詢:

select t.trader_id, t.name, t.city, t.state from 
trader t 
where 
exists (
    SELECT null 
    FROM city_present p,city_state c 
    WHERE p.name = 'TEST_TEST' 
    AND c.city = p.city 
    AND c.state = p.state 
    AND t.city = c.city 
    AND t.state = c.state 
) 
AND t.name = 'john test' 
AND t.is_valid= 1 

從這裏,你應該調查關於索引:

  • trader.name和/或交易.id
  • (city_state.city,city_state.state)and(city_present.city,city_present.state)
+0

謝謝,添加索引後性能有所提高。 – user12121