クラスター化された複合キーを持つテーブルでの「大きな」挿入中に何が起こりますか?


8

私のSQLの知識は限られているので、私が使用する用語はおそらく正しいものではありません。

複数の場所のテスト結果を格納するテーブルがあります。

テストは異なる場所(ネットワーク接続なし)の異なるデータベースに記録され、「マスター」場所は他の場所から定期的にテスト結果を「インポート」します。

LocationId(int)列とDate(datetime)列にこの順序でクラスター化された複合主キーを配置する予定です。その理由は、ロケーションのすべての結果を一緒に保持する必要があるためです。日付範囲ではなく、日付範囲とロケーションでクエリを実行することはほとんどありません。

行のサイズは80〜100バイトで、テスト結果の数は数百万を超えてはなりません。通常の「インポート」では、別の場所から50〜10万の結果が挿入されます。

インポート中に何が起こりますか?SQLはクラスタリングを維持するために既存の行を「移動」しますか、それともテーブルを「断片化」させますか?インポートが一度に1行ずつ実行されると、パフォーマンスに大きな影響を与える可能性がありますか?行の順序を気にせず、ID列を主キーとして追加し、日付列にインデックスを追加してクエリを支援する必要がありますか?

回答:


19

聖なる牛、あなたはここで多くの質問をしています。これを分解してみましょう。

Q:SQLは既存の行を「移動」してクラスタリングを維持しますか、それともテーブルを「断片化」させますか?

データベースをページのコレクションと考えてください。机の上に文字通りの紙が並べられています。今のところ辞書について考えてみてください。辞書にさらに単語を追加したい場合は、ページに空のスペースがある場合は、それらを所定の位置に追加できます。

空の辞書から始めたとき、これは比較的簡単です。しかし、何千もの紙のページが満載された成熟した辞書について考えてみてください。

その成熟した辞書に単語をさらに追加したい場合は、ページにスペースが残っていない可能性があります。SQL Serverはページを「引き裂く」-新しいページを別の場所に移動し、単語の一部をその新しいページに移動します。新しいページは辞書の最後になります。良い知らせは、そのアクションの直後に、辞書の最後と半分に空のページがあり、どちらも単語を追加するスペースがあります。

あなたがたまたまその順序でそれらを追加しているなら、それはです。(これが、データのロード方法がますます重要になる理由です。)

インポートが一度に1行ずつ実行されると、パフォーマンスに大きな影響を与える可能性がありますか?

1秒のインデックスを忘れます-一度に1行ずつデータを追加することは、インデックス構造に関係なく、まったく非効率的です。SQL Serverはセットベースのシステムです-セットで作業できるときはいつでもそうするべきです。

データをクエリするとどうなりますか?

あなたはこれを尋ねませんでしたが、私はあなたにそれを尋ねています、ハハハ。

挿入後のことを思い出してください。これでほとんど順序付けされた辞書が手に入りましたが、辞書のいくつかのポイントに到達したら、後ろにジャンプして他のいくつかのページから読む必要があります。これらのページがすべてメモリ(RAM、バッファプールなど)にキャッシュされている場合、オーバーヘッドはそれほど大きくなりません。とにかくほとんどのメモリアクセスはランダムです-SQL Serverが辞書をメモリに順番に格納するのとは異なります。

一方、従来の磁気ハードドライブからデータを取得する必要がある場合(回転する錆)、そのデータが順番に格納されていると、パフォーマンスが少し向上する可能性があります。ただし、ここでの実際の設計目標は、データをドライブから取得するのではなく、RAMから取得することです。ディスク上の最適化されたデータとディスク上の断片化されたデータの違いは、ディスクから取得した場合とRAMから取得した場合の違いほど重要ではありません。

行の順序を気にせず、ID列を主キーとして追加し、日付列にインデックスを追加してクエリを支援する必要がありますか?

ビンゴ:これは、物理データベースの設計と論理データベースの設計の違いです。プログラマーは最初は物理データベースの設計について多くのことを心配する必要がありますが、データベースのサイズがたとえば100 GB未満であれば、いわば論理設計をポストで修正できます。初心者のためにそこにIDフィールドを配置し、その上にクラスター化し、数か月間稼働した後、インデックスの設計を再検討してパフォーマンスを最大化します。

とは言っても、この種の意思決定を経験すると、最初からインデックスを推測できるようになります。それでも、最初は通常、インデックスの設計についてはあまり考慮していません。ユーザーは、私が予想していた方法でデータを照会することはありません。


1
一つずつの挿入は理論的な質問でした。パフォーマンスの点では、ほとんどの場所で「行はクラスター化インデックスと同じ順序でディスク上に物理的に格納されている」ので、私には不審に思われました。
Sacha K

ID列に移動します。データは「最後に」追加され、当然日付順にソートされます。異なる場所で同じ日付が「近づく」ことはありませんが、それは私にはまったく関係ありません。
Sacha K
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.