提高Oracle数据库SQL查询连接性能的可能方法
我有一个查询,它的性能非常差,需要15分钟以上才能获得6000行数据。我不确定这是否是由我的联接、错误的查询或模式引起的 有人能帮我一下吗?如果知道是否有性能问题,那将非常有帮助。遵循的最佳步骤是什么?我的查询的哪一部分导致性能不佳提高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
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分钟是合理的。