2012-09-27 72 views
2

假設我有使用Oracle SQO服務器從數據庫中獲取 數據如下SQL優化不同

select distinct ORDER_TYPE_name as ORDER_TYPE from 
PRODUCT_MASTER_LIST where PROJECT_ID = 99999 
order by ORDER_TYPE ASC 

我現在有5000條記錄下列順序類型的SQL查詢:

Red 
Yellow 
Green 
Black 
null 
Unclassified 

如何通過縮短查詢執行時間來優化性能?

注意當我看到執行計劃時,有許多通過表的完全訪問權限?

回答

4

您可以在這兩列上定義一個索引來防止表掃描。這應該會在很大程度上縮短執行時間。

CREATE INDEX IX_ProductMasterList_OrderType 
ON PRODUCT_MASTER_LIST(PROJECT_ID, ORDER_TYPE); 
+0

我們該如何利用索引來增強表掃描的性能? –

+0

數據庫查詢引擎會自動選擇索引(如果存在),所以應用程序開發人員無需執行任何特定的索引操作。 – Vikdor

+0

從這個意義上說,創建一個額外的查詢列通過使用patrition分配行號,並選擇行號爲1 如下。 order_index .. row_number()over(ORDER_TYPE_name分區,project_id order by ORDER_TYPE_name,project_id)其中order_index = 1 是無用的嗎? –

0

如果計劃運行查詢經常創建綁定變量,這將極大地提高性能。

例子:

create or replace procedure dsal(p_empno in number) 
as 
    begin 
    update emp 
    set sal=sal*2 
    where empno = p_empno; 
    commit; 
    end; 
/

另外您打算查詢列創建指數

CREATE INDEX 
    ix_emp_01 
ON 
    emp (deptno) 
TABLESPACE 
    index_tbs; 

注TABLESPACE子句是可選

+0

我不需要修改SQL? –

1

我覺得PROJECT_ID指數可能是正確的解決方案。這取決於這一欄的選擇性。

CREATE INDEX PRODUCT_ML_PRODUCT_ID_IDX ON PRODUCT_MASTER_LIST(PRODUCT_ID);