1

良い一日、

約 4GB のデータがあり、約 10 個の異なるテーブルに分かれています。各テーブルには多数の列があり、各列をクエリの検索条件にすることができます。私は DBA ではありませんし、インデックスについても詳しくありませんが、できるだけ検索を高速化したいと考えています。重要な点は、いつでも更新、挿入、または削除が行われないことです (テーブルは 4 か月に 1 回作成されます)。すべての列にインデックスを作成するのは適切ですか? 覚えておいてください: 挿入、更新、または削除ではなく、選択のみです! また、これらの列をすべて varchar ではなく整数にすることができれば、速度に違いはありますか?

どうもありがとうございました!

4

5 に答える 5

6

回答: いいえ。すべての列を個別にインデックス化するのは、適切な設計ではありません。多くの場合、インデックスは複数の列で構成する必要があり、さまざまな要件に対応するさまざまな種類のインデックスがあります。

他の回答で言及されているチューニングウィザードは、最初のカットに適しています(特に学習者にとって)。

自分のやり方を推測しようとしたり、複雑な分析を理解しようとしたりしないでください。状況に応じたアドバイスを受けてください。特定の状況とクエリの最適化のために非常にアクティブなスレッドがいくつかあるようです。

于 2008-12-09T00:11:25.080 に答える
4

インデックス チューニング ウィザードの実行について調べましたか? ワークロードに基づいてインデックスを提案します。

于 2008-12-09T00:06:44.463 に答える
3

絶対違う。

インデックスがどのように機能するかを理解する必要があります。たとえば、1000 レコードのテーブルがあり、それが BIT であり、2 つの値のいずれかが存在する可能性がある場合、その列とその列のみにインデックスを付けると、十分に選択できないため、価値がなくなります。列にインデックスを付けるときは、テーブルで実行される選択の種類を十分に認識してください。列にインデックスを作成する場合、そのインデックスはオプティマイザーが効果的に使用するのに十分選択的ですか?

その時点まで、慎重に選択されたいくつかの複合インデックスが、各列に多数の単一インデックスを使用するソリューションよりもはるかに優れていることがわかるでしょう。ゴールデン ルール: データベースのクエリ方法によって、インデックスの作成方法が決まります。

于 2008-12-09T00:13:16.353 に答える
1

欠落している 2 つの情報: 各列に個別の値がいくつあるか、および使用している DBMS です。Oracle を使用していて、列ごとに異なる値が数千未満の場合は、ビットマップ インデックスを作成できます。これらは、完全一致の場合、スペース効率と実行効率が非常に高くなります。

それ以外の場合はトレードオフです。各インデックスは、同じデータを含む 1 列の名前とほぼ同じ量のスペースを追加するため、スペース要件は本質的に 2 倍 (おそらく 2.5 倍) になります。たぶん 10G ですが、これは大量のデータではありません。

次に、DBMS が複数のインデックス ベースの選択を効率的にマージできるかどうかという問題があります。選択しているすべての列に対して自己結合を行わない限り、そうならない可能性は十分にあります。

最良の回答: 小さいデータセットで試して (インデックスの作成に時間を費やさないようにするため)、どのように機能するかを確認してください。

于 2008-12-09T00:10:32.070 に答える
0

選択したインデックスの列に含まれる列よりも大きい一連の列をテーブルから選択する場合、必然的にクエリ プランでブックマーク ルックアップが発生します。ここで、クエリ プロセッサは、カバーされていない列を取得する必要があります。関連する非クラスター化インデックスのリーフ行からの参照 ID を使用して、クラスター化インデックスから。

私の経験では、ブックマーク ルックアップはクエリのパフォーマンスを大幅に低下させる可能性があります。これは、余分な読み取りが必要であり、クラスター化インデックスの各行を個別に解決する必要があるためです。これが、可能な限りカバーする NC インデックスを作成しようとする理由です。これは、必要なクエリ プランがよく知られている小さなテーブルの方が簡単ですが、任意のクエリが予想される多数の列を含む大きなテーブルがある場合、これはおそらくそうではありません。実現可能です。

これは、インデックスがカバーしている場合、またはブックマークルックアップのコストが軽減されるほど十分に小さいデータセットを選択している場合に、あらゆる種類の NC インデックスを使用した場合にのみ、費用対効果が得られることを意味します。実際、クエリオプティマイザーがすべての列が既に使用可能なクラスター化インデックス スキャンと比較して、コストが法外に高い場合は、インデックスを調べません。

したがって、インデックスが特定のクエリの結果を最適化することがわかっていない限り、インデックスを作成しても意味がありません。したがって、インデックスの値は、特定のテーブルに対して最適化できるクエリの割合に比例します。これは、実行中のクエリを分析することによってのみ決定できます。これは、まさにインデックス チューニング ウィザードが行うことです。

要約すると:

1) すべての列にインデックスを付けないでください。これは典型的な時期尚早の最適化です。考えられるすべてのクエリ プランのインデックスを含む大きなテーブルを事前に最適化することはできません。

2) インデックス チューニング ウィザードを使用してベース ワークロードを取得して実行するまで、どの列にもインデックスを作成しないでください。クエリのパフォーマンスに実際に役立つインデックスをウィザードが判断できるように、このワークロードはアプリケーションの使用パターンを代表するものである必要があります。

于 2008-12-10T00:02:41.367 に答える