Hitachi

ノンストップデータベース HiRDB Version 10 SQLリファレンス


4.4.1 ASSIGN LIST文 形式1の形式と規則

〈この項の構成〉

(1) 機能

実表からリストを作成します。

(2) 使用権限

実表に対するSELECT権限を持つユーザが,その実表からリストを作成できます。

(3) 形式1<実表からのリストの作成>

  ASSIGN LIST リスト名 FROM (〔認可識別子.〕表識別子)
            〔WHERE 探索条件〕
            〔WITHOUT LOCK 〔{WAIT|NOWAIT}〕〕
            〔{WITH ROLLBACK|NO WAIT}〕

(4) オペランド

(a) リスト名

作成するリストの名前を指定します。

既にあるリスト名を指定した場合,そのリストを削除し新しく作成したリストを有効とします。

(b) (〔認可識別子.〕表識別子)

認可識別子には,表の所有者の認可識別子を指定します。

表識別子には,作成するリストの基になる実表の名前を指定します。

表識別子には,以下の表は指定できません。

  • 共用表

  • WITHOUT ROLLBACKを指定した表

  • ビュー表

  • 既定文字集合以外の文字集合を指定した列を含む表

  • 一時表

(c) 〔WHERE探索条件〕

探索条件には,取り出す行を選択する条件を指定します。

探索条件を省略した場合は,指定した表のすべての行がリストになります。

ASSIGN LIST文の探索条件には,論理演算子としてANDNOTも指定できます。論理演算の評価の優先順位は,ANDと同じです。

ANDNOT論理演算をした場合の述語の結果を次に示します。

左辺

右辺

T

F

T

F

T

T

F

F

F

F

F

(凡例)

T:真であることを示します。

F:偽であることを示します。

?:不定であることを示します。

注※

C1=V1 ANDNOT C2=V2は,C1=V1 AND NOT C2=V2と等価ではありません。

述語1=(述語2ANDNOT述語3)とすると,述語1を満たす集合は,述語2を満たす集合と述語3を満たす集合の差となります。

述語1=(述語2AND NOT述語3)とすると,述語は述語2とNOT述語3とのAND論理演算をした結果になります。

したがって,AND NOTの場合,上記真理値表の※は?(不定)となります。

探索条件についての規則を次に示します。

  1. 探索条件中に,次のものは指定できません。

    • 副問合せ(NOT指定のないIN述語中での,外への参照のない表副問合せは指定できます)

    • コストベース最適化モード1の場合,四則演算,日付演算,時刻演算,連結演算,スカラ関数,CASE式,及びCAST指定

    • コストベース最適化モード1の場合,列指定 比較演算子 列指定

    • 両辺が列指定を含まない値式だけから成る述語

    • コストベース最適化モード1の場合,値式1が列指定で,値式2,又は値式3が列指定のBETWEEN述語

    • コンポネント指定

    • コストベース最適化モード1の場合,関数呼出し(インデクスを使用するロジックを実装したプラグイン提供関数は指定できます)

    • IS FALSE,IS UNKNOWNの論理述語(コストベース最適化モード2の場合で,値式がインデクス型プラグイン専用関数ではなく,かつ,値式中に列指定を含むときは指定できます)

    • XMLPARSE,及び列指定のXML問合せ文脈項目の指定がないXMLQUERY,XMLEXISTS述語

    • 予備列

    • OR論理演算子の中にインデクスを使用しないで評価する条件,又はインデクスを一部使用しない条件を指定する場合,そのOR論理演算子の中に次のどれかを指定している。

      ・構造化繰返し述語

      ・インデクス型プラグイン専用関数

      ・XMLEXISTS述語(XQueryにhi-fn:containsを指定)

    • BLOB型,又は定義長が32,000バイトより大きいBINARY型のどちらかの列

  2. 探索条件中の列名には,表名,及び相関名を指定できません。

  3. コストベース最適化モード1の場合,探索条件中に繰返し列を指定した場合は,添字としてANYを指定する必要があります。

  4. コストベース最適化モード1の場合,探索条件で指定したすべての列にインデクス(IS NULL述語に指定した列に対して,除外キーを持つインデクスを除く)が定義されていなければなりません。コストベース最適化モード2では,すべての列にインデクスを定義する必要はありません。ただし,すべての列にインデクスを定義した方がASSIGN LIST文の性能がよいため,インデクスを定義することを推奨します。

  5. 構造化繰返し述語に対しては,コストベース最適化モードに関係なく,構造化繰返し述語の探索条件中に指定した,すべての繰返し列を構成列に含む複数列インデクスが定義されていなければなりません。

  6. 繰返し列と繰返し列以外の列の両方を構成列に含むインデクスを使用して,繰返し列でない列の述語を評価する場合,繰返し列のどれかの列に条件を指定していればインデクスは使用できます。

  7. 表副問合せを指定したIN述語中の列には,次のどちらかのインデクスが定義されていなければなりません。なお,表副問合せを指定したIN述語中の列を先頭とする複数列インデクスは,SQL最適化モードがコストベース最適化モード2の場合に限ります。

    • 単一列インデクス

    • 表副問合せを指定したIN述語中の列を先頭とする複数列インデクス

    表副問合せを指定したIN述語中の列が複数列インデクスの先頭でない場合でも,この列より前のインデクス構成列に,比較述語(=),NULL述語(IS NULL),又は右辺が値指定のIN述語(IN)のどれかが指定されていればかまいません。ただし,繰返し列をインデクス構成列に含むインデクスは除きます。また,右辺が値指定のIN述語(IN)の場合は,値指定の個数がシステム共通定義pd_apply_search_ats_numに対して,次のどちらかの条件を満たしている必要があります。

    • INが1列だけの場合,値指定の個数は↓pd_apply_search_ats_numの値÷44↓以下

    • INが2列以上の場合,それぞれの列に指定した値指定の個数の積が↓pd_apply_search_ats_numの値÷44↓以下

  8. コストベース最適化モード1の場合,探索条件を指定しない場合は,リストの基になるすべての表について,繰返し列以外のどれかの列にインデクス(プラグインインデクス,除外キーを持つインデクスを除く)が定義されていなければなりません。

  9. コストベース最適化モード1の場合,繰返し列を指定した述語は論理演算子NOTで否定できません。

  10. ANDNOT論理演算を含む述語は論理演算子NOTで否定できません。

  11. 副問合せ中の探索条件,及び探索CASE式のWHENの探索条件にはANDNOTは指定できません。

  12. ANDNOT論理演算の左右のどちらかにインデクスを使用しないで評価する条件,又はインデクスを一部使用しないで評価する条件を指定している場合,ANDNOTは指定できません。

  13. 値式がインデクス型プラグイン専用関数の論理述語はNOTで否定できません。

  14. 表副問合せを指定したIN述語は論理演算子NOTで否定できません。

