0

私たちの Windows フォーム アプリケーションは、ADO.NET と SOAP Web サービスを介して SQL Server のビューからレコードを取得し、データ グリッドに表示します。25,000 行までのケースがいくつかありましたが、これは比較的スムーズに機能しますが、潜在的な顧客は 1 つのリストにその何倍もの行を含める必要があります。

現時点でどれだけうまくスケーリングできるか、またどのように (そしてどこまで) 現実的に改善できるかを把握するために、シミュレーションを実装したいと思います。実際のデータを表示する代わりに、SQL Server に架空のランダム データを送信させます。クライアント側とトランスポート側はほとんど同じです。もちろん、ビュー (または少なくとも基になるテーブル) の動作は異なります。ユーザーは、架空の行数 (たとえば、100,000) を指定します。

とりあえず、クライアントがデータを取得して処理し、表示する準備が整うまでにかかる時間を知りたいだけです。

私が理解しようとしているのはこれです:SQL Serverにそのようなデータを送信させるにはどうすればよいですか?

私は:

  1. 実際のテーブルを埋めるために事前に実行する必要があるストアド プロシージャを作成しますか?
  2. ビューを指す関数を作成して、サーバーに「ライブ」データを生成させますか?
  3. どういうわけか既存のデータを複製および/またはランダム化しますか?

最初のオプションは、現実世界に最も近い結果が得られるように思えます。データは実際には「物理的にそこにある」ため、SELECTクエリは実際のデータに対するクエリとパフォーマンス的に非常に似ています。ただし、それ以外の場合は無意味な操作でサーバーに負担がかかります。偽のデータも同じデータベースに存在するため、バックアップされます。もちろん、ベンチマークを実行するたびにデータを削除しない限り.

2 番目と 3 番目のオプションは、実際のシミュレーションの実行にサーバーに負担をかけるため、結果が非​​現実的に遅くなる可能性があります。


さらに、ループやカーソルを使用しない限り、これらの行を作成する方法がわかりません。実際にエントリがSELECT top <n> random1(), random2(), […] FROM fooある場合は使用できますが、それ以外の場合は (明らかに) たまたまある行だけを取得します。Aまたは類似のものは、そのトリックを行うようには見えません。foo<n>fooGROUP BY newid()

4

4 に答える 4

2

CRMタイプのテーブルをテストするためのデータについては、fakenamegenerator.comを強くお勧めします。40,000の偽の名前を無料で入手できます。

于 2008-10-11T17:14:42.357 に答える
1

SQL Server 2008 を使用している場合は言及しませんでした。2008 を使用し、データ圧縮を使用する場合、ランダム データは実際のデータとは非常に異なる (遅い) 動作をすることに注意してください。ランダム データは圧縮がはるかに困難です。

Quest Toad for SQL Server と Microsoft Visual Studio Data Dude にはどちらも、偽の「実際の」データをレコードに入れるテスト データ ジェネレーターがあります。

于 2008-10-19T00:45:27.417 に答える
0

信頼できる結果が必要な場合は、テスト シナリオを可能な限り現実的なものにする必要があります。あなたが指摘するように、他のオプションでは不十分な結果が得られた場合、それがデータベースの動作の違いによるものではないことを確信できません。

データを生成する方法は、問題のドメインに大きく依存します。複数の顧客からデータ セットを取得し、それらを 1 つのメガ データセットに結合できますか? データが時系列の場合、別の範囲で複製できる可能性があります。

于 2008-08-31T17:57:43.780 に答える
0

データは通常、連絡先、プロジェクトなどの CRM に似ています。単純にデータを複製するだけでも問題ありません (たとえば、20,000 行しかない場合は、必要な 100,000 行を取得するために 5 回コピーします)。一方、マージは、明らかにプライバシー上の理由から、ベンチマーク ツールを公に展開しない場合にのみ機能します (もちろん、元のデータを修復できないほど理解不能にする関数を各列に適用しない限り? ハッシュ関数に似ています)。 、値のサイズをあまり変更しない場合のみ)。

行にデータを入力するには、おそらく次のようにします。

WHILE (SELECT count(1) FROM benchmark) < 100000
  INSERT INTO benchmark
  SELECT TOP 100000 * FROM actualData
于 2008-08-31T18:12:52.277 に答える