当我添加一些注释掉的行时,Oracle 查询运行得更快
Oracle query runs faster when I added some commented out lines
我有一个查询运行缓慢(大约 5 分钟),但是如果我添加这个注释掉的行,它运行得非常快(大约 2 秒),这根本没有意义。
可能是什么解释?
FROM .....
--CREF.SYSTEM_PARAMETER sp,
...
WHERE ....
--t.LEDGER_EFFECTIVE_DATE BETWEEN NVL(adhoc.START_DATE, TRUNC(SYSDATE) - sp.value) and nvl(ec.END_DATE, TRUNC(SYSDATE)) -- use t.LEDGER_EFFECTIVE_DATE
谢谢。
Oracle 在多次执行查询时创建缓存,这可以减少执行时间。您是否多次执行查询?
一种可能是原始查询缓存的执行计划不佳,因此每次数据库看到该查询时都会使用缓存的计划。修改后的版本获得了新的解析和新的执行计划。
也许如果你以某种方式使慢速版本无效(使用 [=10= 收集统计信息],向 table 添加空注释,刷新共享池,重新启动数据库等)它会得到新计划。
您提到 “两者的解释计划完全相同” - explain plan
实用程序显示可能在下一次执行时使用的计划。您需要检查实际的运行时执行计划,而不是解释计划。
我有一个查询运行缓慢(大约 5 分钟),但是如果我添加这个注释掉的行,它运行得非常快(大约 2 秒),这根本没有意义。 可能是什么解释?
FROM .....
--CREF.SYSTEM_PARAMETER sp,
...
WHERE ....
--t.LEDGER_EFFECTIVE_DATE BETWEEN NVL(adhoc.START_DATE, TRUNC(SYSDATE) - sp.value) and nvl(ec.END_DATE, TRUNC(SYSDATE)) -- use t.LEDGER_EFFECTIVE_DATE
谢谢。
Oracle 在多次执行查询时创建缓存,这可以减少执行时间。您是否多次执行查询?
一种可能是原始查询缓存的执行计划不佳,因此每次数据库看到该查询时都会使用缓存的计划。修改后的版本获得了新的解析和新的执行计划。
也许如果你以某种方式使慢速版本无效(使用 [=10= 收集统计信息],向 table 添加空注释,刷新共享池,重新启动数据库等)它会得到新计划。
您提到 “两者的解释计划完全相同” - explain plan
实用程序显示可能在下一次执行时使用的计划。您需要检查实际的运行时执行计划,而不是解释计划。