4

いくつかの簡単な基準に基づいてペアリングする必要のあるデータがたくさんあります。時間枠があり(両方のレコードにDateTime列があります)、あるレコードが別のレコードに非常に近い場合(5秒以内)、一致する可能性があり、時間的に最も近いレコードは完全一致と見なされます。これを絞り込むのに役立つ他のフィールドもあります。

完全に一致したデータセットをC#アプリケーションに返す前に、サーバー上でこの一致を実行するストアドプロシージャを作成しました。私の質問は、100万(x2)行を取得してC#で処理する方がよいのでしょうか、それともSQLサーバーがこのマッチングを実行するのに適しているのでしょうか。SQLサーバーの場合、日時フィールドを使用してデータをペアリングする最速の方法は何ですか?

現在、表1 /表2からすべてのレコードを一時テーブルに選択し、表1の各レコードを反復処理して、表2で一致するものを探し、一致するもの(存在する場合)を一時テーブルに保存してから、両方のレコードを削除します。独自の一時テーブルで。

私が書いているゲームのためにこの作品を急がなければならなかったので、悪い(非常に悪い)手順を許してください...それはうまくいきます、それはひどく非効率的です!SP全体はpastebinで入手できます:http: //pastebin.com/qaieDsW7

SPの記述が不十分であることはわかっているので、「ねえ、ばかげた...もっと上手に書いてください」と言っても役に立ちません。私はそれを改善するための助けを探しています、または私が全体を違ったやり方で行うべき方法についての助け/アドバイスを探しています!私はそれを書き直すのに約3/5日あります、私はその締め切りを少し遅らせることができます、しかしあなたたちが時間内に私を助けることができれば私はむしろしたくありません!:)

ありがとう!

4

4 に答える 4

2

データがすでにデータベースにある場合は、そこで作業を行う必要があります。SQL Server Management Studioを使用してプランを表示およびクエリする方法を絶対に学び、ネストされたループなどの高価な計算に気づき、最適化できるようになる必要があります。

あなたのタスクはおそらく一時テーブルの使用を必要としません。一時テーブルは、比較的小さいか、頻繁に再利用される場合に効率的である傾向がありますが、これはあなたの場合ではありません。

于 2012-05-29T21:39:33.420 に答える
2

最終的には、データベース側でデータをコンパイルすることは、99%の確率で望ましいです。これは、データの処理(インデックス、リレーションなどを使用)用に設計されているためです。結合を使用してデータを正確に必要な形式でコンパイルすることにより、コードの多くを統合できます。実際、ほとんどすべての一時テーブルを完全にバイパスして、マスターイベント一時テーブルを埋めることができます。

一般的なパターンは次のとおりです。

INSERT INTO #Events
SELECT <all interested columns>
FROM 
    FireEvent
    LEFT OUTER JOIN HitEvent ON <all join conditions for HitEvent>

このようにして、すべての火災イベントを0個以上のHitEventに一致させます。チャットでの議論の後、サブクエリでラップし、ウィンドウ関数を使用して外部クエリにROW_NUMBER() OVER (PARTITION BY HitEvent.EventID ORDER BY ...) AS HitRank追加することで、ヒットイベントを0または1に制限することもできます。WHERE HitRank = 1これは最終的にあなたがやったことであり、あなたが期待していた結果を得ました(その過程で少しの作業と学習がありました)。

于 2012-05-30T21:45:18.327 に答える
1

が十分に高速に実行されておらず、C#で書き直さない場合は、ストアドプロシージャを最適化することをお勧めします。とにかくSQLServerから何百万もの行を転送したいのはなぜですか?

残念ながら、SQL Serverがインストールされていないため、スクリプトをテストできませんが、CREATEINDEXステートメントが表示されません。簡潔にするためにそれらをスキップしただけではない場合は、クエリを確実に分析して、必要なインデックスを確認する必要があります。

于 2012-05-29T21:33:39.870 に答える
1

したがって、答えは、クライアント/サーバーごとに利用可能なリソース(RAM / CPU /並行ユーザー/並行プロセスなど)などのいくつかの要因によって異なります。

使用するものに関係なく、パフォーマンスを向上させる基本的なルールは次のとおりです。

  • 100万行をc#プログラムにロードすることは良い習慣ではありません。これが大量のRAMを使用するスタンドアロンプ​​ロセスでない限り。
  • Uniqueidentifiersは整数を実行することはありません。比較
  • Common Table Expressionは、高速なマッチングを行うための優れた代替手段です。CTEの使用方法
  • 最後に、出力を検討する必要があります。ユーザーインターフェイスに影響を与える読み取りと書き込みが常にある場合は、それをメモリ(c#)で管理する必要があります。そうでない場合は、すべてのCRUD操作をデータベース内に保持する必要があります。
于 2012-05-29T21:47:28.350 に答える