【问题标题】:SQL optimization distinctSQL优化不同
【发布时间】:2012-09-27 19:07:46
【问题描述】:

假设我有一个 SQL 查询,使用 Oracle SQo Server 从数据库中获取数据 如下

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

我现在有 5000 条记录,订单类型如下:

Red
Yellow
Green
Black 
null
Unclassified

如何通过缩短查询执行时间来优化性能?

注意当我看到执行计划时,通过表有很多完全访问?

【问题讨论】:

    标签: sql oracle optimization


    【解决方案1】:

    您可以在这两列上定义索引以防止表扫描。这应该会大大缩短执行时间。

    CREATE INDEX IX_ProductMasterList_OrderType 
    ON PRODUCT_MASTER_LIST(PROJECT_ID, ORDER_TYPE);
    

    【讨论】:

    • 如何利用索引来提升表扫描的性能?
    • 数据库查询引擎将自动选择索引(如果存在),因此应用程序开发人员无需执行任何特定操作来使用索引。
    • 在这个意义上,通过使用 patrition 分配行号并选择行号为 1 来创建一个额外的查询列,如下所示。 row_number() over (partition by ORDER_TYPE_name, project_id order by ORDER_TYPE_name, project_id) as order_index .. where order_index = 1 没用?
    • 不,它仍然会使用索引来推断结果,而不是表扫描。这就是 DB 查询引擎优化磁盘访问以执行查询的目的,通过考虑索引的存在,选择最合适的索引并降低查询的总体成本。
    • 实际上,您建议的解决方案和我的解决方案都会产生相同的结果,因为我提到的每个组都有 1、2、3、4、5、6、7?
    【解决方案2】:

    我认为 PROJECT_ID 上的索引可能是正确的解决方案。这取决于该列的选择性。

    CREATE INDEX PRODUCT_ML_PRODUCT_ID_IDX ON PRODUCT_MASTER_LIST(PRODUCT_ID);
    

    【讨论】:

      【解决方案3】:

      如果您计划经常运行查询,请创建一个绑定变量,这将大大提高性能。

      例子:

      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 子句是可选的

      【讨论】:

      • 而且我不需要修改SQL?
      猜你喜欢
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多