2012-06-28 33 views
0

這個查詢是我使用的查詢:Oracle - 性能問題。使用GROUPBY

SELECT p.name, p.id 
FROM v_emp e 
INNER JOIN v_prof p ON e.code = p.code 
WHERE e.emp_id IN (SELECT a.id 
        FROM t_approval a 
        WHERE a.code1 <> 'R' 
        AND a.code2 = 'P' 
        AND a.date1 IS NULL 
        AND a.date2 IS NULL 
        AND a.code3 = 'ADMIN' 
        GROUP BY a.id 
            ) 
GROUP BY p.name, p.id 
ORDER BY p.name 

的查詢時間超過4分鐘來執行。表t_approval有超過1500萬條記錄,我需要從這個表中匹配搜索條件的不同ID。

此表已經有id,code1,code2,code3的索引。

請讓我知道如何使這個運行更快。

+2

「此表已經有id,code1,code2,code3的索引。」哪張桌子?你有三個。另外,是四個單獨的索引還是一個組合索引?請發佈查詢中所有表的表結構和索引。併發布查詢計劃。 –

回答

5
  • 什麼是查詢計劃?
  • 爲什麼兩個GROUP BY條款存在?它們都不是必需的,但由於我們不知道您的數據或數據模型,因此很難知道它們是否試圖掩蓋某些連接條件丟失的問題。
  • t_approval的1500萬行中有多少個子查詢返回?每個謂詞有多選擇性?
  • 其他兩個表中有多少行?整個查詢返回多少行?
  • 有哪些索引可用?我假設您所指的索引位於t_approval表格中。不過,目前尚不清楚您是在談論單個複合索引還是4個獨立的單列索引或其他內容。目前還不清楚另外兩張桌子上有什麼索引。

沒有看到查詢計劃,不知道你的數據模型是什麼樣子,也不知道你的謂詞有多選擇性,很難猜測問題是什麼讓別人猜測解決方案。潛在的,因爲你只從一個表,因爲我猜子查詢選擇列返回的行數,它可能是更有效地做

SELECT p.name, p.id 
    FROM v_prof p 
WHERE EXISTS(SELECT 1 
       FROM v_emp e 
         JOIN t_approval a ON (e.emp_id = a.id) 
       WHERE e.code = p.code 
        AND a.code1 <> 'R' 
        AND a.code2 = 'P' 
        AND a.date1 IS NULL 
        AND a.date2 IS NULL 
        AND a.code3 = 'ADMIN') 
ORDER BY p.name 

如果不工作,你需要通過發佈更多信息來幫助我們。