大規模なデータセットを処理するために、SQL Server 2008 R2のシャーディングを設定するためのパターン?


14

SQL Server 2008 R2で大きなデータセット(> 10億行)を処理したい。「シャーディング」または「水平パーティショニング」を設定すると、テーブルが複数のファイルに分割されるため、大規模なデータセットをすばやく処理できると聞きました。

以前にシャーディングまたは水平分割を使用したことがありますか?もしそうなら、あなたの経験では、単一の巨大なテーブルと比較してより良い結果を達成するパターンを提案できますか?

回答:


23

まず、通常のコモディティサーバーハードウェア上のパーティションアーキテクチャで10億行を効率的に処理できることに注意してください。このデータボリュームには、エキゾチックなシェアードナッシングアーキテクチャは必要ありませんが、おそらくテーブルパーティション化から大きなメリットが得られるでしょう。

シャーディングは水平パーティショニングとは異なるものであり、SQL Server 1のほとんどのバージョンではサポートされていない「共有なし」アーキテクチャを意味します。

SQL Serverは水平パーティショニングをサポートでき、共有ディスクアーキテクチャは1ビロン行までで十分です。

SQL Serverでは、パーティション関数を作成して、テーブルの列の値または値の範囲に基づいてパーティションを選択します。たとえば、

create partition function F_AccPrdPart (int)
    as range left for values (
    180001                         -- Dummy value
   ,199012 ,199112 ,199212 ,199312, 199412 ,199512
   ,199612 ,199712 ,199812 ,199912 ,200012 ,200112
   ,200212 ,200312 ,200412 ,200512 ,200612 ,200712
   ,200812
   ,200901, 200902, 200903, 200904, 200905, 200906
   ,200907, 200908, 200909, 200910, 200911, 200912
   ,201001, 201002, 201003, 201004, 201005, 201006
   ,201007, 201008, 201009, 201010, 201011, 201012
   ,201101, 201102, 201103, 201104, 201105, 201106
   ,201107, 201108, 201109, 201110, 201111, 201112
   ,202012
   ,939999                         -- Dummy value
)
go

次に、パーティションを割り当てる1つ以上のファイルグループを作成します。大規模なデータセットの場合、これらのファイルグループは異なる物理ボリュームに設定できます。この場合、ほとんどすべての場合、直接接続ストレージはSANよりもはるかに高速になることに注意してください。次の例では、PartVol1-PartVol6という6つのファイルグループを作成します。

パーティション関数の値に基づいて、テーブルパーティションをファイルグループに割り当てるために、1つ以上のパーティションスキームを作成できます。

create partition S_AccPrdPart as partition F_AccPrdPart
    TO ([PRIMARY]
      ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6] 
      ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6]
      ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6]
      ,[PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
      ,[PartVol2]
      ,[PRIMARY]
      ,[PRIMARY])
go

このスキームは、会計期間で分割するように設計されています。日付も頻繁に使用されますが、任意のキーを使用できます。

パーティション構成に、ファイルグループのようにテーブルを作成できます。たとえば、

Create table FooTrans (
       FooTransID        int identity (1,1) not null
      ,AccPeriod         int not null
      ,[...]
) on S_AccPrdPart (AccPeriod)
go

指定されたファイルグループの代わりにパーティションスキームでテーブルが作成され、句がパーティションキーとして使用される列を指定することに注意してください。パーティションキーに基づいて、テーブル内の行はパーティションスキーム内のファイルグループの1つに割り当てられます。

注:パーティションスキームを設計するための経験則では、各パーティションの行数は数千万、たとえば行の幅に応じて1,000万から5,000万の間である必要があります。パーティションが置かれているディスクボリュームは、少なくとも1つのパーティションを数秒でスキャンできるほど高速でなければなりません。

パーティショニング、シャーディング、およびシェアードナッシングシステム

ここでは、このトピックに関する議論の一部を明確にするために、少し用語を説明します。

  • 「非共有」システムは、ノードが共有SANストレージを持たないが、ノードのローカルストレージを使用する並列システムです。このタイプのアーキテクチャの典型的な例は、Teradataです。シェアードナッシングシステムは、中央のI / Oボトルネックがないため、非常に大きなデータセットに適しています。I / Oスループットは、システム内のノードの数に比例します。

  • 「共有ディスク」システムは、1つ以上のデータベースサーバーが単一のディスクストレージサブシステムを共有するシステムです。データベースは、ローカルストレージまたはSANに接続された単一のサーバー、または共有SANに接続されたサーバーのクラスターにすることができます。このタイプのシステムは、ストレージサブシステムから利用可能なスループットによって制限されます。

  • 「シャーディング」とは、シェアードナッシングアーキテクチャの複数の物理サーバー間でデータベースを分割することを表す用語です。さまざまなプラットフォームで、シャーディングされたデータベースのサポートは多かれ少なかれあります。Teradataサークルでは、物理アーキテクチャが何も共有されていないタイプであっても、Teradataは透過的な単一システムイメージをクライアントに提示するため、この用語は使用されません。

    SQL Serverの古いバージョンでは、分散パーティションビューを介したシャーディングのサポートが制限されています。Microsoftは現在、単一のシステムイメージで何も共有しないアーキテクチャをサポートするSQL Server 2008 R2のバージョンを作成していますが、このバージョンはOEMのみが利用でき、ハードウェアバンドルでのみ購入できます。

10億行

10億行(個々の行が極端に広い場合を除く)の場合、共有された何もない、または断片化されたアーキテクチャは、過剰な領域で快適に動作します。このタイプのボリュームは、十分に高速なディスクサブシステムがあれば、妥当な仕様の単一サーバーで処理できます。

ローカルダイレクトアタッチディスクは、パフォーマンスの価格の点で最も費用対効果が高くなります。単一のSAS RAIDコントローラーは複数のアレイを取ることができ、複数のコントローラーをサーバーにインストールできます。構成に応じて、最新の24〜25スロットSASアレイは、ストリーミングパフォーマンスで数千のIOPSまたは1GB + / secを処理できます。複数のPCI-eバスと複数のコントローラーを備えたサーバーは、理論的にはそれ以上を処理できます。

10億行のデータベースで動作するために必要なパフォーマンスのタイプは、コモディティサーバーハードウェアとこのタイプの直接接続ストレージで非常に簡単かつ安価に実現できます。SANを使用することもできますが、同等のパフォーマンスを得るために複数のSANコントローラーが必要になる場合があり、ハードウェアは一桁高価になる可能性があります。

一般的な推奨事項として、本当に良好な稼働時間を必要としない限り、I / O要件が厳しいアプリケーションには直接接続ストレージを使用します。構成および変更制御エラーは、最新のデータセンター運用におけるハードウェア障害よりも、予定外のダウンタイムのはるかに大きな原因です。

SANは、幅広い集中管理ストレージ管理機能を提供するため、アプリケーションの大規模なポートフォリオがある場合、管理しやすいストレージプラットフォームを提供できます。ただし、これには大きなコストがかかり、SANベースのインフラストラクチャから高いパフォーマンスを引き出すことは難しく、高価です。

1 MicrosoftはSQL Serverのパラレルバージョンを作成していますが、ハードウェアにバンドルされているOEMチャネルを通じてのみ利用可能です。市販のバージョンは、この機能をサポートしていません。


3
うわー-驚くべき答え、このプロジェクトをうまく機能させるために必要なすべてのヒントだと思います。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.