2009-07-19 15 views
4

VSTS 2008 + C#+ .Net 3.0 + ADO.Net + SQL Server 2008を使用しています.ADO.NetからSQL Server側からストアドプロシージャを呼び出しています。ストアドプロシージャはストアドプロシージャから何千もの行を効率的に取得する方法

SELECT Table1.col2 
FROM Table1 
LEFT JOIN Table2 USING (col1) 
WHERE Table2.col1 IS NULL 

私の質問は、どのように効率的に(私のサンプルでTable1.col2を)返された行を取得するためにされ、このようなものですか?私の結果は、最大5,000行を返し、Table1.col2のデータ型はnvarchar(4000)です。事前に

おかげで、 ジョージ

+2

この構文でSQL Server 2008を使用していますか? – gbn

+0

疑似コード、何が問題なのですか? – George2

+2

問題はありませんこれは他のデータベースエンジンにとって有効な構文なので、人を混乱させるでしょう – gbn

答えて

7

あなたできません - あなたは多くのデータを効率的に....

効率的であることの全体のポイントは、あなたが取得するデータを制限することであることを取得することはできません - のみ実際に必要な列(SELECT *はありませんが、SELECT(フィールドのリスト)は既に行っています)と、扱うことができる行の数だけです。

たとえば、ユーザーが何千ものエントリを持つ単一の値を選択する必要があるドロップダウンまたはリストボックスを埋めることは望ましくありません。これは実現可能ではありません。

私の主張は、実際には、本当に本当に5000行以上を返す必要がある場合は、時間がかかることになります。あなたはそれについて多くのことをすることはできません(行あたり5000バイトの5000行を送信すると、それは25,000,000バイトまたは25メガバイトになります。

返される行の数を10,20,50程度に制限する方法が見つかった場合は、実際には高速になります。考えてみてください:サーバー側のページング!! :-)

Marc

+0

Marcさん、ADO.Netクライアント側からデータを操作する方法には、パフォーマンスの違いはありますか?私は、返されたデータを一度だけ連続して読み取る必要があります。あなたが私にADO.Netクライアント側からデータを取得するよう提案した解決策は何ですか? – George2

+1

これらの5000行を取得する必要がある場合は、SqlDataReaderが必要な列を取得してリストなどに格納する最速かつ最適な方法です。 –

4

あなたはデータで何をしたいのかは言いません。ただし、.NETで結果を処理する必要がある場合は、SqlDataReaderを使用して結果を読み取るのが最も効率的です。

+0

返されたデータは、一度だけ連続して読み取る必要があります。あなたが私にADO.Netクライアント側からデータを取得するよう提案した解決策は何ですか? – George2

+3

それはあなたの主な関心事は何か - メモリであるか、またはデータベースへの接続を長時間開いているかによって異なります。メモリを節約したい場合は、SqlDataReaderを使用して一度に1行を読み取り、処理してから次の行に移動します。ただし、メモリが大きな問題でない場合は、上記のようにしてSqlDataReaderを使用してリストを作成します。ここで、Tは列を含むクラスです。リストにすべてを読んで、それ以降はそれを処理してください。 http://www.devx.com/vb2themax/Aricle19887/1954を参照してください。 –

2

1つには使用すると思います。

SELECT 
    Table1.col2 
FROM 
    Table1 
WHERE 
    NOT EXISTS (SELECT * 
     FROM 
      Table2 
     WHERE 
      Table2.col1 = Table1.col1) 

問合せは、(COL1がインデックスもちろんのCOLS(非常に広いインデックスをカバーしていると仮定)、効率的にすることができますが、それでも、ネットワークを介して大量のデータをシャベルする必要があります。

それはあなたに何を依存しますパフォーマンスによって意味があります。レポートでは5000行ほどではありませんが、コンボボックスには多くのものがあります。

関連する問題