提高Oracle数据库SQL查询连接性能的可能方法

提高Oracle数据库SQL查询连接性能的可能方法,sql,oracle,oracle11g,oracle-sqldeveloper,Sql,Oracle,Oracle11g,Oracle Sqldeveloper,我有一个查询,它的性能非常差,需要15分钟以上才能获得6000行数据。我不确定这是否是由我的联接、错误的查询或模式引起的 有人能帮我一下吗?如果知道是否有性能问题,那将非常有帮助。遵循的最佳步骤是什么?我的查询的哪一部分导致性能不佳 WITH ship AS ( SELECT "ORDER" FROM historymaster hm WHERE --datetimecreated BETWEEN TO_char(:startdate,'MM-DD-YYYY') AND

我有一个查询,它的性能非常差,需要15分钟以上才能获得6000行数据。我不确定这是否是由我的联接、错误的查询或模式引起的

有人能帮我一下吗?如果知道是否有性能问题,那将非常有帮助。遵循的最佳步骤是什么?我的查询的哪一部分导致性能不佳

WITH ship AS (
SELECT
    "ORDER"
FROM
    historymaster hm
WHERE
    --datetimecreated BETWEEN TO_char(:startdate,'MM-DD-YYYY') AND 
TO_char(:enddate +1 ,'MM-DD-YYYY')
    datetimecreated BETWEEN TO_DATE(:startdate,'MM-DD-YYYY') AND 
TO_DATE(:enddate,'MM-DD-YYYY')
    AND   "OBJECT" = 'OBORDLINE'
    AND   hm.package = ' '
    AND   actionmodifier IS NULL
    AND   "ACTION" = 'SHIP'
),cpt_time AS (
SELECT
    unique(outboundorder),
    TO_CHAR(shipdatetime,'yyyy-mm-dd hh24:mi') AS cpt,
    routingcomments1,
    routingcomments2
FROM
    history_outbound_order_master
WHERE
    outboundorder IN (
        SELECT
            "ORDER"
        FROM
            ship
    )
    AND   routingcomments2 IS NOT NULL
),transations AS (
SELECT
    "ORDER",
    datetimecreated,
    datecreated,
    TO_CHAR(datetimecreated,'yyyy-mm-dd hh24:mi') AS ship_complete_time,
    actualquantity,
    "ACTION",
    warehouse AS site
FROM
    historymaster hm
WHERE
--datetimecreated BETWEEN TO_DATE(:startdate,'MM-DD-YYYY') AND 
TO_DATE(:enddate,'MM-DD-YYYY')
    -- ship complete 
    "ORDER" IN (
        SELECT
            "ORDER"
        FROM
            ship
    )
    AND   (
        (
            "OBJECT" = 'OBORDLINE'
            AND   hm.package = ' '
            AND   actionmodifier IS NULL
            AND   "ACTION" = 'SHIP'
        )
        OR -- pick 
         (
            "ACTION" = 'PICK'
            AND   "OBJECT" = 'OBO'
            AND   "CLASS" = 'INVE'
            AND   actualquantity != 0
            AND   substr(ordertype,1,1) = 'N'
        )
        OR -- Order drop 
         (
            "ACTION" = 'DNLD'
            AND   "OBJECT" = 'OBORDLINE'
            AND   actionmodifier IS NULL
            AND   reasoncode = '00'
        )
        OR --label request
         (
            "ACTION" = 'REQUEST'
            AND   "OBJECT" = 'LABEL'
            AND   "CLASS" = 'ADDR'
        )
        OR    (
            "ACTION" = 'LOAD'
            AND   "OBJECT" = 'OBO'
            AND   "CLASS" = 'INVE'
        )
    )
) SELECT
"ORDER",
MAX(
    CASE
        WHEN "ACTION" = 'DNLD' THEN ship_complete_time
    END
) AS order_drop_time,
MAX(
    CASE
        WHEN "ACTION" = 'REQUEST' THEN ship_complete_time
    END
) AS label_request_time,
MAX(
    CASE
        WHEN "ACTION" = 'PICK' THEN ship_complete_time
    END
) AS pick_time,
MAX(
    CASE
        WHEN "ACTION" = 'LOAD' THEN ship_complete_time
    END
) AS load_time,
MAX(
    CASE
        WHEN "ACTION" = 'SHIP' THEN ship_complete_time
    END
) AS ship_com_time,
cpt,
routingcomments1,
routingcomments2
FROM
transations left
JOIN cpt_time ON "ORDER" = outboundorder

GROUP BY
"ORDER",
routingcomments1,
routingcomments2,
cpt

如果列的值分布不均匀,请确保收集列统计信息


如果每个子select本身运行得很快,请向select中添加提示/*+materialize*/以确保它按计划运行。

您必须提供更多详细信息,如执行计划、表结构和定义在它们上的索引等。使用cascading WITH子句看起来很简单。这有什么作用?您是从最简单的查询开始的吗?是的,我尝试了不使用,但运行时间更长,获取6000行所需的时间并不重要。如果它必须读取、连接和过滤60亿行(例如),那么15分钟是合理的。