【问题标题】:How to make this Oracle select statement perform faster?如何让这个 Oracle 选择语句执行得更快?
【发布时间】:2017-07-15 09:51:29
【问题描述】:

能否请教一下如何让这个查询的执行速度比目前更快?

T2.ADI is indexed on TABLE2 
T1.ADI is indexed on TABLE1
T1.RC AND T1.BEG_DT_TM  is composite indexed on TABLE1

我还能做些什么来让它更快吗?

SELECT T1.ASI, T1.RC, T1.BEG_DT_TM
FROM TABLE1 T1
INNER JOIN TABLE2 T2 
    ON T2.ADI = T1.ADI 
    AND T2.END_DT_TM > T1.BEG_DT_TM 
    AND T2.BEG_DT_TM <= T1.END_DT_TM
WHERE T1.RC IN (12345, 56764460, 49862, 375723)
  AND T1.BEG_DT_TM >= 
  AND T1.BEG_DT_TM <= 
  AND T1.END_DT_TM >= 
  AND T1.END_DT_TM <= 

以下是解释计划:

【问题讨论】:

  • 我假设你运行了一个解释计划来查看大部分时间都花在了哪里。你能告诉我们这里吗?那么 - 统计数据是最新的吗?在任何情况下,无论其他任何事情,连接条件都会使查询变慢。
  • 感谢@mathguy,我在上面的更新中附上了解释计划
  • 这是什么“AND T1.BEG_DT_TM >=”?缺少右侧条件。 “更快”是什么意思?多久时间?表和结果集中有多少行?
  • 感谢@OldProgrammer 更快意味着我想减少返回行所需的时间。目前,如果通过运行 alter system flush shared_pool 没有缓存查询,则返回 15,000 行大约需要 13 秒;并更改系统刷新缓冲区缓存;
  • 要返回大量数据。由于我们不知道这个查询是如何执行的,(什么库,编程环境?)无法确定执行查询与将结果返回到主机环境的时间的哪一部分。您需要运行Trace and tkprof 以获取更多详细信息。

标签: sql oracle optimization query-performance


【解决方案1】:

在两个表上都放置covering 索引:

create index t1_c_1 on TABLE1(RC, BEG_DT_TM, END_DT_TM, ADI, ASI);
create index t2_c_1 on TABLE2(ADI, BEG_DT_TM, END_DT_TM);

这些索引是使用按查询的最佳顺序创建的列,加上它们包括在选择列表中找到的其他非连接列,因此可以使用仅索引访问(避免任何需要访问实际表)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    相关资源
    最近更新 更多