2009-05-26 197 views
1

我試圖從這個Oracle查詢中獲得更好的性能(這非常慢)。我是一名Oracle初學者,所以也許有人可以指出一個更好的方法來處理這個查詢。幫助優化Oracle查詢?

我有一張關於不同家庭信息的表格。我想根據關係類型提取不同的關係。我想出了這個解決方案使用哈希聯接查詢數據庫...

select * 
from (
    with target_person as (
    select 
     p.person_id, 
     p.family_number, 
     p.relationship_type_id 
    from 
     people p 
    where 
     p.relationship_type_id = 1 -- parent 
) 
    select 
    target_person.person_id, 
    related_person.related_person_id, 
    related_person.relationship_type_id 
    from 
    target_person, 
    people related_person 
    where 
    target_person.person_id != related_person.person_id 
    and target_person.family_number = related_person.family_number 
    and related_person.relationship_type_id = 1 
); 
+0

對於特定的查詢,如果您可以提供指向某個地方的鏈接以下載幾個表創建腳本和一些測試數據,這將會很有幫助 - 這就是我驗證我提出的任何解決方案的方式。很高興你得到了答案。 – 2009-05-26 20:00:49

回答

6

你意識到這相當於這個?:

select * 
from (
    with target_person as (
    select 
     p.person_id, 
     p.family_number, 
     p.relationship_type_id 
    from 
     people p 
    where 
     p.relationship_type_id = 1 -- parent 
) 
    select 
    target_person.person_id, 
    related_person.related_person_id, 
    related_person.relationship_type_id 
    from 
    target_person, 
    target_person related_person 
    where 
    target_person.person_id != related_person.person_id 
    and target_person.family_number = related_person.family_number 
); 

所以它真的這麼簡單:

SELECT * 
FROM people AS l 
INNER JOIN people AS r 
ON l.family_number = r.family_number 
    AND l.relationship_type_id = 1 
    AND r.relationship_type_id = 1 
    AND l.person_id <> r.person_id 

我認爲最快的方法是在您的人員表上有一個relationship_type_id,family_number,person_id索引。

+0

是的,你是對的。我過於複雜的查詢。 :) 感謝您的提示! – 2009-05-26 18:17:13

0

爲了幫助你調整,你可以發佈以下信息:

1)對於涉及到的表,他們的表定義和表上的索引定義。 2)每個表 中的大致行數的基本運行3)查詢的解釋計劃。得到一個解釋計劃: a)在sqlplus中運行 explain plan SET STATEMENT_ID = for < insert your query>; b)在sqlplus中運行 select * from table(dbms_xplan.display('PLAN_TABLE',''));

通過解釋計劃和表/索引信息,我們可以幫助您更好地調整查詢。僅僅通過查詢,我們確實沒有太多的事情要做。如果您可以提供查詢執行的tkprof,那也會有額外的幫助。