2010-11-18 14 views
0

を移入するためのSQLのパフォーマンスを向上させる私はVARCHAR(50)一覧<T>

その結果は一覧よりも大きい場合、私はSELECT COUNT(*) FROM TABLE

を行う5分ごととしてPKを持つデータベース200,000レコードを持っています。カウントして実行する

"SELECT * FROM TABLE WHERE PRIMARYKEY NOT IN (" + myList.ToCSVString() + ")" 

私がこれを行う理由は、レコードが別のプロセスを介してテーブルに追加されているためです。

このクエリは実行に時間がかかり、また、私はそのはOutOfMemoryExceptionが

を投げると信じて、これを実装するための良い方法はありますか?

ありがとうございました

+0

SQL Serverまたは.NETアプリケーションがOutOfMemoryを投げていますか? –

+1

in節のように見えますが、約20MBの文字列データです。あなたのテーブルにタイムスタンプを追加し、作成された時間に基づいて新しいレコードを取得することができます。 –

+0

'OutOfMemoryException'はおそらく' myList.ToCSVString() 'に起因しています。それは200kのアイテム(おそらく7 * 200kバイト程度)を持つ非常に長い文字列になります。たとえそれがうまくいっても、SQLクエリは非常に遅くなります。 –

答えて

4

SQL Serverは、このためのソリューションを持っている、timestamp列を追加し、あなたがテーブル内の任意の行に触れるたびにタイムスタンプが成長します。

タイムスタンプ列のインデックスを追加します。

idsをメモリに格納する代わりに、ストアIDと最後のタイムスタンプ。更新するには

  • を最大タイムスタンプ
  • を選択するには、古い最大のタイムスタンプと現在の最大のタイムスタンプ
  • 間のすべての行が削除を処理リストに

が少しあることをマージを選択しますもっとトリッキーですが、あなたが削除するのではなく、削除すると達成できます。このCSVリストが大きい場合

+0

+1これはMySQLのすべてのテーブルで行います。何百万ものレコードを持つテーブルを実行しています。 MSSQLのバックグラウンドから来て、私は完全に自分自身をこの方法に渡したわけではありませんが、私の現在の会社ではかなりうまくいきます(すなわち、高速) –

+0

C#ではMax TimeStampを変数に5分ごとに格納してからSELECT *テーブルからのタイムスタンプBETWEEN(myTimeStampVariable、MAX(TimeStampColumn) – Jon

+0

@Jon、ここでは、同時実行性の問題を減らすための詳細はありますが、最初にmaxを選択し、temp varに格納し、前のmaxで範囲を決めます。あなたの新しいmaxに選択されたすべてのレコードが含まれるようにする前に、別のtranが新しいものを挿入する場合 –

1

テーブルを変更できますか?
この場合、PK TableIdとして機能する新しい自動インクリメント列を追加することができます。

それぞれSELECTに最大IDを保存し、次の選択項目にはTableId > maxIdを追加します。

0

INT PKを作成し、このようなものを使用します。デフォルト値と使用など、あなたのPKを変更できない場合

"SELECT * FROM TABLE WHERE MY_ID > " + myList.Last().Id; 

を、型として日付で別の列を作成し、NOWと()それは新しい項目を照会するためです。

0

プライマリキー用の単一の列を持つ別のテーブルをデータベースに作成します。アプリケーションが起動したら、このテーブルにPKを挿入します。そして、あなたではなく、カウントをチェックするより選択して直接追加キーを検出することができます。

select PrimaryKey from Table where PrimaryKey not in (select PrimaryKey from OtherTable) 
0

することは、私はそれにインデックスをつけ、一時テーブルにあなたのファイルをロード推薦と左がnull

select tbl.* 
from table tbl 
left join #tmpTable tmp on tbl.primarykey = tmp.primarykey 
where tmp.primary key is null 

編集に参加します:主キーはすべきではないがvarchar。ほとんどの場合、int/bigintがインクリメントされます。これはずっと簡単でした。行が直線的に挿入されませんので、インデックスの断片化の原因となるこのデザイン

P:

@lastknownkeyテーブルからどこのPrimaryKey> *選択し、これを設計しDBプログラマをスマック..