- - PR -
SQL Server 2008 BETWEEN句の使い方につい
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-11-25 12:37
BETWEEN句の使い方について
例えば適用開始日(TEKIYO_FROM)と、適用終了日(TEKIYO_TO)を項目として持つレコードで日付を指定してピンポイントで検索したい場合、以下の文で検索可能。 ? BETWEEN TEKIYO_FROM AND TEKIYO_TO TEKIYO_FROM TEKIYO_TO @20080101 20081231 A20090101 20091231 '20080505' BETWEEN TEKIYO_FROM AND TEKIYO_TO で、@が抽出される 以上のやり方はSQLパフォーマンスどうなるでしょうか。 何か注意しなければいけないことはあるでしょうか。 そして、こういう書き方の代わりに、何かいい書き方があるでしょうか。 回答お待ちしております。 _________________ yangjiayi | ||||||||||||
|
投稿日時: 2008-11-25 13:01
2008は使ってませんが、この要件でBETWEENを使わないのであれば、BETWEENの立場がないと思います。 それとも、BETWEENを使ったSQLでパフォーマンスに問題が出ているのでしょうか? | ||||||||||||
|
投稿日時: 2008-11-25 13:19
BETWEENを使わなかったら、どういったSQL文を使うのでしょうか。 SQL文の条件を左側に置くと、パフォーマンス悪いと思いますが… 通常は 「カラム BETWEEN 条件1 AND 条件2」 ですが、この場合、「条件 BETWEEN カラム1 AND カラム2」 になりますね。 こんなSQL文は大丈夫ですか。 _________________ yangjiayi | ||||||||||||
|
投稿日時: 2008-11-25 14:18
気になるのであればクライアント統計をとって、不等号で書き直したものと比較してみてはどうでしょう。 | ||||||||||||
|
投稿日時: 2008-11-25 16:12
といった書き方をすると、インデクスがあってもRDBMSが使ってくれないかも知れません。 私が知るいくつかのRDBMSでは、インデクスを使ってくれなかったと思います。 | ||||||||||||
|
投稿日時: 2008-11-25 16:17
私もネットでいろいろ調べてみましたが、 Where文で「値」を左側に書くとIndexが効かないような気がしますが… パフォーマンスを考慮したうえで、なんかSQLを書きたいです。 サブクエリとかはどうですかね? _________________ yangjiayi | ||||||||||||
|
投稿日時: 2008-11-25 16:22
日付の値部分を変数で指定するなら、
のようにしておき、開始と終了が同じ日なら、結果的に同じ値がはいるようにしておくのが一般的では?
とするのが、一般的ではないでしょうか? こういった要件を、列名と値を入れ替えてbetweenでやるというのは、あまり見たことがないし、やるべきではないと思います。 逆にしても、プランナがインデクスを有効利用できることを確認済なら、話は別ですけど。 | ||||||||||||
|
投稿日時: 2008-11-25 16:39
実際に計測したり、実行プランを取ったりしましたか? 内部的には<=、>=を使うのと同値ですよ? TEKIYO_FROMに時間情報が入っていて、 '2008/05/05' BETWEEN CONVERT(VARCHAR, TEKIYO_FROM, 111) AND CONVERT(VARCHAR, TEKIYO_TO, 111) なんてやれば、TEKIYO_FROMでインデックスを作成していても使われることはないですが、通常はインデックス使えますよ?データの偏りによっては使うと却って遅くなるかもしれませんが。 |