L
o
a
d
i
n
g
.
.
.

ホーム

お知らせ

製品・ソリューション

サービス

導入事例・パートナー

EXEM Academy・ブログ

会社情報

採用情報

2022.09.07

SQLチューニング(第35回)「任意のデータを活用した効率的なSQLの作成」(1/2回)

今回から二回に渡り、「任意のデータを活用した効率的なSQLの作成」に関して、お送りします。では、早速はじめましょう。


今回はインデックス先頭カラムが範囲条件で使われて発生する性能問題を改善するために、範囲条件を結合に変更する方法に対して調べてみることにしよう。

9.1 CONNECT BY LEVELでデータを抽出する。

任意のデータを生成するために10g以前のバージョンにはビューやテーブルを利用して値を持って来ました。 このような方法は追加的なI/Oが発生したが、Oracle 10gからはDUALテーブルとConnect By Levelを使って、追加的なI/Oなしに任意のデータを生成することができるようになりました。

次のConnect By Levelを活用した任意の数字あるいは日を抽出する方法に対して調べてみることにしよう。

9.1.1 任意の数値作り

1から10までを抽出するSQLはConnect By Levelを利用すれば下記のように簡単に作成することができます。

SELECT LEVEL AS num_row
  FROM DUAL CONNECT BY LEVEL <= 10 ;

   NUM_ROW
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

9.1.2 任意の日作り

Connect By Levelがなければ、日付が格納された別のテーブルを作成して照会したり、辞書ビューなどを使って照会するしかないので、追加のI / Oが発生したはずです。 ただし、以下のようにConnect By Levelを使用すると、追加のI / Oなしで任意の日付を抽出できます。

SELECT TO_CHAR(TO_DATE('20111201','yyyymmdd') + LEVEL-1,'yyyymmdd') AS "Date"
  FROM DUAL
CONNECT BY LEVEL <= LAST_DAY(TO_DATE('20111201','yyyymmdd'))-TO_DATE('20111201','yyyymmdd')+1 ;

Date
--------
20111201
20111202
20111203
20111204
20111205
20111206
20111207
20111208
20111209
20111210
20111211
20111212
20111213
20111214
20111215
20111216
20111217
20111218
20111219
20111220
20111221
20111222
20111223
20111224
20111225
20111226
20111227
20111228
20111229
20111230
20111231

いかがでしたか?それでは、See You^^


PHP Code Snippets Powered By : XYZScripts.com