現在、ORACLE9を使用しているのですが
INDEXについて理解できないことがあったので
教えてください。
組織、社員という2つしか項目を持たない
従業員という表があり600件ほどのデータがあります。
変更前は、
・組織、社員にユニークインデックスは作成されていた。
・600件ほどのデータの組織は全て同一。
となっており、その状態で
select * from 従業員 where 組織 = 'ALL' and 社員 = '001'
を流すとFULL SCANになっていました。
FULL SCANを回避できないかと思い、社員のみのインデックスを
追加し(* 一番下にインデックス追加時のSQLをはっています)
select * from 従業員 where 組織 = 'ALL' and 社員 = '001'
を流すと追加したインデックスを読んでいました。
既に作成されていたユニークインデックスと異なるインデックスが
追加されたのかと思い、DBA_INDEXESの中を確認しましたが
異なっているのは、
・UNIQUENESS
・INITIAL_EXTENT(ユニークインデックスは24576、
追加したインデックスは40960)
・LEAF_BLOCKS(ユニークインデックスは3、
追加したインデックスは2)
の3点のみでした。
なぜこのような動きになるか理解できず、今後の対応に
迷っています。
・原因
・調査したらいい場所
・参考資料
などがありましたら教えてください。
よろしくお願いします。
(*)
インデックス追加時のSQL文は、create index 従業員A on 従業員 (社員) tablespace
index storage (initial 40000 next 100000 maxextents unlimited
pctincrease 0) pctfree 10となっています。
No.3ベストアンサー
- 回答日時:
組織+社員の複合キーで、最初の項目組織は"ALL"のみということで、カーディナリティーが低いというか一つですよね。
このパターン(カーディナリティが低い)だとOracleのオプティマイザーは全表スキャンに走るのだと思います。
回答ありがとうございます。
カーディナリティ、という言葉から少し調べたところ
新しいことも分かりました。
感謝です。
パッケージソフトをカスタマイズして納入しており
こういったケースがいくつかあるので、監視を続けながら
インデックスの追加を検討していこうと思います。
No.2
- 回答日時:
全表検索なのか索引検索なのか、といった実行計画については、
オプティマイザが決めます。
オプティマイザは、大きく2つ(RBO/CBO)に分けられますが、CBOに関しては
索引があるから、”索引を使おう”という単純な判断をしません。
データの分布やデータ量などの統計情報を基に、効率的と思えば、
全表検索を行います。
たぶん、CBOをお使いかと思いますが、まずは、統計情報を更新してみて
それでも、オラクルが全表検索し、かつ、索引を使った方が良いのであれば、
オプティマイザヒントで、索引の使用を強要するのが良いと思います。
(本質的に、社員だけの索引が必要ないのであれば削除する)
select /*+ index(従業員 索引名) */ * from 従業員 where ~;
この回答への補足
回答ありがとうございます。
オプティマイザはCBOです。
単文であればヒント文の使用もできるのですが、
select * from 支払先 a , 従業員 b
where a.組織=b.組織 and a.支払先番号 = b.社員
and a.支払先番号 = 1
のようにジョインして使用している時も、インデックスを
追加しない場合は従業員テーブルについてFULL SCANしている
状態です。
それで既に存在しているインデックスと大して変わらない
社員のみのインデックスを追加しようかとも考えているのですが、
大して変わらないだけに躊躇しています。
また、同様のケースが複数のテーブルに関して確認されており
「大して変わらなくてもどんどんインデックスを作る」
という方針をとるかとらないかで迷っています。
LEAF_BLOCKSなどをいじるだけで読むようになれば一番いいん
ですけどね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- 外国株 インデックス投資は、実は罠がある、バンガード社が、ウオール街の ランダムウオーカーとか、宣伝活動した 2 2023/01/06 22:08
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- 会計ソフト・業務用ソフト タックインデックスシール 2 2023/04/28 05:14
- 不動産投資・投資信託 eMAXIS Slim S&P500で、インデックスが下がったのに基準価額が上がる、又はその逆の挙動 1 2023/01/25 17:58
- Excel(エクセル) エクセルで沢山のレコードの最後に追記するには? 7 2023/04/10 13:27
- SEO 検索エンジンにインデックスされない 3 2023/02/20 08:59
- SEO Googleで会社名を入れて検索するとホームページが表示されるようにしたい 4 2022/09/06 23:36
- Visual Basic(VBA) 【VBAで、On Error が効かない】 3 2022/06/09 10:08
- 不動産投資・投資信託 インデックス投資信託の信託報酬が低い物へのスイッチについて 5 2022/08/17 18:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Viewにインデックスは張れ...
-
データ表示順序
-
SQL*Loaderで、データを加工し...
-
アナライズとインデックス作成...
-
INDEXの無効化
-
可変個数のデータはどう納める?
-
SQL*LOADER実行時の...
-
SQLでスキーマ名(所有者名)の...
-
ACCESS 複数テーブル・複数フィ...
-
CLOB型へのINSERT
-
データを削除しても表領域の使...
-
列が255以上のCSVファイルをAcc...
-
oracleのimpdpでORA-39166
-
ORA-00959: 表領域'****'は...
-
postgreSQLのint型は桁数指定が...
-
異なるスキーマからデータを抽...
-
Data Pump で大量データインポ...
-
エクセルからアクセスにインポ...
-
C#でaccdbファイルのテーブルの...
-
Access レコードを追加できませ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Viewにインデックスは張れ...
-
INDEXの無効化
-
SQL*Loaderで、データを加工し...
-
アナライズとインデックス作成...
-
可変個数のデータはどう納める?
-
SQL*LoaderとInsertの違いについて
-
インデックス作成後アナライズ...
-
主キー以外の項目にNotNull制約...
-
文字列中のスペースを排除する...
-
テスト環境と本番環境で、DBか...
-
OracleTextの索引再構築について
-
データ表示順序
-
統計情報について
-
SQLの処理速度改善にむけて
-
論理読み込みブロック数とは?
-
Wordで複数の索引を作りたい
-
索引の再構築をすべき?
-
IN 句ではインデックスが使用さ...
-
該当データが存在しないときに...
-
PervasiveSQL (Btrieve) で、デ...
おすすめ情報