インデックスの張ってある項目の最大値・最小値の両方を取得したい場合、一回のSQLで両方取得するより、別々に取得した方が速い。
SQL> select min(KEY) from TEST; MIN(KEY) ---------- 0 経過: 00:00:00.00 実行計画 ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=5) 1 0 SORT (AGGREGATE) 2 1 INDEX (FULL SCAN (MIN/MAX)) OF 'PK_TEST' (UNIQUE) (Cost=2 Card=10000000 Bytes=50000000)
SQL> select max(KEY) from TEST; MAX(KEY) ---------- 9999999 経過: 00:00:00.00 実行計画 ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=5) 1 0 SORT (AGGREGATE) 2 1 INDEX (FULL SCAN (MIN/MAX)) OF 'PK_TEST' (UNIQUE) (Cost=2 Card=10000000 Bytes=50000000)
SQL> select min(KEY),max(KEY) from TEST; MIN(KEY) MAX(KEY) ---------- ---------- 0 9999999 経過: 00:00:07.00 実行計画 ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=1 Bytes=5) 1 0 SORT (AGGREGATE) 2 1 INDEX (FAST FULL SCAN) OF 'PK_TEST' (UNIQUE) (Cost=4 Card=10000000 Bytes=50000000)
Costで見るとほとんど差が無いが、実際の実行時間は雲泥の差(単独だとそれぞれ0秒なのに同時だと7秒)になっている。