ちゃっぴの監禁部屋

ガチガチに締めすぎて動きがとれなくなる。。。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  405  : 記事  5  : コメント  12114  : トラックバック  134

ニュース

記事カテゴリ

書庫

日記カテゴリ

Communities

Personal Information

ネタ元: 横持ちと縦持ち_その後2_SQL文は侮れない

表題のとおりなんですが、ad-hoc query なんてものは無くしちまえ!というのがおいらの意見。

唯一の例外は、運用や試験目的で sqlcmd を発行する時くらいでしょうか。

SQL 構文を教えるのが目的なら当然必要ですが、別の言語からの呼び出し方を教えるなら ad-hoc query を発行するやり方を教えると有害な面の方が大きいと思う。

というのは、下記弊害があるから。

  • SQL injection

    Parameterized query を利用したからと言って SQL injection 全てを防げるわけではありませんが、間違いなく有効な方策です。SQL injection を防止するためには、parameterized query の発行方法と LIKE での escape を教えればいいかと。これをやっておくと code review で脆弱性を探すのが圧倒的に楽になるという利点も生まれます。何も考えずに ad-hoc query を発行した場合の結果は言わずもがな。

  • Compile 時間の増大

    Ad-hoc query の場合、procedure cache に一致したものが無いとその都度 compile されます。この procedure cache というのが厄介で、SQL Server の場合、parameters が一個でも違っていたら一致しないのは当然として、case-sensitive なので SQL 構文が大文字小文字で異なっているだけで一致しないと判断されます。

  • Cache 有効活用

    SQL Server 64 bit 環境だと procedure cache が事実上無制限に拡張します。32 bit 環境だと Windows 32 bit 環境の制約により 2 GB までに制限されていましたけど。ということで、procedure cache が無制限に拡張されるため、本当に必要な data cache 領域が圧迫されて cache を有効活用することができません。

もっとも、上記弊害まで一緒に教えるなら問題ないんですけどね。

このような問題があるので、この手の書き方を教える場合、ad-hoc query 発行方法は必須では無いです。ほとんどの処理は parameterized query で代用できるのでこっちこそ必須とすべきでしょう。両方ちゃんと教えるならともかく、ad-hoc query 発行方法だけ教えるのはあり得ない。

なお、上記は SQL Server 2005 までの環境を前提にしています。SQL Server 2008 ではちゃんと確認していないのでどなたか確認をお願いたします。おそらく同じだと思いますけど。。。

投稿日時 : 2009年6月14日 21:52

コメント

# re: Ad-hoc query なんて無くしちまえ! 2009/06/14 22:09 きゃらぽん
私も基本的にはアドホックはなくすべきだと思っていますが、特定のキーにデータが偏っている場合(Aに大量、Bに少量)にはprocedure cacheのせいでA,Bどちらの場合も同じ実行プランを使用するので効率が悪いプランになります。
このパターンで結構困っていますが...何かよい解決方法ありますでしょうか?

# re: Ad-hoc query なんて無くしちまえ! 2009/06/14 22:16 ちゃっぴ
> 私も基本的にはアドホックはなくすべきだと思っていますが、特定のキーにデータが偏っている場合(Aに大量、Bに少量)にはprocedure cacheのせいでA,Bどちらの場合も同じ実行プランを使用するので効率が悪いプランになります。

そうなんですよね。それが procedure cache を利用する場合の最大の弊害なんですよね。
残念ながら、その点についての解決策は私も持ち合わせていないです。

# re: Ad-hoc query なんて無くしちまえ! 2009/06/15 17:44 刈歩 菜良 CTP
同意です!
が、講習会の日程的にad-hoc クエリ以外を教えるのは無理っす。

WinアプリやWebアプリのコースではそもそもDBは主ではないので、参照系は非接続でSQL自動生成(=ad-hoc)、更新系もパラメータクエリが精いっぱい。

時間の問題もあるし、受講者のスキル的にもそんなに色々盛り込めない。

ストアドの話はDB関連のコースへってことになります(キャッシュ云々も含めてね)。

# re: Ad-hoc query なんて無くしちまえ! 2009/06/16 22:52 ちゃっぴ
> が、講習会の日程的にad-hoc クエリ以外を教えるのは無理っす。

ad-hoc だけ教えるなら、parameterized query だけ教えとくというのは無理? どちらにしろ、やっつけ仕事になるでしょうから実際に使うのだけ教えとけ! というのはありじゃないかと思います。

> ストアドの話はDB関連のコースへってことになります(キャッシュ云々も含めてね)。

それはそれでいいと思います。

Post Feedback

タイトル
名前
Url:
コメント