2012-09-27 77 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);