5.12.2 アーカイブレンジ列の日時情報を使用した検索範囲の絞り込み
アーカイブマルチチャンク表を検索する場合は,アーカイブレンジ列の日時情報を使用して検索範囲の絞り込みが行われるように探索条件を指定する必要があります。
- 重要
-
ここで説明している規則に従っていない場合,アーカイブされている全データが検索対象になるため,検索処理時間が長くなることがあります。アーカイブされている全データが検索対象になった場合,KFAA51121-Wメッセージが出力されます。この場合,SQL文を修正して,アーカイブレンジ列の日時情報を使用した検索範囲の絞り込みをしてください。
(1) 探索条件の指定規則
アーカイブレンジ列の日時情報を使用した検索範囲の絞り込みが行われる条件を次に示します。
-
WHERE句の探索条件にアーカイブレンジ列を指定した条件を指定している
-
アーカイブレンジ列を指定した探索条件に,比較述語,IN述語,またはBETWEEN述語だけを指定している
-
比較述語,IN述語,またはBETWEEN述語の指定が,「(2) 比較述語の指定規則」以降で説明している条件を満たしている
-
アーカイブレンジ列を指定した探索条件にNOT条件を指定していない
-
アーカイブレンジ列を指定した探索条件にOR条件を指定していない(OR条件の両辺にアーカイブレンジ列を指定した探索条件を指定していない)
・絞り込みが行われない例
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" BETWEEN DATE'2016/01/01' AND DATE'2016/01/10' OR "RECORD-DAY" BETWEEN DATE'2016/02/01' AND DATE'2016/02/10'
・絞り込みが行われる例
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" BETWEEN DATE'2016/01/01' AND DATE'2016/01/10' AND ("C1"='P001' OR "C2"='S002')
- 重要
-
DELETE文またはUPDATE文中に指定する探索条件についても,ここで説明している探索条件の指定規則が適用されます。ここで説明している指定規則に従っていない場合,DELETE文またはUPDATE文がエラーになります。
アーカイブマルチチャンク表の行を削除する場合のDELETE文の規則については,マニュアルHADB SQLリファレンスのDELETE文の指定形式および規則の規則を参照してください。
アーカイブマルチチャンク表の行を更新する場合のUPDATE文の規則については,マニュアルHADB SQLリファレンスのUPDATE文の指定形式および規則の規則を参照してください。
(2) 比較述語の指定規則
ここで説明する指定規則に従って比較述語を指定した場合,アーカイブレンジ列の日時情報を使用した検索範囲の絞り込みが行われます。
(a) 指定規則と推奨する指定例
- 比較述語の指定形式
-
比較述語::=比較演算項1 比較演算子 比較演算項2
- 指定規則
-
-
比較演算子には,=,<,<=,>=,>のどれかを指定していること
-
両方の比較演算項には,行値構成子を指定していないこと
-
片方の比較演算項には,アーカイブレンジ列(単独の列指定)を指定していること
-
反対の比較演算項には,値指定を指定していること
-
- メモ
-
値指定には定数を指定することを推奨します。
- 推奨する指定例
-
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" >= DATE'2016/01/01'
- 推奨しない指定例
-
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" = ? SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" >= CURRENT_DATE
上記の例の場合,検索範囲の絞り込みは行われますが,定数以外の指定は推奨しません。
- 重要
-
値指定に定数を指定した場合,定数以外を指定したときに比べて,検索範囲の絞り込みに掛かる時間を短くできます。
(b) 検索範囲の絞り込みが行われない指定例
- 例1
-
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" - 10 DAY > DATE'2016/02/10'
上記の例の場合,比較演算項にアーカイブレンジ列を使用した日時演算を指定しているため(単独の列指定ではないため),検索範囲の絞り込みは行われません。この場合,上記のSELECT文を次のように修正すると,検索範囲の絞り込みが行われます。
修正例
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" > DATE'2016/02/10' + 10 DAY
上記の例のように,片方の比較演算項にアーカイブレンジ列を単独の列指定で指定し,反対の比較演算項には定数と等価な値式を指定します。
- 例2
-
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" > CURRENT_DATE - 1 YEAR
上記の例の場合,比較演算項に値指定を指定していないため,検索範囲の絞り込みは行われません。この場合,上記のSELECT文を次のように修正すると,検索範囲の絞り込みが行われます。
修正例
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" > DATE'2016/02/10' - 1 YEAR
上記の例のように,CURRENT_DATEを明示的に定数で指定してください。これによって,右側の比較演算項が定数と等価な値式になるため,検索範囲の絞り込みが行われます。
定数と等価な値式については,マニュアルHADB SQLリファレンスの値式の指定形式および規則の規則にある表定数と等価な値式となる条件を参照してください。
(3) IN述語の指定規則
ここで説明する指定規則に従ってIN述語を指定した場合,アーカイブレンジ列の日時情報を使用した検索範囲の絞り込みが行われます。
(a) 指定規則と推奨する指定例
- IN述語の指定形式
-
IN述語::={値式|行値構成子} 〔IS〕 〔NOT〕 IN {({値式|行値構成子}〔,{値式|行値構成子}〕…)|表副問合せ}
- 指定規則
-
-
IN述語中に行値構成子を指定していないこと
-
IN述語の左側の値式には,アーカイブレンジ列(単独の列指定)を指定していること
-
IN述語の右側の値式には,値指定を指定していること
-
IN述語中に表副問合せを指定していないこと
-
IN述語中にNOTを指定していないこと
-
- メモ
-
IN述語の右側の値式に指定する値指定には,定数を指定することを推奨します。
- 推奨する指定例
-
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" IN (DATE'2016/01/01',DATE'2016/02/01')
- 推奨しない指定例
-
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" IN (?,?)
上記の例の場合,検索範囲の絞り込みは行われますが,定数以外の指定は推奨しません。
- 重要
-
値指定に定数を指定した場合,定数以外を指定したときに比べて,検索範囲の絞り込みに掛かる時間を短くできます。
(b) 検索範囲の絞り込みが行われない指定例
- 例1
-
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" IN (CURRENT_DATE, CURRENT_DATE - 7 DAY, CURRENT_DATE - 14 DAY)
上記の例の場合,IN述語の右側の値式に値指定以外を指定しているため,検索範囲の絞り込みは行われません。この場合,上記のSELECT文を次のように修正すると,検索範囲の絞り込みが行われます。
修正例
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" IN (DATE'2016/02/10', DATE'2016/02/10' - 7 DAY, DATE'2016/02/10' - 14 DAY)
上記の例のように,CURRENT_DATEを明示的に定数で指定してください。これによって,IN述語の右側の値式が定数と等価な値式になるため,検索範囲の絞り込みが行われます。
定数と等価な値式については,マニュアルHADB SQLリファレンスの値式の指定形式および規則の規則にある表定数と等価な値式となる条件を参照してください。
- 例2
-
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" IN (SELECT "SALES_DATE" FROM "SALESLIST" WHERE "USERID" = 'U001')
上記の例の場合,IN述語中に表副問合せを指定しているため,検索範囲の絞り込みは行われません。この場合,上記のSELECT文を次のように修正すると,検索範囲の絞り込みが行われます。
修正例
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" IN (SELECT "SALES_DATE" FROM "SALESLIST" WHERE "USERID" = 'U001') AND "RECORD-DAY" > DATE'2015/10/01'
上記の例のように,検索範囲の絞り込みが行われる探索条件を追加してください。
(4) BETWEEN述語の指定規則
ここで説明する指定規則に従ってBETWEEN述語を指定した場合,アーカイブレンジ列の日時情報を使用した検索範囲の絞り込みが行われます。
(a) 指定規則と推奨する指定例
- BETWEEN述語の指定形式
-
BETWEEN述語::=値式1 〔NOT〕 BETWEEN 値式2 AND 値式3
- 指定規則
-
-
値式1には,アーカイブレンジ列(単独の列指定)を指定していること
-
値式2および値式3には,値指定を指定していること
-
BETWEEN述語中にNOTを指定していないこと
-
- メモ
-
値式2および値式3に指定する値指定には,定数を指定することを推奨します。
- 推奨する指定例
-
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" BETWEEN DATE'2016/01/01' AND DATE'2016/01/10'
- 推奨しない指定例
-
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" BETWEEN ? AND ?
上記の例の場合,検索範囲の絞り込みは行われますが,定数以外の指定は推奨しません。
- 重要
-
値指定に定数を指定した場合,定数以外を指定したときに比べて,検索範囲の絞り込みに掛かる時間を短くできます。
(b) 検索範囲の絞り込みが行われない指定例
- 例1
-
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" BETWEEN CURRENT_DATE - 2 YEAR AND CURRENT_DATE - 1 YEAR
上記の例の場合,BETWEEN述語中の値式2または値式3に,値指定以外を指定しているため,検索範囲の絞り込みは行われません。この場合,上記のSELECT文を次のように修正すると,検索範囲の絞り込みが行われます。
修正例
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" BETWEEN DATE'2016/02/10' - 2 YEAR AND DATE'2016/02/10' - 1 YEAR
上記の例のように,CURRENT_DATEを明示的に定数で指定してください。これによって,BETWEEN述語中の値式2または値式3が定数と等価な値式になるため,検索範囲の絞り込みが行われます。
定数と等価な値式については,マニュアルHADB SQLリファレンスの値式の指定形式および規則の規則にある表定数と等価な値式となる条件を参照してください。
- 例2
-
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" NOT BETWEEN DATE'2016/01/01' AND DATE'2016/01/31'
上記の例の場合,BETWEEN述語中にNOTを指定しているため,検索範囲の絞り込みは行われません。この場合,上記のSELECT文を次のように修正すると,検索範囲の絞り込みが行われます。
修正例
SELECT * FROM "ARCHIVE-T1" WHERE "RECORD-DAY" BETWEEN DATE'2015/12/01' AND DATE'2015/12/31' AND "RECORD-DAY" BETWEEN DATE'2016/02/01' AND DATE'2016/02/29'
上記の例のように,BETWEEN述語中にNOTを指定しないで,複数のBETWEEN述語をAND条件で指定してください。