この前書いたSQLチューニングの結果を。
DBはOracle9iR2。
こーいうのはWikiの方に書くべきかな。。
テーブルは以下のように定義。
NAME VARCHAR2(20)
POINT NUMBER(10,0) ← こいつにINDEX張ってある
データ量は10万件。
ObjectBrowserのデータ生成機能を使って生成。
比較したSQLは以下の通り。
[1]
SELECT NAME
FROM TBL_WORK1
WHERE POINT != 50;
[2]
SELECT NAME
FROM TBL_WORK1
WHERE POINT < 50 OR POINT > 50;
それぞれの実行計画と統計情報は以下の通り。
[1] 99807件選択されました(906 msec.)
------------------------ 実行計画 --------------------------
SELECT STATEMENT Cost =
TABLE ACCESS FULL TBL_WORK1
------------------------ 統計情報 --------------------------
recursive calls 0
db block gets 0
consistent gets 548
physical reads 0
redo size 0
bytes sent via SQL*Net to client 1517840
bytes received via SQL*Net from client 3106
SQL*Net roundtrips to/from client 252
sorts (memory) 0
sorts (disk) 0
rows processed 99807
[2]99807件選択されました(672 msec.)
------------------------ 実行計画 --------------------------
SELECT STATEMENT Cost =
CONCATENATION
TABLE ACCESS BY INDEX ROWID TBL_WORK1
INDEX RANGE SCAN IDX_TBL_WORK1_01
TABLE ACCESS BY INDEX ROWID TBL_WORK1
INDEX RANGE SCAN IDX_TBL_WORK1_01
------------------------ 統計情報 --------------------------
recursive calls 0
db block gets 0
consistent gets 16712
physical reads 0
redo size 0
bytes sent via SQL*Net to client 1517840
bytes received via SQL*Net from client 3143
SQL*Net roundtrips to/from client 252
sorts (memory) 0
sorts (disk) 0
rows processed 99807
まぁ統計情報使ってるので、実行時間は当てになりませんが・・・。
実行計画を見ると、1は全スキャンしてるのに対して、2は範囲スキャンをかけていますね。
クレミア
目が嫌がるから読めない( ´=ω=)
たむたむ
(´・ω・`)こんなの理解できる人なんて変態ですよ