S-JIS[2010-07-19] 変更履歴

集計関数MIN/MAX

Oracleの(SQLの)集計関数MIN・MAXのメモ。


インデックスの張ってある項目の最大値・最小値の両方を取得したい場合、一回の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秒)になっている。


Oracle関数へ戻る / SQLメモへ戻る / Oracle目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま