我已经查询了〜53个字符串的代码,我需要优化它。我有PL / SQL Developer 7.0工具,我该如何使用它进行优化?
我尝试使用解释计划,但它没有告诉我任何事情。我还添加了时间和时间戳列,但没有什么有趣的,首先是空的,第二个是同时的。
我尝试使用测试窗口,但有程序,需要变量插入,并且我的查询选择了许多行,我无法使用它。
所以问题是如何使用PL / SQL Developer优化sql查询?我应该在哪里寻找每个子查询的查询执行时间?也许有一些指南,但是现在我发现只有文档,但它对我来说没用?根据我目前的知识,如果没有任何工具,就无法优化这样大的查询。
查询,需要优化:
select count(PRODUCT_NUMBER)
from
(select W.SUID,
I.SUID,
W.PRODUCT_NUMBER,
MI.ML_NUMBER,
I.TITLE_TRANSLIT,
I.COUNTRIES,
QTY.REMAINS,
QTY.ACQ_PRICE_USD,
QTY.REMAINS * QTY.ACQ_PRICE_USD as TOTAL
from (select UID_WARE,
QTY as REMAINS,
ACQ_PRICE_USD
from (select UID_WARE,
PRODUCT_NUMBER,
NVL(sum(QTY_ON_STOCK), 0) - NVL(sum(ADD_IN_QTY), 0) + NVL(sum(ADD_OUT_QTY), 0) as QTY,
ACQ_PRICE_USD as ACQ_PRICE_USD
from (select SI.UID_WARE,
W.PRODUCT_NUMBER,
count(distinct STK.SUID) as QTY_ON_STOCK,
sum(case
when 1 = 1 then
DECODE('' , SM.UID_SOURCE_LOCATION, SM.QTY, 0)
else 0
end) as ADD_OUT_QTY,
sum(case
when 1 = 1 then
DECODE('' , SM.UID_DEST_LOCATION, SM.QTY, 0)
else 0
end) as ADD_IN_QTY,
ROUND(ACQ.PRICE_USD, 2) as ACQ_PRICE_USD
from STOCK_MOVEMENTS SM
join STOCK_ITEMS SI on SM.UID_STOCK_ITEM = SI.SUID
left outer join (select PR.UID_STOCK_ITEM,
DECODE(NVL(CR.RATE, 0), 0, 0, PR.PRICE / CR.RATE) as PRICE_USD
from MV_STOCK_ACQ_PRICES PR,
CURRENCY_RATES CR
where PR.PRICE_DATE = CR.RATE_DATE
and PR.UID_CURRENCY = CR.UID_CURRENCY) ACQ on ACQ.UID_STOCK_ITEM = SI.SUID
join WARES W on W.SUID = SI.UID_WARE
left outer join (select distinct STK.SUID,
STK.QTY_REMAINS
from STOCK_ITEMS STK
where STK.UID_STOCK_LOCATION != 'MS-STL-SALED'
) STK on STK.SUID = SI.SUID
where 1 = 1
group by SI.UID_WARE,
W.PRODUCT_NUMBER,
ACQ.PRICE_USD
) T
group by T.UID_WARE,
T.PRODUCT_NUMBER,
ACQ_PRICE_USD)) QTY
join WARES W on W.SUID = QTY.UID_WARE
join INVENTORY I on I.SUID = W.UID_ISSUE
join MAP_INFO MI on MI.SUID = I.SUID
where REMAINS != 0
and w.UID_SECTION in ('MS-SEC-BOOKS', 'MS-SEC-MAPS'))
答案 0 :(得分:1)
当您使用GUI分析和优化查询时,您将自己锁定在一个更小的潜在帮助社区中。如果您运行说明计划并使用DBMS_XPlan.Display来获取格式化结果,那么您正在使用成千上万的从业者所理解的标准方法。
另外,我怀疑你是否只使用count(*)将查询包装在外部查询中。虽然这可能是在没有返回所有行的麻烦的情况下运行查询,但您可能会得到一个完全不同的执行计划,尽管有一些提示可能有助于促进使用通常的计划,但无法保证它赢了改变。所以,如果为了调整这是一个方便,那就把它拿走吧。
所以我的建议:
答案 1 :(得分:0)
执行时间,来自here:
SQL> set timing on;
在PL / SQL Developer中,您可以独立运行每个子查询 - 用鼠标标记并按 F8 。您将在sql窗口的左下角看到执行时间(在结果下方)。
优化不是一件容易的事,你必须自己思考 - 根据我的知识,没有工具可以为你做到这一点。你的aproach可能取决于很多因素 - db版本,底层操作系统,表大小,索引,......
<强>更新强>
根据您的数据库版本,您可以尝试使用CTE或SQL modelling - 它们肯定会提高性能,但需要一些时间来学习。
您可以尝试analytic functions而不是group by
,例如partition by
,请参阅this link以获取示例。