none
データベースからデータセットへ持ってくるのデータ量の違いについて RRS feed

  • 質問

  • あるSQL Server 2008 Express には10万件のデータがあるとします。

    うち半数は男性だとします。

    データベースの男性に対しての値を操作するアプリをVB2010で作りたく、
    このアプリのデータセットへ引っ張ってくるデータをできるだけ少なくしたい場合には、

    データベースエクスプローラーから[新しいクエリ]でデータテーブルを作成する場合と

    データソースの[ウィザードでデータソースを構成]でいったんデータテーブルを作成し、
    出来上がったデータテーブルのテーブルアダプターに[クエリの追加]にてFillby○○を
    作成する場合とでは、

    データベースからひっぱってくるデータ量に違いがでてくるのでしょうか?

    みなさんは、引っ張ってくるデータ量をできるだけ少なくしたい場合には
    どのようにやってらっしゃいますか?

    ご教示の程、よろしくお願い申し上げます。

    2012年5月10日 3:53

回答

  • ウィザードの作成手順ではなく、ウィザードで作成されたメソッドが発行するSQLによって取得するデータが決まります。

    今回の場合、いずれの方法でも、発行されるのはWHERE句で男性のみに限定するSQLで変わりませんから、取得されるデータも変わりません。


    Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/

    • 回答としてマーク kei_chan_gt 2012年5月14日 13:42
    2012年5月10日 4:11
  • > データベースからひっぱってくるデータ量に違いがでてくるのでしょうか?

    最終的に同じクエリを SQL Server に発行するならデータ量は変わらないと思います。

    私なら、必要最小限なレコードを必要なカラム分だけ持ってくるようにします。
    その前に、10万件もレコード引っ張ってくる必要が本当にあるのか、仕様自体を疑いますが。


    ひらぽん http://d.hatena.ne.jp/hilapon/

    • 回答としてマーク kei_chan_gt 2012年5月14日 13:42
    2012年5月10日 4:13
    モデレータ
  • データベースからひっぱってくるデータ量に違いがでてくるのでしょうか?

    データベースからひっぱってくるデータは、どちらもデータテーブルに保存されます。どのようなデータをひっぱってくるかは、どのようなクエリを実行するかに依存します。どのようにデータテーブルを作るかは関係ありません。

    みなさんは、引っ張ってくるデータ量をできるだけ少なくしたい場合には
    どのようにやってらっしゃいますか?

    男性分だけだとして約5万件だと思いますが、通常、これだけの量をデータテーブルに落とすことはありません。ユーザーに5万件の一覧を見せても、一般的には必要なデータはその中のごく一部です。したがって、ユーザーにはもっと抽出条件を絞って、少ないデータを見せるようにします。また、男性のデータから統計などしたい場合は、SQL Server側でストアドプロシージャなどを使って処理し、その結果を取得するようにします。

    通常、データベースから多くのデータを一度に抜いてくることはありません。kei_chan_gtさんはどのようなことをされたいのでしょうか? それによって解決への方向が変わるのではないかと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク kei_chan_gt 2012年5月14日 13:42
    2012年5月10日 4:15
    モデレータ
  •  SELECT ○○,○○ FROM ○○ WHERE 性別 = 1

    としたとき、もしかして前者は、性別 = 1 のデータのみを引っ張り
    後者は、全データを引っ張ってきてから 性別 = 1 のデータを表示

    となるのかな?と思った次第です。

    なるほど。そこに疑問があったわけですね。既に回答が出ている通り、そんなことはありません。データベースからは性別 = 1であるデータのみを引っ張ってきます。ですから、プログラム側でしっかり抽出条件を絞ってください。

    でもやはり、多くのデータ持つテーブルを対象に SELECT を投げる場合には
    非接続型よりも、従来の接続型(ストアドやコマンド)の方がよろしいのでしょうか?

    接続型がストアドプロシージャやコマンドというわけではありませんよ。接続型は、ある処理を行う時に最初から最後までデータベースにつながったままになりますが、非接続型は処理の途中で一旦データベースから接続が切れ、通常はデータテーブルに取得したデータで処理を続行し、最後に処理した結果をデータベースにふたたび接続して返す流れになります。コマンドはデータベースと対話する手段を提供するものであり、手段の方法の一つがストアドロシージャです。ですから、コマンドは接続型、非接続型にかかわらず使用できます。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク kei_chan_gt 2012年5月14日 13:42
    2012年5月11日 4:58
    モデレータ

