5

複数のステーションから大量のデータを同時に挿入すると同時に、データクエリインターフェイスを公開するシステムがあります。スキーマは次のようになります(フォーマットが不適切なため申し訳ありません)。

[SyncTable]
  SyncID
  StationID
  MeasuringTime


[DataTypeTable]
  TypeID
  TypeName


[DataTable]
  SyncID
  TypeID
  DataColumns...

データの挿入は「同期」で行われ、次のようになります(システムにデータを挿入するだけで、更新することはありません)

INSERT INTO SyncTable(StationID, MeasuringTime) VALUES (X,Y); SELECT @@IDENTITY

INSERT INTO DataTable(SyncID, TypeID, DataColumns) VALUES 
  (SyncIDJustInserted, InMemoryCachedTypeID, Data)
  ... lots (500) similar inserts into DataTable ...

そして、クエリは次のようになります(特定のステーション、測定時間、およびデータ型に対して)

SELECT SyncID FROM SyncTable WHERE StationID = @StationID 
                               AND MeasuringTime = @MeasuringTime 
SELECT DataColumns FROM DataTable WHERE SyncID = @SyncIDJustSelected
                                  AND DataTypeID = @TypeID

私の質問は、挿入のトランザクションレベルとクエリのNOLOCK/READPASTヒントをどのように組み合わせて次のようにすることができるかです。

  1. 挿入を優先しながら、システムの同時実行性を最大化します(大量のデータを保存する必要があり、1秒あたり2000以上のレコードが必要です)
  2. クエリは、「コミットされた」同期からのデータのみを返します(半分挿入された同期、またはロックスキップのためにスキップされたエントリとの同期を含む結果セットは必要ありません)
  3. 「最新の」データがクエリに含まれているかどうかは関係ありません。「ライブ」で最新のデータよりも一貫性と応答性を重視します。

これは非常に相反する目標であり、高いトランザクション分離レベルが必要になる場合がありますが、挿入と選択の両方で高い応答性を実現するためのすべてのトリックと最適化に関心があります。より多くの微調整やトリックを洗い流すためにさらに詳細が必要な場合は、喜んで詳しく説明します。

更新:将来の返信のためにもう少し情報を追加するだけです。最初は5TB以上のストレージを備えたSANネットワークでSQLServer2005(おそらく6か月以内に2008年)を実行しています。SAnが設定されているRAIDの種類と、使用可能なディスクの正確な数がわかりません。

4

3 に答える 3

1

これは、SQL Server 2005/2008 Enterprise のパーティショニング機能の優れたシナリオです。StationID ごとにパーティションを作成し、各 StationID のデータを独自のファイル グループに入れることができます (必要に応じて、負荷によっては必要ない場合があります)。

これにより、並行性に関するいくつかの利点が得られます。

  • ステーション ID でパーティション分割すると、ユーザーは現在ロードされていないステーション ID に対して選択クエリを実行でき、同時実行の問題はまったく発生しません。
  • ステーション ID でパーティション分割すると、複数のステーションが並行性の問題なしにデータを同時に挿入できます (それらが異なるファイル グループにある場合)。
  • syncid 範囲でパーティション分割すると、古いデータを低速のストレージに配置できます。
  • 同期 ID の範囲で分割する場合、および範囲が十分に小さい場合 (数千の同期 ID の範囲ではないことを意味します)、並行性の問題に遭遇することなく、ユーザーがクエリを実行しているときに同時にロードを実行できます。

あなたが説明しているシナリオは、データ ウェアハウスの夜間の負荷と多くの共通点があります。Microsoft は Project Real と呼ばれるテクニカル リファレンス プロジェクトを行いました。彼らはそれを標準として公開しており、設計ドキュメントと実装コードを読んで、非常に高速なロードを実現する方法を確認できます。

http://www.microsoft.com/technet/prodtechnol/sql/2005/projreal.mspx

SQL Server 2008 では、特に同時実行性に関して、パーティショニングがさらに優れています。これはまだ特効薬ではありません。熟練した DBA による手動の設計と保守が必要です。これは設定して忘れる機能ではなく、Enterprise Edition が必要ですが、Standard Edition よりもコストがかかります。私はそれを気に入っています - 私はそれを数回使用しましたが、それは私にとって特定の問題を解決してくれました.

于 2008-11-15T12:32:11.147 に答える
1

SQL 2005 以降を実行している場合は、スナップショット分離の実装を検討してください。nolock では一貫した結果を得ることができません。

これを SQL 2000 で解決するのは非常に困難です。

于 2008-11-14T00:12:36.553 に答える
0
  1. どのタイプのディスク システムを使用しますか? 大規模なストライプ RAID アレイがある場合、書き込みは適切に実行されるはずです。1 秒あたりに必要な読み取りと書き込みを見積もることができれば、それらの数値を式に当てはめて、ディスク サブシステムが追いつくかどうかを確認できます。多分あなたはハードウェアを制御できません...

  2. 挿入をトランザクションでラップしないと、挿入が完了するまで読み取りに使用できなくなりますか?

  3. ハードウェアが正しく構成されていて、SQL コーディングに注意を払っている場合、これに従う必要があります。

SQLIO.exe と SQL Stress ツールを調べます。

SQLIOStress.exe SQLIOStress.exe は、SQL Server 2000 の I/O 動作のさまざまなパターンをシミュレートして、基本的な I/O の安全性を確保します。

SQLIOStress ユーティリティは、Microsoft の Web サイトからダウンロードできます。次の記事を参照してください。

• SQLIOStress ユーティリティを使用して SQL Server などのディスク サブシステムに負荷をかける方法 http://support.microsoft.com/default.aspx?scid=kb;en-us;231619

重要 ダウンロードには、ユーティリティに関する詳細が記載された完全なホワイト ペーパーが含まれています。

SQLIO.exe SQLIO.exe は、基本的なベンチマーク テスト結果を確立するために使用される SQL Server 2000 I/O ユーティリティです。

SQLIO ユーティリティは、Microsoft の Web サイトからダウンロードできます。以下を参照してください。 • SQLIO パフォーマンス テスト ツール (SQL 開発) – お客様が入手可能

于 2008-11-13T19:04:41.557 に答える