Table sbfi_ctry_flow_curve_wheel有大约1500万条记录,运行下面的sql需要4秒钟左右,developer认为时间太长,想优化。 SQL>select min(trade_dt), max(trade_dt) from sbfi_ctry_flow_curve_wheel; developer很奇怪,trade_dt列上建有一个索引,但是执行的时候,oracle总是选择走primary key,而不选择那个索引。 经检查,发现表sbfi_ctry_flow_curve_wheel的索引情况如下: SQL> list 1 select index_name,column_name,column_position from user_ind_columns 2 where table_name=upper('sbfi_ctry_flow_curve_wheel') 3 order by 1 4* ,3 SQL> / INDEX_NAME COLUMN_NAME COLUMN_POSITION ------------------------------ ------------ --------------- SBFI_CTRY_FLOW_CURVE_WHEEL_PK TRADE_DT 1 SBFI_CTRY_FLOW_CURVE_WHEEL_PK CTRY_CODE 2 SBFI_CTRY_FLOW_CURVE_WHEEL_PK MONTH 3 TRADE_DT_INDEX TRADE_DT 1 尝试加hint /*+ index(sbfi_ctry_flow_curve_wheel TRADE_DT_INDEX) */,让oracle选择走索引TRADE_DT_INDEX。结果发现运行时间没有缩短,反而从4秒增加到7秒。 SQL> select /*+ index(sbfi_ctry_flow_curve_wheel TRADE_DT_INDEX) */ min(trade_dt), max(trade_dt) from bfi_ctry_flow_curve_wheel; MIN(TRADE MAX(TRADE --------- --------- 01-JAN-01 07-SEP-07 Elapsed: 00:00:06.91 为什么会出现这种情况?我们尝试用TRACE去跟踪执行过程。 ==session 1, don't use hint alter session set timed_statistics=true / alter session set max_dump_file_size=unlimited / alter session set tracefile_identifier='PRIMARY_KEY' / alter session set events '10046 trace name context forever, level 12' / select min(trade_dt), max(trade_dt) from sbfi_ctry_flow_curve_wheel / alter session set events '10046 trace name context off' / ==session 2, use hint alter session set timed_statistics=true / alter session set max_dump_file_size=unlimited / alter session set tracefile_identifier='TRADE_DT_INDEX' / alter session set events '1
关于min(), max()函数访问索引的方法
最新推荐文章于 2023-04-15 16:28:22 发布