【发布时间】:2017-05-15 08:22:56
【问题描述】:
以下查询需要 220 秒。我想调一下。 查询中主要使用了三个表。两个很大,一个相当小。
表格中的计数:
INST --14851330 records
INST_S_INC --52234424 records
INVES -- 80000 records
查询:
SELECT
(
SELECT CODE
FROM CURRENCY CURR
WHERE CURR.CURRENCY_ID =
( SELECT CURRENCY_ID
FROM INST INSTR--14851330 records
WHERE INSTR.INVES_ID = INV.INVES_ID
UNION ALL
SELECT CURRENCY_ID
FROM INST_S_INC ISI--52234424 records
WHERE ISI.INVES_ID = INV.INVES_ID
)
)
FROM INVES INV -- 80000 records
WHERE TRUNC(CREATED_DATETIME) <SYSDATE
ORDER BY CREATED_DATETIME
;--220 secs
我尝试如下重写查询,但现在需要 418 秒。有什么其他的调音方法吗?
SELECT
(
SELECT CODE
FROM CURRENCY CURR
WHERE CURR.CURRENCY_ID =ISI.currency_id
union all
SELECT CODE
FROM CURRENCY CURR
WHERE CURR.CURRENCY_ID =INSTR.currency_id
) code
FROM INVES INV
left outer join (
select INVES_ID,currency_id from INST
) INSTR
on INSTR.INVES_ID = INV.INVES_ID
left outer join (
select INVES_ID,currency_id from INST_S_INC
) ISI
on ISI.INVES_ID = INV.INVES_ID
WHERE TRUNC(CREATED_DATETIME) <SYSDATE
ORDER BY CREATED_DATETIME
;--418 secs
【问题讨论】:
-
有哪些索引可用?连接列的数据类型有哪些?你的执行计划是什么?
-
WHERE INSTR.INVES_ID = INV.INVES_ID ---- 这是使用索引 INSTR.INVES_ID - 在此创建索引 WHERE ISI.INVES_ID = INV.INVES_ID---- 这是使用索引 ISI .INVES_ID - 在此创建索引
-
@swetabhmalaviya 编辑您的问题 - 不要尝试将其作为评论发布。
-
索引不是魔杖,在任何情况下都无济于事,尤其是在这种情况下,全表扫描可能会有更多帮助
-
你真的只是选择
currency.code而不选择其他列吗???
标签: oracle performance optimization query-optimization