時間ディメンションテーブルのどこにインデックスを配置すればよいですか?


10

インデックスについてこのウェブサイトからの質疑応答を読んだ後、疑問が浮かびました。

もし、1日がより細かいレベルの時間ディメンションテーブルを使用しているとしたらどうでしょう。インデックスはどこに置くべきですか?

質問のランディ・メルダー:RDBMSで「インデックス」とはどういう意味ですか?言った:

インデックスを「目次」と考えてください...これは、ファイル内の位置へのポインタ、つまりオフセットの順序付きリストです

時間ディメンションの場合、ほとんどのデータ調査は特定の日、特定の週、特定の月、または特定の年のすべての日がタイムテーブルに保存されている場合は特定の四半期に対して行われる可能性があります。

私の質問は、これらすべてのフィールドにインデックスを設定する必要がありますか?

日は一意であると想定されているため、この日についてはインデックスの使用を完全に理解しています。ただし、週IDには7回、月IDには30/31回、四半期IDには120回程度の発生があります。

  • それらのフィールドにインデックスを付ける必要がありますか?
  • それはまだ役に立ちますか?

同じ質問で、David Spillettが言ったので、私はあなたに尋ねます:

インデックスを追加することは、もちろん最適化の悪い結果になる可能性があります。インデックスを格納するために使用される余分なスペース(および、DBが多数の書き込み操作を確認した場合にインデックスを維持するためのIO負荷)は、わずかに最適化されていない読み取りクエリよりも悪い問題である可能性があるためです。 、無理しないでください。

それでは、時間ディメンションの場合の最良の考慮事項は何でしょうか?

回答:


7

これは1回(または1年に1回)作成され、その後は変更されないものと思われるため、書き込みの問題に遭遇することはないでしょう。

しかし、週ごとに検索している場合、インデックスを使用すると障害になる可能性があります...問題は、インデックスが使用されている場合、最初にそれをスキャンしてから、テーブルから各レコードを個別に取得する可能性があることです。レコードの約5〜20%を再度抽出する場合、通常は全テーブルスキャンを実行してから、不要なレコードを削除する方が高速です。

十分に分散されたデータの場合、これを最適化しない主要なRDBMSについては知りません。十分に分散されていない場合(たとえば、列の値の1つが95%の頻度で発生するが、他の可能な値も存在する場合)、テーブルのヒストグラムを計算し、検索時に値のプレースホルダーを使用しない場合があります。そのため、クエリオプティマイザーは、実行プランの生成時に検索される値を持ちます。

おそらく曜日を索引付けしないでしょう。データベースのドキュメントをチェックして、インデックス付き読み取りと全テーブルスキャンのトレードオフを調べて、月の日と月のどちらにインデックスを付けるかを確認します。存在する場合、私はおそらくDOY /年間通算日をインデックス付けします(とにかくそれはあなたのユニークなインデックスのように聞こえます)


5

インデックスは有用であるために一意である必要はないので、答えはそれが依存するということです。インデックスが存在することでクエリにメリットがある場合は、それらを追加する価値があります。時間列に関して特別なガイドラインが必要であることを知りません。他の列と同様に扱い、クエリの有用性に基づいてインデックスを作成します。


データベースに関して「依存する」と言ったり読んだりするたびに、私以外の誰かがポールランダルの声を聞いていますか?:p
AndrewSQL '19年

3

一般的なルールは、インデックスの選択性が高いほど(選択性は、列内の一意の値の数をテーブルの行数で割ったものとして定義されます)、クエリが実行された場合にエンジンがインデックスを使用する可能性が高くなります。 where句で列を使用します。

列のインデックス作成を検討している場合、前後のインデックス付き列でクエリを実行して実行プランを確認すると、インデックスが使用されているかどうか、使用されている場合はインデックスがどれだけ役立つかがわかります。理想的には、テストに使用するクエリは、アプリケーションで使用されるクエリです。


1

これまでのところ、私の経験則では、開発データベースに取り組んでいる間は、開発データベースにインデックスを一切付けないようにしています。本番データベースが大きくなるにつれ、私が使用してデータベース・ロギングをし、EXPLAINインデックスを必要とするかを把握し、その後にのみ、必要なインデックスを作成します。これは、データベースの使用量が徐々に増加し、インデックスカウントが低く保たれている限り、正常に機能します。

データベースのデータを分析するときは、通常、本番環境では一般的でないリクエストを高速化するために、追加のインデックスを追加する必要があります。私は常に本番データベースのコピーでこれを行うため、これらのインデックスが本番データベース自体に追加されることはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.