すべての返信

  • ウィザードの作成手順ではなく、ウィザードで作成されたメソッドが発行するSQLによって取得するデータが決まります。

    今回の場合、いずれの方法でも、発行されるのはWHERE句で男性のみに限定するSQLで変わりませんから、取得されるデータも変わりません。


    Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/

    • 回答としてマーク kei_chan_gt 2012年5月14日 13:42
    2012年5月10日 4:11
  • > データベースからひっぱってくるデータ量に違いがでてくるのでしょうか?

    最終的に同じクエリを SQL Server に発行するならデータ量は変わらないと思います。

    私なら、必要最小限なレコードを必要なカラム分だけ持ってくるようにします。
    その前に、10万件もレコード引っ張ってくる必要が本当にあるのか、仕様自体を疑いますが。


    ひらぽん http://d.hatena.ne.jp/hilapon/

    • 回答としてマーク kei_chan_gt 2012年5月14日 13:42
    2012年5月10日 4:13
    モデレータ
  • データベースからひっぱってくるデータ量に違いがでてくるのでしょうか?

    データベースからひっぱってくるデータは、どちらもデータテーブルに保存されます。どのようなデータをひっぱってくるかは、どのようなクエリを実行するかに依存します。どのようにデータテーブルを作るかは関係ありません。

    みなさんは、引っ張ってくるデータ量をできるだけ少なくしたい場合には
    どのようにやってらっしゃいますか?

    男性分だけだとして約5万件だと思いますが、通常、これだけの量をデータテーブルに落とすことはありません。ユーザーに5万件の一覧を見せても、一般的には必要なデータはその中のごく一部です。したがって、ユーザーにはもっと抽出条件を絞って、少ないデータを見せるようにします。また、男性のデータから統計などしたい場合は、SQL Server側でストアドプロシージャなどを使って処理し、その結果を取得するようにします。

    通常、データベースから多くのデータを一度に抜いてくることはありません。kei_chan_gtさんはどのようなことをされたいのでしょうか? それによって解決への方向が変わるのではないかと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク kei_chan_gt 2012年5月14日 13:42
    2012年5月10日 4:15
    モデレータ
  • みなさま、ご回答ありがとうございます<(_)>

    すいません、10万件とは例えです。実例ではありません。
    実際は500件程度です(^_^;)

    あまりに少ないデータ量だと「それくらいじゃたいして差はないよ」と
    言われるかな?と思い、データ量を多めに書いちゃいました(^^ゞ
    にしても10万件は極端でした。すみません。

    将来的にデータ量が増える事を見越して、今のうちにできるだけ
    最小限のデータ件数のみを引っ張ってくるシステムを作りたいと
    思っておりました。システムは健診結果の分析システムです。

    投稿した手順ではどちらも同じく

     SELECT ○○,○○ FROM ○○ WHERE 性別 = 1

    としたとき、もしかして前者は、性別 = 1 のデータのみを引っ張り
    後者は、全データを引っ張ってきてから 性別 = 1 のデータを表示

    となるのかな?と思った次第です。
    もちろん実際は抽出条件をもっと絞る予定です。

    でもやはり、多くのデータ持つテーブルを対象に SELECT を投げる場合には
    非接続型よりも、従来の接続型(ストアドやコマンド)の方がよろしいのでしょうか?

    私のあいまいな書き込みの内容で混乱させてしまい、申し訳ございません。
    どうかご教示の程、よろしくお願い申し上げます。

    • 編集済み kei_chan_gt 2012年5月11日 3:48 追記
    2012年5月11日 3:41
  •  SELECT ○○,○○ FROM ○○ WHERE 性別 = 1

    としたとき、もしかして前者は、性別 = 1 のデータのみを引っ張り
    後者は、全データを引っ張ってきてから 性別 = 1 のデータを表示

    となるのかな?と思った次第です。

    なるほど。そこに疑問があったわけですね。既に回答が出ている通り、そんなことはありません。データベースからは性別 = 1であるデータのみを引っ張ってきます。ですから、プログラム側でしっかり抽出条件を絞ってください。

    でもやはり、多くのデータ持つテーブルを対象に SELECT を投げる場合には
    非接続型よりも、従来の接続型(ストアドやコマンド)の方がよろしいのでしょうか?

    接続型がストアドプロシージャやコマンドというわけではありませんよ。接続型は、ある処理を行う時に最初から最後までデータベースにつながったままになりますが、非接続型は処理の途中で一旦データベースから接続が切れ、通常はデータテーブルに取得したデータで処理を続行し、最後に処理した結果をデータベースにふたたび接続して返す流れになります。コマンドはデータベースと対話する手段を提供するものであり、手段の方法の一つがストアドロシージャです。ですから、コマンドは接続型、非接続型にかかわらず使用できます。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク kei_chan_gt 2012年5月14日 13:42
    2012年5月11日 4:58
    モデレータ
  • trapemiya さま

    いつもありがとうございます。
    安心しました。

    そしてまたひとつ、誤解が解けました。
    てっきりVB.NETになってからの技術、DataAdapter、TableAdapter、DataReader 等のことを非接続型といい、
    VB6 や AccessADP までの技術、Connection、Command、ストアドを接続型と言うのかと思っておりました。

    ありがとうございました。

    2012年5月14日 13:42