なんかこの業界には神話が多くてね。「DBへの問い合わせは少なくするのが正義」というのもそのひとつ。いやたしかに少ないほうがいいから神話とはいいきれないんだけど、それはちゃんとSQLを書けることが前提にあっての話だ。
どんどんサブクエリのつかいかたに長けていく人がいる。そういう人は、たぶんわたしじゃ書けないと思うようなSQLを平気で書く。
っていうかそもそも、なんであんなSQLを書こうと思うんだろう……というのがけっこう疑問だったわけなのだけど。その理由に、さっき思い至った。
けっこう、背筋が寒くなる想像なのだけど。
……ああいうSQLを書く人にとって、テーブルはフルスキャンするのが基本なんじゃないか。
多重にフルスキャンするのが基本だから、サブクエリでいったん減らしてからJOINしたほうが高速だったんじゃないか。
考えたらぞっとした。
設計がよくないときは、これが正解というケースは確かにあると思う。だとしたら彼らは間違っていない。そこが恐ろしい。
確かにそのほうが速いなら、そっちの道に進んじゃった人はどんどんそっちにいってしまうと思う。そういえば、テーブル定義書にインデックスについての記述がまったくないなんてざらだよな……。
というわけで、そういう人の習い性を覆すことは難しいと思う。それならいっそのこと、多少過激でもJOIN禁止! といっちゃったほうがいいような。
わりと最近本気で思いはじめてるんだけど。いつか一度やってやろう。
……量子DBができて、インデックスのことなんか考えなくてよくなる時代がくればいいんだ。そうか。
[2008.03.08 21:19]英-Ran :
JOIN禁止! といっちゃったほうがいいような。
3000行のプログラムより1000行のSQLの方が高速だし読みやすいと思ってしまう私のような変態にそれは辛すぎます(;o;) むしろ、SQLわからない人は業務系プログラム作るの禁止にしたい(w
……ああいうSQLを書く人にとって、
ああいうSQLってどんな奴を想定してますでしょうか。私がこいつSQLわかってないなぁ、と思うのはカーソルを多用するやつですかね。なんでRDB使うのにループを回して検索するかなぁ……
[2008.03.11 00:35]てらしま :
3000行のプログラムより1000行のSQLの方が高速だし読みやすいと思ってしまう
まあ高速ならいいと思いますけどね。問題は、その高速なSQLを書ける人ばかりじゃないことですなあ。
むしろ、SQLわからない人は業務系プログラム作るの禁止
だからこれは正しいと思った(笑)。というかいま思ったけど、本当は分業が正しいのかも。
(わかってるのでしょうけど)たしかに1000行のSQLは3000行のプログラムになっちゃうかもしれないけど、1000行のSQL5本分ならたぶん4000行くらいのプログラムで表現できるわけで。それを極端にやったらJOIN禁止!
まあ、機能ごとに別の人が作るから、機能をまたいでSQLや処理を共通化とかはできないことが多いのが現実ですが。
ああいうSQLってどんな奴を想定してますでしょうか。私がこいつSQLわかってないなぁ、と思うのはカーソルを多用するやつですかね。
わたし自身は、明示カーソルについてはテストデータ作るときくらいしか使ったことないけど。本質的にはそういうことですよねえ。
おそらくわたしとは考えているレベルが違うので恐縮だけど。JOINするときに必ずカッコを書いてインラインビューを使うのが正義、と信じている一派が確かにいます。インデックスは無効になってるんだけど……
あー、あとSQL2回投げるのがヤダからUNIONとか。SQLサーバのメモリは無限だと思ってる、というか現実には、SQLサーバはブラックボックスなんだろうけど。
そういう意味では、カーソル多用というのは中身をわかろうとしてるからぜんぜんマシという気も(笑)
まあJOIN禁止は、いつか一度ネタとしてやって、後悔してやめる予定です(笑)。