こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

データベースのインデックスについての基本的な質問

とあるテーブルAとBがあり、二つはあるキーで結合するSQLを頻繁に発行しています。両テーブルとも数万件のデータがあり、パフォーマンスが遅いということだったので、結合の条件としているキーのカラムにインデックスを作成したところ、劇的に速くなりました。

というところまでは良かったのですが、最近、負荷テストを行う目的で、さらに数百万件のテストデータをいっきに両テーブルにINSERTしました。この場合、インデックスは何かしら人の手によるメンテナンスが必要なのでしょうか?(ALTER INDEX REBUILD ONLINEという再構築のSQLがあることを知りました) それとも、データがテーブルに追加されても既に以前インデックスが作成されている場合は特に人の手による保守は不要なものでしょうか? 今は負荷テスト中ですが、本稼働した後にも何か自動でデータベースのインデックスの保守作業は一般的に必要なものなのかどうか、必要な場合は具体的にどのようにやるのか教えて頂きたいです。

使用しているDBはOracle 11gです。

投稿日時 - 2015-05-12 01:04:59

QNo.8973489

困ってます

質問者が選んだベストアンサー

ALTER INDEX REBUILD ONLINE
はしたほうが速くなると思います。

普通、大量のデータをinsertする際にはindexを一旦消し、(drop index)
insert後に作成(create index)するとinsertが早く終わります。

データベースを何かの順位で読む際にはソートされて順に読み出されていきます。
インデックスを作っておくとソートがいらないのでその分早くなるというわけです。

今回のように大量にデータを入れた際にはインデックスもかなり複雑に絡まっていて
読みだすのに時間がかかる状態になっています。

投稿日時 - 2015-05-12 07:52:02

お礼

ご回答有難うございました。

投稿日時 - 2015-05-12 23:57:07

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

>一般的に必要なものなのかどうか

そもそもINDEX REBUILDが「必要」な場合は、頻繁に削除をするような場合です。そうでない限りは一般的には不要です。特にテストデータを大量に投入した直後なら、おそらくとてもきれいな状態でしょうからでさらに不要な状態である可能性が高いでしょう。

行の追加だけの場合でも、インデックス対象のカラムの値の分布に偏りがある場合には、インデックスのBツリー構造に偏りが発生する可能性があります。ただ、必要になるほどの偏りを発生させるのは困難ですので、狙って値をばらけさせている場合でもなければ不要でしょう。特にただの連番だったらさらに必要ないでしょう。

でここまでが一般論です。


数百万件のデータを扱うということなら学生の勉強や個人の趣味でやっているわけではなく、おそらく仕事でやっているのですよね。だったら想像でやってたらダメですよ。最低限INDEX REBUILDコマンド実行前の状態を確認すること。そして現在リビルドが必要な状態なのかどうかを確認すること。ここまでは必ず行いましょう。

その上でコマンドを実行したのなら、できればコマンド実行後の状態も確認しリビルドを行った成果が出て改善しているのかどうか確認すること。

リビルド実行前と後で数値を比較すれば、改善されたのかされていないのか、意味のある作業なのか無意味な作業なのかはっきりします。効果がありそうと分かったのなら、次からは無条件で行うようにしてもいいと思います。レベルの低いSEですと「なんかよく分からないけど念のため」で常になんとなくで無条件で作業をする人もかなりの数います。そういう人になってはいけません。

状況から必要な作業かどうかを判断する。そして必要な作業だけを実行する。必要の無い作業は行わないようにする。3年目以降ならそんなふうに考えて作業をできるようになったほうがいいでしょう。新人ならほかに覚えることが多いかもしれませんので、仕方がないかもしれませんが。

索引(インデックス)の断片化の確認方法と対処方法
(オラクルエンジニア通信 - 技術資料、マニュアル、セミナー)
https://blogs.oracle.com/oracle4engineer/entry/column_index_fragmentation

第6回 パフォーマンスの基礎である索引について
http://www.oracle.com/technetwork/jp/database/articles/tsushima/tsm06-1598252-ja.html


>必要な場合は具体的にどのようにやるのか教えて頂きたいです。

「どのようにやるのか」の意味がよく分かりませんが。あなたの調べたコマンドを普通に実行してください。念のためデータの追加削除や検索もない状態で行うことがいいとは思いますが、追加削除の最中でも可能になっているはずです。

もしもそもそもOracleのコマンドを実行する方法が分からないということなら…、それくらいは自分で調べられるようになったほうがいいと思いますよ。

投稿日時 - 2015-05-12 11:00:00

お礼

ご回答有難うございました。

投稿日時 - 2015-05-12 23:57:18

あなたにオススメの質問