none
プログラム中に記述するSQL文とストアドプロシージャについて RRS feed

  • 質問

  • こんにちは。

     

    VB+SQLServerを勉強中のものです。

    どこで質問をして良いか分からなかったので、こちらでできればお願いします。

     

    さっそくですが、VBでデータベースを作成する参考書などを見ると、プログラム中に直接INSERT文などを記述するものを

    見かけるのですが、データを一件だけ追加するまたは、更新をする場合などにもストアドプロシージャなどを使用するほうが

    よいのでしょうか。

     

    サンプルデータのため(データ量も少ない)もあると思うのですが、どちらを使用しても大して速度的に代わりを感じられず、

    どのようなメリットがあるのかがいまいち分かりません。

     

    また、本来は別の質問にすべきなのですが、VBをフロントエンドとしてDBを作成する場合、バックエンドをAccessにした場合

    データを取得する際など、SQL文でWHERE句を適切に指定をして、データを絞り込む形にしてもデータをいったんすべて

    取得する形をとってからの動作になるので、SQLServerなどでストアドプロシージャを使用する場合に比べて速度的に

    不利になるのでしょうか。(どこかでこのような説明を目にしただけで正確な知識ではなく申し訳ありません。

    説明がおかしい部分があるかもしれませんがご容赦ください。)

     

    どうか、よろしくお願いします。

     

     

    2007年9月23日 5:56

回答

  •  TI-cb400s さんからの引用

    見かけるのですが、データを一件だけ追加するまたは、更新をする場合などにもストアドプロシージャなどを使用するほうが

    よいのでしょうか。

     

    サンプルデータのため(データ量も少ない)もあると思うのですが、どちらを使用しても大して速度的に代わりを感じられず、

    どのようなメリットがあるのかがいまいち分かりません。


    ストアドプロシージャを利用した方が良いと思います。利点としては、

     

    1.SQLインジェクションの対策になる。
    2.他のテクノロジーが出てきたときや言語などを変えた際に、ストアドプロシージャを呼ぶように変えるだけでよい。
    3.Windowsアプリとwebアプリで同じデータを操作する場合など、データ処理部分を一元化できる。

     

    などぐらいを思いつきます。

    以上を理解した上で、ストアドプロシージャを使うメリットが感じられないケースであれば、SQL文を組み立てても良いと思いますが、パラメータライズドクエリにして、SQLインジェクションを防ぎましょう。

     

     TI-cb400s さんからの引用

    VBをフロントエンドとしてDBを作成する場合、バックエンドをAccessにした場合

    データを取得する際など、SQL文でWHERE句を適切に指定をして、データを絞り込む形にしてもデータをいったんすべて

    取得する形をとってからの動作になるので、SQLServerなどでストアドプロシージャを使用する場合に比べて速度的に

    不利になるのでしょうか。(どこかでこのような説明を目にしただけで正確な知識ではなく申し訳ありません。


    ご質問の真意がはっきりわからないのですが、SQL文でWHERE句を使えば、その対象のレコードしかデータベースから抽出されませんから、この点ではストアドプロシージャと同じです。

    Accessにおけるselect文の動作のことを言われているのかもしれませんが、いくらなんでも一度全てのデータを読んでから抽出する動作をしているようには思えません。ただ、インデックスが無い場合はそうなるのかもしれません。この辺りの動作についてはあまり詳しくないです・・・

    2007年9月23日 6:45
    モデレータ

すべての返信

  •  TI-cb400s さんからの引用

    見かけるのですが、データを一件だけ追加するまたは、更新をする場合などにもストアドプロシージャなどを使用するほうが

    よいのでしょうか。

     

    サンプルデータのため(データ量も少ない)もあると思うのですが、どちらを使用しても大して速度的に代わりを感じられず、

    どのようなメリットがあるのかがいまいち分かりません。


    ストアドプロシージャを利用した方が良いと思います。利点としては、

     

    1.SQLインジェクションの対策になる。
    2.他のテクノロジーが出てきたときや言語などを変えた際に、ストアドプロシージャを呼ぶように変えるだけでよい。
    3.Windowsアプリとwebアプリで同じデータを操作する場合など、データ処理部分を一元化できる。

     

    などぐらいを思いつきます。

    以上を理解した上で、ストアドプロシージャを使うメリットが感じられないケースであれば、SQL文を組み立てても良いと思いますが、パラメータライズドクエリにして、SQLインジェクションを防ぎましょう。

     

     TI-cb400s さんからの引用

    VBをフロントエンドとしてDBを作成する場合、バックエンドをAccessにした場合

    データを取得する際など、SQL文でWHERE句を適切に指定をして、データを絞り込む形にしてもデータをいったんすべて

    取得する形をとってからの動作になるので、SQLServerなどでストアドプロシージャを使用する場合に比べて速度的に

    不利になるのでしょうか。(どこかでこのような説明を目にしただけで正確な知識ではなく申し訳ありません。


    ご質問の真意がはっきりわからないのですが、SQL文でWHERE句を使えば、その対象のレコードしかデータベースから抽出されませんから、この点ではストアドプロシージャと同じです。

    Accessにおけるselect文の動作のことを言われているのかもしれませんが、いくらなんでも一度全てのデータを読んでから抽出する動作をしているようには思えません。ただ、インデックスが無い場合はそうなるのかもしれません。この辺りの動作についてはあまり詳しくないです・・・

    2007年9月23日 6:45
    モデレータ
  • ご回答ありがとうございます。

     

    ストアドプロシージャを利用する利点がなんとなく見えてきました。

    ただ、各テーブルに対して追加、更新、削除のストアドプロシージャまでを作成するとなるとかなりの数を

    作成することになるのですね。

     

    少しずつ、作りこみながら勉強を進めてみたいと思います。

    また、困ったときはよろしくお願いいたします。

    2007年9月23日 10:53

  • データを一件だけ追加するまたは、更新をする場合などは、普通にINSERT文や、UPDATE文を書けばよいと思います。
    但し、データを一件だけ追加するまたは、更新をする為に、関連するデータの変更など多くの処理を必要とする場合は、trapemiyaさんのおっしゃるように、ストアドプロシージャしようする利点があります。

    また、処理に変更が生じた場合、ストアドプロシージャの変更のみで可能です。

    一連の処理を行う場合、普通にINSERT文や、UPDATE文を書けばデータの読み込み、書き込みとサーバーとの通信は、多くなりますが、処理は、クライアントのCPUの負担となります。
    但し、命令文のコンパイルを通常サーバーは、行います。
    ストアドプロシージャを利用した場合は、サーバーとの通信は、ストアドプロシージャの実行命令で済みますが、処理は、サーバーのCPUの負担となります。
    命令文は、コンパイルされた状態で保存されているデータベースでは、コンパイルしません。

    select文のスピードは、インデックスの打ち方で変わりますが、送信してくるデータは、結果のみです。


     

    2007年9月25日 7:01