2011-08-04 8 views
2

Oracle 10gでは、indexおよびalter tableを作成する順序はどのような順序になりますか?列を追加する前にインデックスを作成するか、列を追加した後にインデックスを作成するか - 重要ですか?

  1. IはI(C)インデックスを作成し、列のX、Yを追加します。

    は今、私は次のシナリオのいずれかを実行し、私はテーブルTの列Cのwhere句でクエリQを持っていると言います、Z。

  2. 列X、Y、Zを追加し、インデックスI(C)を作成します。

QはT非常に多くのローが含まれている場合、1と2の間

有意差は、テーブルT上のQの性能があるでしょう?「Cは、=どんなTから選択*」ですか

私は個人的に#2を行うことを練習しますが、他の人は別の意見を持っているようです。あなたが前またはインデックスを作成した後、テーブルに列を追加する場合には違いはありません

おかげ

答えて

4

。オプティマイザはクエリに対して同じ計画を選択する必要があり、実行時間は変更しないでください。

テーブルの物理ストレージパラメータによっては、追加の列を追加してデータを入力すると、かなりの行の移行が発生する可能性があります。その行の移行により、表の索引が変更されます。 3つの新しい列にデータを設定するときにインデックスが存在する場合、追加のインデックスメンテナンスのために、X、Y、およびZのデータを入力するのに少し時間がかかる可能性があります。

1

メタデータを入力せずに列を追加すると、メタデータが変更されるだけなので、かなり簡単です。インデックスを追加するには、新しいインデックスの詳細を記録する単純なメタデータの変更よりも非常に時間がかかり、影響が大きくなるように、テーブルを読み取る必要があります(または潜在的に別のインデックス)。

新しい列がALTER TABLEの一部として作成される場合は、別の問題です。

  1. データベースは、サーバメモリが
  2. したがってそれらそのテーブル内の変更すべての行を記録する余地を有していなくてもよい
  3. テーブルデータのすべての行にそのデータを追加する過程で予定外のシャットダウンを受けることができます行の変更をコミットする前にデータ・ファイルに書き込んでダーティ・ブロックとして書き込むことができます。
  4. 次のブロックの読み込みは、ALTER表が正常に完了した後に遅延ブロック・クリーンアウトを行いますコミット済み)

列を(データ付きで)最初に追加すると、create indexが(おそらく)表を読み込み、遅延ブロックのクリーンアウトの追加作業を行います。

あなたは、列を追加作成したインデックスが速いかもしれないが、遅れブロッククリーンアウトが発生しませんし、そのハウスキーピングは(潜在的にselect * from T where C = whateverで)後に、アプリケーションによって

をピックアップされる最初のインデックスを作成した場合
関連する問題