2013-11-21 147 views
-1

我有下面的SQL查詢需要花費過多的時間來運行。索引已添加到每個表中的所有連接字段。對於每個表的記錄數如下:SQL查詢性能問題

CRM.ASSET_PLUS:15766000

CRM.EMPLOYEE:44,300

CRM.ACCOUNT:1,180,000

CRM.DATA_NOTIFICATIONS:500

CRM.PROD_INT:87,800

如何才能使此查詢更高效?

SELECT D.NAME AS UP_ACCOUNT_NAME, 
    B.FIRST_NAME, 
    B.LAST_NAME 
FROM CRM.ASSET_PLUS A, 
CRM.EMPLOYEE B, 
CRM.ACCOUNT C, 
CRM.ACCOUNT D, 
CRM.DATA_NOTIFICATIONS E, 
CRM.PROD_INT F 
WHERE A.STATUS IN ('Active', 'Pending Install') 
    AND E.PROD_DEF_OLD = F.X_ITEM_NUMBER 
    AND F.ROW_ID = A.PRODUCT_ID 
    AND C.UP_ACCOUNT_ID = D.ACCOUNT_ID 
    AND C.ACCOUNT_ID = A.LOCATION_ACCOUNT_ID 
    AND D.MANAGER_ID = B.EMPLOYEE_ID 
    AND UPPER(D.NAME) LIKE '%BP%' 
GROUP BY D.NAME, 
    B.FIRST_NAME, 
    B.LAST_NAME 
+3

什麼是您的RDBMS?假設你有適當的索引,除了隱式地加入你的'join'這個事實之外,我發現你的當前查詢沒有問題。你遇到什麼性能問題? –

+0

如果是SQL Server,則向我們展示查詢計劃(實際優於預計)。 – RBarryYoung

+0

這是一個Oracle數據庫。運行需要很長時間,大約需要5分鐘。 – StephenT

回答

-1

,我在這裏看到的第一件事是,你使用INNER JOIN然後WHERE聲明。 使用語法table1 as t1 INNER JOIN table2 as t2 ON t1.key = t2.key

所以在你將只有UPPER(D.NAME) LIKE '%BP%' AND A.STATUS IN ('Active', 'Pending Install')條件。它將允許DBMS進行大量的優化。

而不是INNER JOIN試圖做LEFT JOIN哪裏有可能。它會顯着減少臨時表中的行數。

+1

在Oracle中,這不可能對執行計劃產生任何更改,從而影響性能。從內部連接到外部連接的改變可能會改變結果集,所以不理想 - 也不確定臨時表註釋的含義。 –

0

擺脫那個小組。 您只需選擇(賬戶加入員工)並使用所有其他表格進行過濾。你可以得到重複的結果,這就是你使用該組的唯一原因。

但是,如果您重寫查詢以將所有其他表移動到where子句,則這不是必需的。

我創建了一個示例來演示它。 並嘗試編寫顯式連接以分離過濾器和連接謂詞。 example using SQL fiddle