(d) 〔WITHOUT LOCK 〔{WAIT|NOWAIT}〕〕

このオペランドを省略した場合は,一度検索したデータの内容をトランザクションが終了するまで保証します。

WITHOUT LOCK WAIT

一度検索したデータの内容をトランザクション終了まで保証する必要がない場合に指定します。

WITHOUT LOCK〔WAIT〕を指定した場合,HiRDBはトランザクション終了を待たないで排他制御を解除するので,同時実行性を向上できます。

WITHOUT LOCK NOWAIT

ほかのユーザが更新中のデータでも,更新の完了を待たないで参照し,一度検索したデータの内容をトランザクション終了まで保証する必要がない場合に指定します。

WITHOUT LOCK NOWAITを指定した場合,HiRDBは排他制御をしません。更新中の表に対しても排他待ちしないで検索できるので,より同時実行性を向上できます。しかし,更新中の表を検索した場合は,タイミングによっては不正なデータが得られる場合があります。

(e) 〔{WITH ROLLBACK|NO WAIT}〕

このオペランドを省略した場合は,検索する表をほかのユーザが使用中ならば,使用中のユーザのトランザクションが終了するまで待ち,その後実行します(WITHOUT LOCK NOWAIT指定の場合を除く)。

WITH ROLLBACK

検索する表をほかのユーザが使用中の場合,トランザクションを取り消して無効にしたいときに指定します。

NO WAIT

検索する表をほかのユーザが使用中の場合,トランザクションを取り消さないでエラーにしたいときに指定します。ただし,このSQLの実行中に掛けた排他は解除されません。

(5) 共通規則

  1. リストは所有者だけ使用でき,権限定義,権限削除の対象とはなりません。実行ユーザとリストの所有者が異なる場合は,SET SESSION AUTHORIZATION文を使用して,実行ユーザを変更してください。

  2. リストはHiRDBから切り離しをしても削除されません。

  3. リストはHiRDB停止時に自動的に削除されます。

  4. 障害発生時には,リストは次の条件のとおり検索できなくなるため(検索するとエラー),検索できないリストは削除,又は再作成する必要があります。

    条件1

    • すべてのユニットが異常終了した場合

      すべてのリストが自動的に削除されます。

    条件2

    • 一部のユニットが異常終了した場合

      異常終了したユニットで作成したリストが検索できなくなります。

  5. リストがある間,リストの基表に対して次の操作はできません。

    • スキーマの削除

    • 表の削除

    • 表の定義変更

  6. リストを作成した場合,作成した行数をSQLCAのSQLERRD[2]に返します。

  7. リストは,SQLルーチン中には指定できません。

  8. ASSIGN LIST文は動的に実行できますが,直接ホストプログラムに埋め込んで実行できません。

  9. 同一ユーザが,複数同時にHiRDBと接続してリストを操作できません。

  10. 一つのリスト用RDエリアに格納できるリストの最大数は,データベース初期設定ユティリティ(pdinit),又はデータベース構成変更ユティリティ(pdmod)で指定する最大リスト登録数(500〜50,000)で決まります。

(6) 留意事項

  1. リストは基表と同一サーバ上のリスト用RDエリアに作成します。あらかじめリスト用RDエリアを準備しておいてください。

  2. リストはHiRDBから切り離しをしても削除されません。不要になったリストは,DROP LIST文で削除してください。

  3. リストがある間,リストの基表に対して次の操作をした場合は,リストを作り直してください。

    • PURGE TABLE文

    • 表の再編成

    • 作成モードのデータロード

    • RDエリアの再初期化

(7) 使用例

使用例については,「ASSIGN LIST文 形式2(リスト作成)」の使用例を参照してください。