web-dev-qa-db-ja.com

何千ものSQLServerデータベースにわたるパフォーマンスの最適化

各クライアントが独自のデータベースを持つアプリケーションを構築しています。データベースはどれも特に大きくはありませんが(それぞれ20MBから400MB)、開始するのに最大5,000があり、いつでも100程度がアクティブになります。

私たちのチームは、システムをセットアップするための最良の方法について議論してきました。クライアントは2週間に1回だけデータベースにアクセスし(401k /金融処理)、一度に10〜30分間しかデータベースを使用しません。操作は読み取り/書き込み間で均等に分散されます。

私たちのチームの半分は、結果としてデータベースを複数の安価なサーバーに分散し、SQL Expressを使用する必要があると感じています...各データベースの使用期間が短いため、メモリ/キャッシュはそれほど有用ではないと彼らは言います(私たち複数のサーバーで完全なSQL標準の予算がありません)。

これは本当ですか?より高いメモリ制限は、MSSQL Standardがもたらす唯一の利点です(バックアップ/復元、スキーマのアップグレード、データの移行などを行うためのスクリプトはすでにあります)。

更新

特に、複数のデータベースと1つのデータベースのパフォーマンス特性に関心があります。エンドユーザーエクスペリエンスは、1TBのデータベースよりも単一の200MBのデータベースにアクセスする方が良いのではないでしょうか(両方のインデックスが適切に作成されている場合でも)。これは、単一のクライアントデータベースを非常に高速に簡単にバックアップ/復元できることも意味します。 「数千のデータベース」シナリオをより適切に処理するために、SQL Serverを調整する必要がありますか?

5
Beep beep

私はそれをすべて1つのサーバーに投げます。いくつかの安価なSQLExpressサーバーを維持するのは面倒です。データベース、ログ、および一時データベースをさまざまなRAIDディスクアレイに分散させることができます。すべてのデータベースで一度に使用される可能性があるため、一時データベースを独自の配列に移動することを検討する必要があります。

2008年のリソースガバナーをチェックして、サーバーをクロールするユーザーがいないことを確認してください。ただし、エンタープライズバージョンのみです。

3
Sam

ジェス、

環境や使用パターンについて詳しく知らなくても、各クライアントが独自のデータベースを持っているとパフォーマンスが向上する可能性があります(つまり、1つの大きなデータベースに対して数千の小さなデータベース)。クライアントはテーブルのセットを共有するのではなく、独自のテーブルのセットにのみヒットするため、テーブルと行がロックされる可能性を減らすことができる可能性があります。ただし、ディスクI/Oは依然として制限要因になります。

また、各データベースにはクライアントごとに固有のアクセス許可のセットがあるため、セキュリティがより明確になります。あなたが述べたように、バックアップと復元は小さなデータベースではるかに高速になりますが、これらのバックアップジョブのセットアップとメンテナンスは非常に複雑になります(しかし、あなたはすでにそれを説明しているようです)。

ハードウェアをお持ちの場合は、データ、ログ、TempDBに異なるRAIDアレイを設定することを強くお勧めします(Samが提案したように)。ある種の直接接続ストレージまたはSANを使用していて、追加のアレイを購入できる場合は、データベースの実際のファイルを別のアレイに分割することを検討することもできます。

HTH、ダン

2
SQL3D

マルチテナントクライアントアクセスのホスティングを提供する場合は、ボリュームライセンスを サービスプロバイダー として選択することもできます。これは、CPUごとの標準ライセンスを購入するよりも大幅に安くなる可能性があります。月額料金を効果的にサービスに引き継ぎます。

ホスティング用に複数のSQLExpressインスタンスをデプロイすることは、実際には 推奨事項に反して です。

SQL 2008とR2に関しては少し時代遅れですが、ホワイトペーパーを読むことをお勧めします Webホスティング環境向けのSQL Server 2005導入ガイダンス このガイダンスは、他のホスティング環境やマルチテナント環境だけでなく、他のホスティング環境にも適用されます。 Webホスティングに。

2
Remus Rusanu

最大の課題はおそらくバックアップです。 SQL Expressを使用する場合、それらを実行するエージェントがないため、Windowsのスケジュールされたタスクといくつかの高度なスクリプトに依存する必要があります。

SQL Std/Ent Editionを使用していて、組み込みのメンテナンスプランを使用してすべてのデータベースをバックアップしようとすると、一度に1つずつバックアップが実行され、時間がかかる場合があります。ログバックアップについても同じです。

サーバー上のその数のデータベースでミラーリングを使用することさえ考えないでください。

よく考えられたフェイルオーバー戦略を使用して、より多くのサーバーに傾倒します。

1
SqlACID

ここで考慮すべきことの1つは、tempdbおよび複数のディスクに分散されたdbファイルに複数のファイルを追加することです。その後、SQLはスピンドル間で読み取りと書き込みを分散できます... https://stackoverflow.com/questions/719869/how-to-spread-tempdb-over-multiple-files を参照してください

1
Paul D'Ambra

覚えておくべきもう1つの考慮事項は、「複数の安価なサーバー」に分散した数千のSQLデータベースを維持するための周辺コストです。サーバーの数が増えると、ラックスペースの要件が増加し、追加のすべてのハードウェアを使用してデータセンターに電力を供給して冷却するためのコストも増加します。 1台のサーバーに対して複数のサーバーを維持する必要がある場合の管理コスト/時間の増加は言うまでもありません。

1
SQL3D

これを間違えないでください。あなたはあなたがしていることをする正当な理由があるかもしれません。私がいるところから、なぜ誰もが数千のデータベースを持ちたいと思うのかわかりません。アプリケーションに設計上の欠陥があるように見えますが、今は修正せずにそれを克服する方法を探しています。基本的なデータベース設計を再考することを真剣に勧めます。

これを言った:非常に多くのデータベースを持つ正当な(おそらく合法的な)理由がある場合は、これを考慮してください:まともなMS SQL Serverは数百の小さなデータベースを簡単に処理できます(500 x 400MB = 200GBのデータ、これは問題ではありません)。これにより、追加のSQLServerライセンスについて心配する必要がないほど十分な収入が得られるはずです。次に、名前を付けるか、他の方法を選択するだけで、それらを分割できます。

または、ライセンスがそれほど問題にならないMySQLの使用を検討することもできます(ただし、ストアドプロシージャを多用する場合、これはオプションではないことを認識しています)。

0
wolfgangsz