【问题标题】:Oracle applying indexes to improve this queryOracle 应用索引来改进此查询
【发布时间】:2014-03-23 15:33:33
【问题描述】:

您好,我在应用索引以提高以下查询的速度时遇到问题..

   SELECT SUM(OL.QTY) FROM ORDER_LINE OL, PRODUCT P, ORDERS O 
   WHERE
   O.O_DATE BETWEEN '01-FEB-2014' AND '28-FEB-2014'
   AND
   O.ID = OL.ORDER_ID
   AND
   P.ID = OL.PRODUCT_ID
   AND
   P.NAME = 'APRICOT JAM'
   ;

任何建议将不胜感激!目前我已经尝试将连接索引作为 (O_DATE,ID) 应用于订单表,但这并没有太大帮助!

表格设计如下!谢谢!

  ORDERS
  ID         NOT NULL     NUMBER(38)
  CUSTID     NOT NULL     NUMBER(38)
  O_DATE     NOT NULL     DATE

  ORDER_LINE
  ORDER_ID   NOT NULL     NUMBER(38)
  PRODUCT_ID NOT NULL     NUMBER(38)
  QTY        NOT NULL     NUMBER(4)

  PRODUCT
  ID         NOT NULL     NUMBER(38)
  NAME       NOT NULL     VARCHAR(30)
  PRICE      NOT NULL     NUMBER(3,2)

【问题讨论】:

    标签: database oracle indexing


    【解决方案1】:

    为此字段创建索引

    PRODUCT.NAME
    
    ORDER_LINE.PRODUCT_ID
    ORDER_LINE.ORDER_ID
    
    ORDERS.O_DATE
    

    我假设您已经有主键字段。如果没有,请先为主键创建唯一索引

    ORDER.ID
    PRODUCT.ID
    

    【讨论】:

    • 您好,感谢您的帮助,我尝试将索引应用于 O_DATE 值,但优化器似乎没有使用它,当我包含提示时,查询会大大降低性能。在这种情况下我使用了一个 btree 索引,有什么建议吗?
    • Oracle 根据数据和统计信息决定使用索引。您的数据在全表扫描时可能会得到更快的结果,因此 oracle 优化器决定不使用索引。
    • 如果你在上面创建索引,你可能会得到更快的结果。可能不使用 O_date,但 product.name 上的索引可以减少您的执行时间。
    • 该产品有效,谢谢 :) 但我对这个 O_Date 有问题,我只是不明白为什么优化器不会使用它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    相关资源
    最近更新 更多