* がいいのか
SQL を書いて行数を得るときなどによく書く↓これ。前から思っていたのだが、ここで * ではなく 1 と書いたりすることもあるが、何がいいのだろうか?
select count(*) from hoge_table? select count(1) from hoge_table?
その答えは
ミックのサイトにあった。
サブクエリの SELECT 句を書くには、以下の3つの選択肢があります。 1.EXISTS (SELECT * FROM …) 2.EXISTS (SELECT 列名 FROM …) 3.EXISTS (SELECT 定数 FROM …) このうち、最も良いのは1.です。この書き方は、オプティマイザにどの列を使うべきかの選択を委ねることになります。そして、列にインデックスが張られていれば、実表を走査する必要はありません。 ただし、例外的に2.や3.の方が1.よりも高速な場合もあります。古い DBMS では2.のように列名を指定した方が速いこともあります。また、Oracleその他の製品では、3.のように「SELECT 1 FROM …」など、定数を指定すると高速になります。この書き方は、行へのポインタさえ得られれば、実際の行を読む必要がないことを、DBMS に明示してやる効果があります。 しかし、2.はもはや使う機会はないでしょうし、3.の書き方は意味的な混乱を招くので、基本的には1.を使うのが良いでしょう。
ちょっと違うけど
ここでは EXIST だけど count でも同じことなのかなと思っています。
コメント
コメントを投稿