- PR -

SQL Server 2008 BETWEEN句の使い方につい

投稿者投稿内容
yangjiayi
ベテラン
会議室デビュー日: 2007/10/04
投稿数: 59
投稿日時: 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
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2008-11-25 13:01
引用:

yangjiayiさんの書き込み (2008-11-25 12:37) より:
そして、こういう書き方の代わりに、何かいい書き方があるでしょうか。


2008は使ってませんが、この要件でBETWEENを使わないのであれば、BETWEENの立場がないと思います。
それとも、BETWEENを使ったSQLでパフォーマンスに問題が出ているのでしょうか?
yangjiayi
ベテラン
会議室デビュー日: 2007/10/04
投稿数: 59
投稿日時: 2008-11-25 13:19
引用:

よっしーさんの書き込み (2008-11-25 13:01) より:
引用:

yangjiayiさんの書き込み (2008-11-25 12:37) より:
そして、こういう書き方の代わりに、何かいい書き方があるでしょうか。


2008は使ってませんが、この要件でBETWEENを使わないのであれば、BETWEENの立場がないと思います。
それとも、BETWEENを使ったSQLでパフォーマンスに問題が出ているのでしょうか?


BETWEENを使わなかったら、どういったSQL文を使うのでしょうか。
SQL文の条件を左側に置くと、パフォーマンス悪いと思いますが…

通常は 「カラム BETWEEN 条件1 AND 条件2」
ですが、この場合、「条件 BETWEEN カラム1 AND カラム2」
になりますね。

こんなSQL文は大丈夫ですか。
_________________
yangjiayi
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-11-25 14:18
引用:

yangjiayiさんの書き込み (2008-11-25 13:19) より:

BETWEENを使わなかったら、どういったSQL文を使うのでしょうか。
SQL文の条件を左側に置くと、パフォーマンス悪いと思いますが…


気になるのであればクライアント統計をとって、不等号で書き直したものと比較してみてはどうでしょう。
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2008-11-25 16:12
引用:

where 値 列名1 and 列名2



といった書き方をすると、インデクスがあってもRDBMSが使ってくれないかも知れません。
私が知るいくつかのRDBMSでは、インデクスを使ってくれなかったと思います。
yangjiayi
ベテラン
会議室デビュー日: 2007/10/04
投稿数: 59
投稿日時: 2008-11-25 16:17
引用:

忠犬さんの書き込み (2008-11-25 16:12) より:
引用:

where 値 列名1 and 列名2



といった書き方をすると、インデクスがあってもRDBMSが使ってくれないかも知れません。
私が知るいくつかのRDBMSでは、インデクスを使ってくれなかったと思います。


私もネットでいろいろ調べてみましたが、
Where文で「値」を左側に書くとIndexが効かないような気がしますが…

パフォーマンスを考慮したうえで、なんかSQLを書きたいです。
サブクエリとかはどうですかね?
_________________
yangjiayi
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2008-11-25 16:22
引用:

そして、こういう書き方の代わりに、何かいい書き方があるでしょうか。



日付の値部分を変数で指定するなら、

コード:
where TEKIYO_FROM>=? and TEKIYO_TO<=?   -- 可変部を?としておきます



のようにしておき、開始と終了が同じ日なら、結果的に同じ値がはいるようにしておくのが一般的では?

コード:
where TEKIYO_FROM>='20080505' and TEKIYO_TO<='20080505'



とするのが、一般的ではないでしょうか?

こういった要件を、列名と値を入れ替えてbetweenでやるというのは、あまり見たことがないし、やるべきではないと思います。
逆にしても、プランナがインデクスを有効利用できることを確認済なら、話は別ですけど。
よっしー
大ベテラン
会議室デビュー日: 2007/05/17
投稿数: 143
投稿日時: 2008-11-25 16:39
引用:

yangjiayiさんの書き込み (2008-11-25 16:17) より:
私もネットでいろいろ調べてみましたが、
Where文で「値」を左側に書くとIndexが効かないような気がしますが…

パフォーマンスを考慮したうえで、なんかSQLを書きたいです。
サブクエリとかはどうですかね?



実際に計測したり、実行プランを取ったりしましたか?
内部的には<=、>=を使うのと同値ですよ?

TEKIYO_FROMに時間情報が入っていて、
'2008/05/05' BETWEEN CONVERT(VARCHAR, TEKIYO_FROM, 111) AND CONVERT(VARCHAR, TEKIYO_TO, 111)
なんてやれば、TEKIYO_FROMでインデックスを作成していても使われることはないですが、通常はインデックス使えますよ?データの偏りによっては使うと却って遅くなるかもしれませんが。

スキルアップ/キャリアアップ(JOB@IT)