TimesTenのttIsql
ユーティリティは、TimesTenデータソースを処理するための一般的なツールです。ttIsql
コマンドライン・インタフェースを使用して、SQL文および組込みttIsql
コマンドを発行し、様々な操作を実行します。通常ttIsql
を使用して行う処理は次のとおりです。
データベースの設定およびメンテナンス。表と索引の作成、既存の表の変更および表統計の更新は、ttIsql
を使用して迅速かつ簡単に実行できます。
データベースの構造に関する情報の検索。表、索引、およびキャッシュ・グループの定義は、組込みttIsql
コマンドを使用して検索できます。また、データベースの現在のサイズおよび状態を表示することもできます。
データベース処理の最適化。ttIsql
ユーティリティを使用して、SQL操作をチューニングするために問合せオプティマイザ計画を変更または表示できます。また、様々なODBC関数コールの実行に必要な時間も表示できます。
次の項では、ttIsql
ユーティリティを使用してこれらのタスクを実行する方法について説明します。
ttIsql
コマンドの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttIsqlに関する項を参照してください。
ttIsql
ユーティリティは、バッチ・モードまたは対話モードで使用できます。ttIsql
を対話モードで使用する場合、ユーザーはコンソールからttIsql
に直接コマンドを入力します。ttIsql
をバッチ・モードで使用する場合は、コマンドを含むファイルの名前を指定して、事前に準備したttIsql
コマンドのスクリプトを実行します。
通常、バッチ・モードは、次のようなタスクで使用します。
表統計の更新、データベースの圧縮、ログ・ファイルのパージなどの定期的なメンテナンス処理の実行。
表、索引、およびキャッシュ・グループを作成し、その表にデータを移入することによるデータベースの初期化。
一般的な問合せを実行することによる簡単なレポートの作成。
対話モードは、次のような処理に適しています。
TimesTen機能の検証、代替設計のテストおよび問合せパフォーマンスの向上。
データベース統計の調査による、データベース問題の解決。
通常どおりには実行されないその他のデータベース・タスク。
デフォルトでは、シェルからttIsql
を起動すると、ttIsql
は対話モードになります。ttIsql
ユーティリティは、Command>
プロンプトを表示することによって、有効なttIsql
組込みコマンドまたはSQL文の入力を求めます。次の例では、ttIsql
を対話モードで起動し、connect
コマンドをMY_DSN
DSNを使用して実行し、TimesTenデータベースに接続します。
C:\>ttIsql Copyright (c) 1996, 2020 Oracle. All rights reserved. Type ? or "help" for help, type "exit" to quit ttIsql. Command> connect MY_DSN; Connection successful: DSN=MY_DSN;DataStore=/disk1/databases/MY_DSN; DRIVER=E:\WINNT\System32\TTdv181.dll; (Default setting AutoCommit=1) Command>
ttIsql
を使用してデータベースに接続する際には、ttIsql
コマンドラインでDSNまたは接続文字列を指定することも可能です。connect
コマンドが暗黙的に実行されます。
C:\>ttIsql -connstr "DSN=MY_DSN" Copyright (c) 1996, 2020 Oracle. All rights reserved. Type ? or "help" for help, type "exit" to quit ttIsql. connect "DSN=MY_DSN"; Connection successful: DSN=MY_DSN;DataStore=/disk1/databases/MY_DSN; DRIVER=E:\WINNT\System32\TTdv181.dll; (Default setting AutoCommit=1) Command>
バッチ・モードは、2つの異なる方法で使用できます。最も一般的な方法は、ttIsql
コマンドラインで、実行するファイルの名前を-f
オプションの後に指定する方法です。
たとえば、CREATE TABLE
文を含むファイルを実行する場合は次のようになります。
C:\>ttIsql -f create.sql -connstr "DSN=MY_DSN" Copyright (c) 1996, 2020 Oracle. All rights reserved. Type ? or "help" for help, type "exit" to quit ttIsql. connect "DSN=MY_DSN" Connection successful: DSN=MY_DSN;DataStore=/disk1/databases/MY_DSN; DRIVER=E:\WINNT\System32\TTdv181.dll; (Default setting AutoCommit=1) run "create.sql" CREATE TABLE LOOKUP (KEY NUMBER NOT NULL PRIMARY KEY, VALUE CHAR (64)) exit; Disconnecting... Done. C:\>
バッチ・モードを使用するもう1つの方法は、対話形式のコマンド・プロンプトからrun
コマンドを直接入力する方法です。実行するttIsql
組込みコマンドおよびSQL文を含むファイルの名前をrun
コマンドの後に指定します。
Command> run "create.sql"; CREATE TABLE LOOKUP (KEY NUMBER NOT NULL PRIMARY KEY, VALUE CHAR (64)) Command>
コマンド・プロンプトからttIsql
セッションが開始されるたびに、一連のコマンドライン・オプションが自動的に実行されるように、ttIsql
ユーティリティをカスタマイズできます。これは、TTISQL
という環境変数を適切なttIsql
コマンドラインの値に設定して行うことができます。次に、ttIsql
コマンドライン・オプションの概要を示します。ttIsql
コマンドライン・オプションの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttIsqlに関する項を参照してください。
Usage: ttIsql [-h | -help | -helpcmds | -helpfull | -V] ttIsql [-f <filename>] [-v <verbosity>] [-e <commands>] [-interactive] [-N <ncharEncoding>] [-wait] [{<DSN> | -connstr <connection_string>}]
TTISQL
環境変数には、ttIsql
コマンドラインと同じ構文要件があります。ttIsql
は、起動時にTTISQL
環境変数の値を読み取り、変数で指定されたすべてのオプションを現行のttIsql
セッションに適用します。特定のコマンドライン・オプションがTTISQL
環境変数およびコマンドラインの両方に指定されている場合は、コマンドラインに指定されているオプションが常に優先されます。
環境変数の値を設定する手順は、プラットフォーム、およびttIsql
が起動されるシェルによって異なります。たとえば、WindowsでTTISQL
環境変数を設定する場合は、次のように入力します。
C:\>set TTISQL=-connStr "DSN=MY_DSN" -e "autocommit 0;dssize;"
この例では、次に示すように、ttIsql
がMY_DSN
というDSNに自動的に接続し、自動コミットを無効にし、データベースのサイズを表示します。
C:\>ttIsql Copyright (c) 1996, 2020 Oracle. All rights reserved. Type ? or "help" for help, type "exit" to quit ttIsql. Command> connect "DSN=MY_DSN"; Connection successful: DSN=MY_DSN;DataStore=/disk1/databases/MY_DSN; DRIVER=E:\WINNT\System32\TTdv181.dll; (Default setting AutoCommit=1) Command> autocommit 0; Command> dssize; The following values are in KB: PERM_ALLOCATED_SIZE: 40960 PERM_IN_USE_SIZE: 9453 PERM_IN_USE_HIGH_WATER: 9453 TEMP_ALLOCATED_SIZE: 32768 TEMP_IN_USE_SIZE: 9442 TEMP_IN_USE_HIGH_WATER: 9885 Command>
ttIsql
コマンド・プロンプトは、prompt
属性を指定してset
コマンドを使用するとカスタマイズできます。
Command> set prompt MY_DSN; MY_DSN
現行の接続の名前を戻す文字列書式(%c
)を指定できます。
Command> set prompt %c; con1
空白を埋め込む場合は、文字列を引用符で囲む必要があります。
Command> set prompt "MY_DSN %c> "; MY_DSN con1>
ttIsql
ユーティリティには、オンライン・バージョンのすべてのttIsql
組込みコマンドのコマンド構文の定義および説明が用意されています。ttIsql
内からこのオンライン・ヘルプにアクセスするには、help
コマンドを使用します。ttIsql
組込みコマンドの詳細を表示するには、ヘルプを表示する1つ以上のttIsql
コマンドをhelp
コマンドの後に入力します。次に、connect
およびdisconnect
コマンドのオンライン・ヘルプの表示例を示します。
Command> help connect disconnect Arguments in <> are required. Arguments in [] are optional. Command Usage: connect [DSN|connection_string] [as <connection_id>] Command Aliases: (none) Description: Connects to the data source specified by the optional DSN or connection string argument. If an argument is not given, then the DSN or connection string from the last successful connection is used. A connection ID may optionally be specified, for use in referring to the connection when multiple connections are enabled. The DSN is used as the default connection ID. If that ID is already in use, the connection will be assigned the ID "conN", where N is some number larger than 0. Requires an active connection: NO Requires autocommit turned off: NO Reports elapsed execution time: YES Works only with a TimesTen data source: NO Example: connect; -or- connect RunData; -or- connect "DSN=RunData"; -or- connect RunData as rundata1; Command Usage: disconnect [all] Command Aliases: (none) Description: Disconnects from the currently connected data source or all connections when the "all" argument is included. If a transaction is active when disconnecting then the transaction will be rolled back automatically. If a connection exists when executing the "bye", "quit" or "exit" commands then the "disconnect" command will be executed automatically. Requires an active connection: NO Requires autocommit turned off: NO Reports elapsed execution time: YES Works only with a TimesTen data source: NO Example: disconnect;
すべてのttIsql
組込みコマンドの簡単な説明を表示するには、引数を指定しないでhelp
コマンドを入力します。すべてのttIsql
組込みコマンドの詳細を表示するには、help
コマンドの後にall
引数を入力します。
ttIsql
を使用して設定または表示可能な属性のリストを表示するには、次のように入力します。
Command> help attributes
LinuxおよびUNIXシステムでは、editlineライブラリを使用して、emacs (デフォルト)またはviバインディングを設定すると、前のttIsql
コマンドをスクロールしたり、編集して再送信することができます。この機能は、Windowsでは使用不可および不要です。
ttIsql
のeditline機能を無効にするには、ttIsql
コマンドのset editline off
を使用します。
設定およびキーストロークに関する情報を、エディタのタイプごとに説明します。
emacsバインディングを使用するには、~/.editrc
ファイルを作成し、そのファイルの最後の行にbind
を挿入してttIsql
を実行します。editline libによって、現行のバインディングが表示されます。
emacsバインディングでttIsql
を使用する場合のキーストロークは、次のとおりです。
キーストローク | アクション |
---|---|
<[←]> | 挿入点を左に移動します。後退します。 |
<[→]> | 挿入点を右に移動します。前進します。 |
<[↑]> | 表示されているコマンドの1つ前のコマンドにスクロールします。カーソルは行末に移動します。 |
<[↓]> | 最新のコマンド履歴項目までスクロールします。カーソルは行末に移動します。 |
<[Ctrl] + [A]> | 挿入点を行の先頭まで移動します。 |
<[Ctrl] + [E]> | 挿入点を行末まで移動します。 |
<[Ctrl] + [K]> | コマンドライン上の現在の位置から行末までの文字を保存して削除(Kill)します。 |
<[Ctrl] + [Y]> | 以前保存した文字をリストア(Yank)して現在の挿入点に挿入します。 |
<[Ctrl] + [F]> | 右に1文字移動します([→]を参照)。 |
<[Ctrl] + [B]> | 左に1文字移動します([←]を参照)。 |
<[Ctrl] + [P]> | 前の履歴に移動します([↑]を参照)。 |
<[Ctrl] + [N]> | 次の履歴に移動します([↓]を参照)。 |
viバインディングを使用するには、${HOME}/.editrc
ファイルを作成し、そのファイルにbind-v
を挿入してttIsql
を実行します。現在の設定を取得するには、${HOME}/.editrc
ファイルを作成し、そのファイルの最後の行にbind
を挿入します。ttIsql
を実行すると、editline libによって現在のバインディングが表示されます。
viバインディングでttIsql
を使用する場合のキーストロークは、次のとおりです。
キーストローク | アクション |
---|---|
[←]、[h] | 挿入点を左に移動します(後退)。 |
[→]、[l] | 挿入点を右に移動します(前進)。 |
[↑]、[k] | 履歴内の前のコマンドにスクロールします。カーソルは行末に移動します。 |
[↓]、[j] | 履歴内の次のコマンドにスクロールします。カーソルは行末に移動します。 |
[Esc] | viコマンド・モード。 |
0, $ | 挿入点を行の先頭に移動します。カーソルは行末に移動します。 |
[i]、[I] | 挿入モード。行の先頭の挿入モードです。 |
[a]、[A] | 追加(後ろに挿入)モード。行末に追加します。 |
[R] | 置換モード。 |
[C] | 行末まで変更します。 |
[B] | 前の単語まで移動します。 |
[e] | 単語末まで移動します。 |
<[Ctrl] + [P]> | 前の履歴に移動します([↑]を参照)。 |
<[Ctrl] + [N]> | 次の履歴に移動します([↓]を参照)。 |
ttIsql
ユーティリティでは、現行のttIsql
セッションで最後に実行した100個のコマンドのリストが保存されます。このリスト内のコマンドは、コマンド全体を入力せずに再度参照または実行できます。履歴リストには、SQL文およびttIsql
組込みコマンドの両方が保存されます。history
コマンド(h
)を使用すると、以前に実行したコマンドを参照できます。次に例を示します。
Command> h; 8 INSERT INTO T3 VALUES (3) 9 INSERT INTO T1 VALUES (4) 10 INSERT INTO T2 VALUES (5) 11 INSERT INTO T3 VALUES (6) 12 autocommit 0 13 showplan 14 SELECT * FROM T1, t2, t3 WHERE A=B AND B=C AND A=B 15 trytbllocks 0 16 tryserial 0 17 SELECT * FROM T1, t2, t3 WHERE A=B AND B=C AND A=B Command>
history
コマンドによって、最後に実行された10個のSQL文またはttIsql
組込みコマンドが表示されます。この最後10個以外のコマンドを表示するには、history
コマンドに引数として表示最大数を指定します。
履歴リストの各エントリは、一意の番号で識別されています。コマンド番号を!
の後に指定すると、そのコマンドを再度実行できます。次に例を示します。
Command> Command> ! 12; autocommit 0 Command>
最後のコマンドを実行するには、2つの!
を連続して入力します。
Command> !!; autocommit 0 Command>
特定の文字列で始まっている最後のコマンドを実行するには、そのコマンドの最初の数文字を!
の後に入力します。次に例を示します。
Command> ! auto; autocommit 0 Command>
savehistory
コマンドを使用すると、ttIsql
によって保存されるコマンドのリストを保存できます。
Command> savehistory history.txt;
出力ファイルがすでに存在している場合は、-a
オプションを使用してこのファイルに新しいコマンド履歴を追加するか、または-f
オプションを使用してこのファイルを上書きします。次の例では、既存のファイルに新しいコマンド履歴を追加する方法を示します。
Command> savehistory -a history.txt;
clearhistory
コマンドを使用すると、ttIsql
によって保存されるコマンドのリストを消去できます。
Command> clearhistory;
ttIsql edit
コマンドを使用してファイルを編集するか、またはテキスト・エディタでttIsql
コマンドを編集します。ttIsql edit
コマンドは、emacs
、gedit
、vi
などのテキスト・エディタを起動します。デフォルトのテキスト・エディタの変更方法の詳細は、「ttIsqlのeditコマンドのデフォルトのテキスト・エディタの変更」を参照してください。
ttIsql edit
コマンドの構文は次のとおりです。
Command> edit [ file | !history_search_command ]
一度に1つのパラメータのみを使用できます。history_search_command
パラメータは、!
文字の後にコマンドの数または検索文字列を続けたもので定義します。!
文字を指定しないと、ttIsql edit
コマンドはパラメータをfile
として解釈します。file
は編集するファイルの名前です。パラメータまたは!!
を指定しない場合は、最後のttIsql
コマンドが編集されます。
file
パラメータを指定した場合は、エディタによって指定されたファイルが編集されます。TimesTenが現在の作業ディレクトリに指定されたfile
パラメータと完全に一致するファイルを見つけられない場合、file
.sql
を検索します。どちらのファイルも存在しない場合は、エディタによって指定されたファイルが現在の作業ディレクトリに作成されます。file
パラメータにはパスを指定できます。
次の例では、new.sql
ファイルを編集します。
Command> edit new.sql;
次の例では、/scripts
ディレクトリのnew.sql
ファイルを編集します。
Command> edit /scripts/new.sql;
file
パラメータを指定してttIsql edit
コマンドを実行した場合、ttIsql
は、エディタの終了後にファイルの内容を実行しません。
現在のttIsql
セッションの履歴リストに格納されているSQL文を編集できます。ttIsql edit
コマンドをコールする場合は、!
文字に続けてコマンドの数または検索文字列を指定します。一時ファイル(任意の場所に保存可能)にあるttIsql
コマンドがエディタによって開かれます。ttIsql history
コマンドの使用方法の詳細は、「ttIsqlのコマンド履歴の使用」を参照してください。
次の例では、ttIsql
コマンド2
を編集します。
Command> edit !2;
次の例では、検索文字列create
が含まれている最後のttIsql
コマンドを検索して編集します。
Command> edit !create;
次の例では、CREATE TABLE
文を実行した後に、edit
コマンドを使用してテキスト・エディタでCREATE TABLE
文を編集します。
Command> CREATE TABLE t1 (c1 VARCHAR(10) NOT INLINE NOT NULL, c2 VARCHAR(144) INLINE NOT NULL); Command> edit;
前の例は、!!
パラメータを指定してttIsql edit
コマンドを使用したものに相当します。
Command> CREATE TABLE t1 (c1 VARCHAR(10) NOT INLINE NOT NULL, c2 VARCHAR(144) INLINE NOT NULL); Command> edit !!;
ttIsql edit
コマンドをhistory_search_command
パラメータを指定して実行した場合、ttIsql
は、エディタの終了後にファイルの内容を実行します。ファイルの内容は、1つのttIsql
コマンドとして実行されます。ファイルの内容を実行しない場合は、ファイルの内容を削除し、エディタを終了する前にファイルを保存します。
ttIsql
_EDITOR
定義の別名を定義することによってデフォルトのエディタを指定できます。次の例では、デフォルトのエディタをvi
に設定します。
Command> DEFINE _EDITOR=vi
_EDITOR
定義の別名を定義しない場合は、ttIsql
はVISUAL
環境変数で指定されているエディタを使用します。_EDITOR
定義の別名およびVISUAL
環境変数が設定されていない場合、ttIsql
は、EDITOR
環境変数で指定されたエディタを使用します。_EDITOR
、VISUAL
およびEDITORが設定されていない場合、LinuxおよびUNIXではvi
が使用され、Windowsではnotepad.exe
が使用されます。
ttIsql
ユーティリティでは、『Oracle TimesTen In-Memory Databaseリファレンス』のサポートされている文字セットの項に記載されている文字セットがサポートされています。ttIsql
で文字を表示する機能は、ttIsql
を使用している端末のネイティブ・オペレーティング・システムのロケール設定によって異なります。
ロケール・ベースの出力書式を上書きするには、ncharencoding
オプションまたは-N
オプションを使用します。これらのオプションの有効な値は、LOCALE
(デフォルト)およびASCII
です。ASCII
を選択した場合にttIsql
でUnicode文字が検出されると、Unicode文字はエスケープされた書式で表示されます。
出力方法を変更する場合、アクティブな接続は必要ありません。
データベース構造に関する情報を表示するいくつかのttIsql
コマンドが用意されています。次に、最も有効なコマンドの概要を示します。
describe
コマンドを使用して、各データベース・オブジェクトに関する情報を表示します。準備済のSQL文および組込みプロシージャに関するパラメータを表示します。describe
コマンドの引数として、表、キャッシュ・グループ、ビュー、マテリアライズド・ビュー、順序、シノニムなどの名前、組込みプロシージャ、SQL文、事前に準備済のSQL文のコマンドID、PL/SQL関数、PL/SQLプロシージャまたはPL/SQLパッケージを指定できます。
describe
コマンドを終了するには、セミコロンを指定する必要があります。
Command> CREATE TABLE t1 (KEY NUMBER NOT NULL PRIMARY KEY, VALUE CHAR (64)); Command> describe t1; Table USER.T1: Columns: *KEY NUMBER NOT NULL VALUE CHAR (64) 1 table found. (primary key columns are indicated with *) Command> describe SELECT * FROM T1 WHERE KEY=?; Prepared Statement: Parameters: Parameter 1 NUMBER Columns: KEY NUMBER NOT NULL VALUE CHAR (64) Command> describe ttOptUseIndex; Procedure TTOPTUSEINDEX: Parameters: Parameter INDOPTION VARCHAR (1024) Columns: (none) 1 procedure found. Command>
cachegroups
コマンドを使用すると、現行のデータベースで定義されているキャッシュ・グループの詳細が表示されます。キャッシュ・グループに関連付けられているWHERE
句のみでなく、キャッシュ・グループに定義されているroot表および子表の属性も表示されます。cachegroups
コマンドには、情報を表示するキャッシュ・グループの名前を引数として指定します。
Command> cachegroups; Cache Group CACHEUSER.READCACHE: Cache Group Type: Read Only Autorefresh: Yes Autorefresh Mode: Incremental Autorefresh State: Paused Autorefresh Interval: 5 Seconds Autorefresh Status: ok Aging: No aging defined Root Table: ORATT.READTAB Table Type: Read Only Cache Group CACHEUSER.WRITECACHE: Cache Group Type: Asynchronous Writethrough (Dynamic) Autorefresh: No Aging: LRU on Root Table: ORATT.WRITETAB Table Type: Propagate 2 cache groups found.
dssize
コマンドを使用すると、データベースの最大サイズ、割当てサイズおよび使用中サイズのみでなく、永続パーティションおよび一時メモリー領域の現在のメモリー・ステータスがレポートされます。ただし、TimesTen Scaleoutの場合、dssize
コマンドがレポートするのは、現在の要素の現在のメモリー・ステータスのみです。
dssize
コマンドは、SYS.V$MONITOR
およびSYS.GV$MONITOR
システム・ビューに表示される情報と同じ情報をレポートします。
次の例では、k
オプションを使用して、データベース・サイズ情報をKB単位で出力します。
Command> dssize k; The following values are in KB: PERM_ALLOCATED_SIZE: 40960 PERM_IN_USE_SIZE: 9742 PERM_IN_USE_HIGH_WATER: 9742 TEMP_ALLOCATED_SIZE: 32768 TEMP_IN_USE_SIZE: 9442 TEMP_IN_USE_HIGH_WATER: 9505
dssize
コマンドの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttIsqlに関する説明を参照してください。
tablesize
コマンドでは、表の領域使用量の詳細な分析が表示されます。指定された表の表サイズを分析するttComputeTabSizes
組込みプロシージャを一度コールすると、tablesize
コマンドでは分析されたすべての表の合計サイズのデータが表示されます。
ノート: 詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttComputeTabSizesに関する説明を参照してください。 |
引数なしでtablesize
コマンドを実行すると、ttComputeTabSizes
の計算がすでに実行された、すべての表に対する最大使用可能サイズ指定情報が表示されます。表を引数として指定すると、tablesize
によって、指定した表に対する使用可能サイズ指定のみが表示されます。
tablesize
の構文は次のとおりです。
tablesize [[owner_name_pattern.]table_name_pattern]
次の例では、ttComputeTabSizes
組込みプロシージャを起動し、employees
表の表サイズが計算されます。次に、tablesize
コマンドによってemployees
表のために収集されたサイズ指定情報が表示されます。
Command> call ttComputeTabSizes('employees'); Command> tablesize employees; Sizes of USER1.EMPLOYEES: INLINE_ALLOC_BYTES: 60432 NUM_USED_ROWS: 107 NUM_FREE_ROWS: 149 AVG_ROW_LEN: 236 OUT_OF_LINE_BYTES: 0 METADATA_BYTES: 1304 TOTAL_BYTES: 61736 LAST_UPDATED: 2011-06-29 12:55:28.000000 1 table found.
これらの値から、オーバーヘッドおよび総領域における該当の表の使用状況を把握できます。
次に例を示します。
NUM_FREE_ROWS
値は、表に割り当てられた、現在使用されていない行数を表します。システムでは、空行に占有される領域をその他のシステム・オブジェクトまたは構造の保存に使用できません。
表が占有する永続領域を計算するには、TOTAL_BYTES
値を使用します。
LAST_UPDATED
は、サイズの最終計算時刻になります。より最近の計算が必要な場合は、ttComputeTabSizes
を再実行し、新しい出力を表示します。
各計算値の説明は、『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』のSYS.ALL_TAB_SIZESに関する項を参照してください。
monitor
コマンドを使用すると、dssize
コマンドで戻されるすべての情報、およびデータベースがメモリーにロードされてから収集された接続数、チェックポイント、ロック・タイムアウト、コミット、ロールバック操作などに関する追加の統計情報が表示されます。
Command> monitor; TIME_OF_1ST_CONNECT: Wed Apr 20 10:34:17 2011 DS_CONNECTS: 11 DS_DISCONNECTS: 0 DS_CHECKPOINTS: 0 DS_CHECKPOINTS_FUZZY: 0 DS_COMPACTS: 0 PERM_ALLOCATED_SIZE: 40960 PERM_IN_USE_SIZE: 5174 PERM_IN_USE_HIGH_WATER: 5174 TEMP_ALLOCATED_SIZE: 18432 TEMP_IN_USE_SIZE: 4527 TEMP_IN_USE_HIGH_WATER: 4527 SYS18: 0 TPL_FETCHES: 0 TPL_EXECS: 0 CACHE_HITS: 0 PASSTHROUGH_COUNT: 0 XACT_BEGINS: 2 XACT_COMMITS: 1 XACT_D_COMMITS: 0 XACT_ROLLBACKS: 0 LOG_FORCES: 0 DEADLOCKS: 0 LOCK_TIMEOUTS: 0 LOCK_GRANTS_IMMED: 17 LOCK_GRANTS_WAIT: 0 SYS19: 0 CMD_PREPARES: 1 CMD_REPREPARES: 0 CMD_TEMP_INDEXES: 0 LAST_LOG_FILE: 0 REPHOLD_LOG_FILE: -1 REPHOLD_LOG_OFF: -1 REP_XACT_COUNT: 0 REP_CONFLICT_COUNT: 0 REP_PEER_CONNECTIONS: 0 REP_PEER_RETRIES: 0 FIRST_LOG_FILE: 0 LOG_BYTES_TO_LOG_BUFFER: 64 LOG_FS_READS: 0 LOG_FS_WRITES: 0 LOG_BUFFER_WAITS: 0 CHECKPOINT_BYTES_WRITTEN: 0 CURSOR_OPENS: 1 CURSOR_CLOSES: 1 SYS3: 0 SYS4: 0 SYS5: 0 SYS6: 0 CHECKPOINT_BLOCKS_WRITTEN: 0 CHECKPOINT_WRITES: 0 REQUIRED_RECOVERY: 0 SYS11: 0 SYS12: 1 TYPE_MODE: 0 SYS13: 0 SYS14: 0 SYS15: 0 SYS16: 0 SYS17: 0 SYS9:
ttIsql
を使用して、データベース内の表、索引、ビュー、順序、シノニム、PL/SQL関数、プロシージャおよびパッケージを表示できます。先頭にall
の付いたコマンドでは、このタイプのオブジェクトがすべて表示されます。たとえば、functions
コマンドではユーザーが所有するPL/SQL関数が表示されますが、allfunctions
では、すべてのPL/SQL関数が表示されます。
オプションで、オブジェクト所有者およびオブジェクト名のパターンを指定することもできます。
データベース・オブジェクトを表示するには、次のコマンドを使用します。
tables
およびalltables
- 表を表示します。
indexes
およびallindexes
- 索引を表示します。
views
およびallviews
- ビューを表示します。
sequences
およびallsequences
- 順序を表示します。
synonyms
およびallsynonyms
- シノニムを表示します。
functions
およびallfunctions
- PL/SQL関数を表示します。
procedures
およびallprocedures
- PL/SQLプロシージャを表示します。
packages
およびallpackages
- PL/SQLパッケージを表示します。
ノート: これらの各コマンドの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttIsqlに関する項を参照してください。 |
次の例に、procedures
およびallprocedures
コマンドを示します。ユーザーTERRY
が、myDSN
への接続中にproc1
という名前のプロシージャを作成します。PL/SQL文に続く新しい行には、スラッシュ(/)が入力されています。
procedures
コマンドおよびallprocedures
コマンドでは、これがデータベース内の唯一のPL/SQLプロシージャであることが示されます。
% ttisql myDSN Copyright (c) 1996, 2020 Oracle. All rights reserved. Type ? or "help" for help, type "exit" to quit ttIsql. connect "DSN=myDSN"; Connection successful: DSN=myDSN;UID=terry;DataStore=/disk1/databases/myDSN;DatabaseCharacter Set=AL32UTF8; ConnectionCharacterSet=US7ASCII;PermSize=128; (Default setting AutoCommit=1) Command> create or replace procedure proc1 as begin null; end; > / Procedure created. Command> procedures; TERRY.PROC1 1 procedure found. Command> allprocedures; TERRY.PROC1 1 procedure found.
次に、同じDSNにPat
として接続し、q
という名前のプロシージャを作成します。allprocedures
コマンドでは、Terry
とPat
によって作成されたPL/SQLプロシージャが表示されます。
% ttisql "dsn=myDSN;uid=PAT" Copyright (c) 1996, 2020 Oracle. All rights reserved. Type ? or "help" for help, type "exit" to quit ttIsql. connect "dsn=myDSN;uid=PAT"; Connection successful: DSN=myDSN;UID=PAT; DataStore=/disk1/databases/myDSN;DatabaseCharacterSet=AL32UTF8; ConnectionCharacterSet=US7ASCII;PermSize=128; (Default setting AutoCommit=1) Command> create or replace procedure q as begin null; end; > / Procedure created. Command> procedures; PAT.Q 1 procedure found. Command> allprocedures; TERRY.PROC1 PAT.Q 2 procedures found.
ttIsql
のshow
およびset
コマンドを使用すると、接続属性を表示および設定できます。ttIsql
を使用して表示および設定できる属性のリストは、『Oracle TimesTen In-Memory Databaseリファレンス』の接続属性に関する説明を参照してください。
Passthrough
属性の設定を表示するには、次のように入力します。
Command> show passthrough; PassThrough = 0
Passthrough
設定を変更するには、次のように入力します。
Command> set passthrough 1;
ttIsql
ユーティリティには、トランザクションを管理するためのいくつかの組込みコマンドが用意されています。次に、これらのコマンドの概要を示します。
commitdurable
: 現行のトランザクションをコミットし、データベース障害の場合にコミット済の作業をリカバリできるようにします。
sqlquerytimeout
: アプリケーションに戻されるまでのSQL文の実行待機時間(秒)を指定します。これは、set
コマンドの属性としても設定できます。
デフォルトでは、ttIsql
を起動すると、SQLスクリプト内でも自動コミット機能が有効になります。このモードでは、データベースに対するすべてのSQL操作が自動的にコミットされます。
自動コミット機能を無効にするには、引数0を指定してttIsql
のautocommit
コマンドを実行します。自動コミットが無効になっている場合は、ttIsql
のcommit
コマンド、commitdurable
コマンドまたはrollback
コマンドを実行して、トランザクションを手動でコミットまたはロールバックする必要があります。commitdurable
コマンドを実行すると、データベース障害が発生した場合でも、トランザクションの結果が保持されます。ttIsql
が終了していて自動コミットが無効な場合、コミットされていない文は、ttIsql
によってロールバックされ報告されます。
ttIsql
のisolation
コマンドを使用すると、現行の接続のトランザクション独立性プロパティを変更できます。独立性は、トランザクションの開始時にのみ変更できます。isolation
コマンドには、READ_COMMITTED
またはSERIALIZABLE
のいずれかを定数として指定できます。isolation
コマンドを引数を指定しないで変更すると、現在の分離レベルがレポートされます。
ttIsql
のsqlquerytimeout
コマンドでは、SQL文のタイムアウト間隔を設定します。SQL文の実行時間がsqlquerytimeout
コマンドで設定した秒数を超えると、SQL文は実行されず、6111エラーが生成されます。詳細は、『Oracle TimesTen In-Memory Database Java開発者ガイド』の「SQL文のタイムアウト期間の設定」に関する説明および『Oracle TimesTen In-Memory Database C開発者ガイド』の「SQL文のタイムアウト期間の設定」に関する説明を参照してください。
ノート: TimesTenのロールバック機能および問合せタイムアウト機能を使用しても、Oracle Databaseで処理中のTimesTen Cache操作が停止されることはありません。このような操作には、PassThrough文、フラッシング、手動ロード、手動リフレッシュ、SYNCHRONOUS WRITETHROUGH、伝播および動的ロードが含まれます。 |
次に、ttIsql
の組込みトランザクション管理コマンドの一般的な使用例を示します。
E:\>ttIsql Copyright (c) 1996, 2020 Oracle. All rights reserved. Type ? or "help" for help, type "exit" to quit ttIsql. Command> connect "DSN=MY_DSN"; Connection successful: DSN=MY_DSN;DataStore=/disk1/databases/MY_DSN; DRIVER=E:\WINNT\System32\TTdv181.dll; (Default setting AutoCommit=1) Command> autocommit 0; Command> CREATE TABLE LOOKUP (KEY NUMBER NOT NULL PRIMARY KEY, VALUE CHAR (64)); Command> commit; Command> INSERT INTO LOOKUP VALUES (1, 'ABC'); 1 row inserted. Command> SELECT * FROM LOOKUP; < 1, ABC > 1 row found. Command> rollback; Command> SELECT * FROM LOOKUP; 0 rows found. Command> isolation; isolation = READ_COMMITTED Command> commitdurable; Command> sqlquerytimeout 10; Command> sqlquerytimeout; Query timeout = 10 seconds Command> disconnect; Disconnecting... Command> exit; Done.
TimesTenアプリケーションでは、SQL文を1回のみ準備してそれを複数回実行する方が、実行のたびに文を繰り返し準備するより効率的です。ttIsql
には、準備済のSQL文を使用するための一連の組込みコマンドが用意されています。次に、これらのコマンドの概要を示します。
execandfetch
: 事前に準備済の文を実行し、すべての結果行をフェッチします。1つ以上のSQLFetch
コールの前に実行されるSQLExecute
コールに対応します。
close
- 結果セットが生成された以前に実行済の文に対する結果セットのカーソルをクローズします。SQL_CLOSE
オプションが指定されたSQLFreeStmt
コールに対応します。
free
: 事前に準備済の文をクローズします。SQL_DROP
オプションが指定されたSQLFreeStmt
コールに対応します。
ttIsql
ユーティリティの準備済の文コマンドは、SQL文のパラメータ・マーカーも処理します。準備済のSQL文にパラメータ・マーカーが含まれている場合は、ttIsql
の実行時に、文の各パラメータに値を入力するように自動的に求められます。
次の例では、ttIsql
ユーティリティの準備済の文コマンドを使用して、NUMBER
およびCHAR
列を含む表のINSERT
文を準備します。文が準備された後、文の2つのパラメータに対してそれぞれ異なる値を使用して2回実行されます。また、ttIsql
ユーティリティのtiming
コマンドを使用して、各コマンドに関連付けられている主要ODBC関数コールの実行に必要な経過時間を表示します。
Command> connect "DSN=MY_DSN"; Connection successful: DSN=MY_DSN;DataStore=/disk1/databases/MY_DSN; DRIVER=E:\WINNT\System32\TTdv181.dll; (Default setting AutoCommit=1) Command> timing 1; Command> create table t1 (key number not null primary key, value char(20)); Execution time (SQLExecute) = 0.007247 seconds. Command> prepare insert into t1 values (:f, :g); Execution time (SQLPrepare) = 0.000603 seconds. Command> exec; Type '?' for help on entering parameter values. Type '*' to end prompting and abort the command. Type '-' to leave the parameter unbound. Type '/' to leave the remaining parameters unbound and execute the command. Enter Parameter 1 'F' (NUMBER) > 1; Enter Parameter 2 'G' (CHAR) > 'abc'; 1 row inserted. Execution time (SQLExecute) = 0.000454 seconds. Command> exec; Type '?' for help on entering parameter values. Type '*' to end prompting and abort the command. Type '-' to leave the parameter unbound. Type '/' to leave the remaining parameters unbound and execute the help command. Enter Parameter 1 'F' (NUMBER) > 2; Enter Parameter 2 'G' (CHAR) > 'def'; 1 row inserted. Execution time (SQLExecute) = 0.000300 seconds. Command> free; Command> select * from t1; < 1, abc > < 2, def > 2 rows found. Execution time (SQLExecute + Fetch Loop) = 0.000226 seconds. Command> disconnect; Disconnecting... Execution time (SQLDisconnect) = 2.911396 seconds.
前述の例では、準備するSQL文がprepare
コマンドの直後に指定されています。ttIsql
でSQL文を準備すると、常に、一意のコマンドIDが準備済の文に割り当てられます。ttIsql
ユーティリティでは、複数の準備済の文の追跡にこのIDが使用されます。ttIsql
セッションには、最大256の準備済の文が同時に存在できます。free
コマンドを実行すると、準備済のSQL文に対するコマンドIDの関連付けが自動的に解除されます。
準備済の文コマンドを使用した場合にttIsql
によって生成されるコマンドIDを表示するには、文を準備する前にverbosity
コマンドを使用して冗長性レベルを4に設定するか、describe *
コマンドを使用して準備済のすべての文をそれらのIDとともに表示します。
コマンドIDは、ttIsql
の準備済の文コマンドを使用する場合に明示的に参照できます。ttIsql
の準備済の文コマンドの構文の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttIsqlに関する項を参照するか、ttIsql
コマンド・プロンプトでhelp
と入力してください。
次の例では、1つのNUMBER
パラメータを含む述語が指定されているSELECT
文を準備および実行します。fetchone
コマンドは、この文によって生成された結果行をフェッチするために使用します。showplan
コマンドは、この文の実行時にTimesTen問合せオプティマイザで使用される実行計画を表示するために使用します。また、冗長性レベルは、準備済の文を追跡するためにttIsql
で使用されるコマンドIDが表示されるように4に設定します。
Command> connect "DSN=MY_DSN"; Connection successful: DSN=MY_DSN;DataStore=/disk1/databases/MY_DSN; DRIVER=E:\WINNT\System32\TTdv181.dll; (Default setting AutoCommit=1) The command succeeded. Command> CREATE TABLE T1 (KEY NUMBER NOT NULL PRIMARY KEY, VALUE CHAR (64)); The command succeeded. Command> INSERT INTO T1 VALUES (1, 'abc'); 1 row inserted. The command succeeded. Command> autocommit 0; Command> showplan 1; Command> verbosity 4; The command succeeded. Command> prepare SELECT * FROM T1 WHERE KEY=?; Assigning new prepared command id = 0. Query Optimizer Plan: STEP: 1 LEVEL: 1 OPERATION: RowLkRangeScan TBLNAME: T1 IXNAME: T1 INDEXED CONDITION: T1.KEY = _QMARK_1 NOT INDEXED: <NULL> The command succeeded. Command> exec; Executing prepared command id = 0. Type '?' for help on entering parameter values. Type '*' to end prompting and abort the command. Type '-' to leave the parameter unbound. Type '/;' to leave the remaining parameters unbound and execute the command. Enter Parameter 1 '_QMARK_1' (NUMBER) > 1 The command succeeded. Command> fetchone; Fetching prepared command id = 0. < 1, abc > 1 row found. The command succeeded. Command> close; Closing prepared command id = 0. The command succeeded. Command> free; Freeing prepared command id = 0. The command succeeded. Command> commit; The command succeeded. Command> disconnect; Disconnecting... The command succeeded. Command>
次の項では、ttIsqlでバインド変数を宣言、構成および使用する方法について説明します。
ttIsqlで、SQL文、SQLスクリプトまたはPL/SQLブロックから参照可能な変数および配列を宣言および構成できます。variable
およびsetvariable
コマンドを使用して宣言した変数は、NUMBER
、CHAR
、NCHAR
、VARCHAR2
、NVARCHAR2
、CLOB
、NCLOB
、BLOB
、REFCURSOR
のデータ型の1つである必要があります。ただし、配列のバインド時には、TimesTenでは、NUMBER
、CHAR
、NCHAR
、VARCHAR2
またはNVARCHAR2
データ型の配列のバインドのみがサポートされています。
ノート: 宣言したすべての変数は、ttIsqlのセッションの間存続します。ただし、同じ名前の新しい変数を宣言すると、新しい変数が古い変数に置き換えられます。 |
次の例では、数値、文字列、配列のバインド変数をvariable
またはvar
コマンドで宣言しています。それぞれは、宣言時またはsetvariable
またはsetvar
コマンドを使用して、値に割り当てられます。
ノート: これらのコマンドの構文の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttIsqlに関する説明を参照してください。 |
Command> VARIABLE house_number NUMBER := 268; Command> PRINT house_number; HOUSE_NUMBER : 268 Command> VARIABLE street_name VARCHAR2(15); Command> SETVARIABLE street_name := 'Oracle Parkway'; Command> VARIABLE occupants[5] VARCHAR2(15); Command> SETVARIABLE occupants[1] := 'Pat'; Command> SETVARIABLE occupants[2] := 'Terry'; Command> PRINT occupants; OCCUPANTS : ARRAY [ 5 ] (Current Size 2) OCCUPANTS[1] : Pat OCCUPANTS[2] : Terry
次に、配列に複数の値をバインドする例を示します(大カッコは値の記述用に使用し、カンマは配列内の各値を区切るために使用します)。
Command> VARIABLE occupants[5] VARCHAR2(15) := ['Pat', 'Terry']; Command> PRINT occupants; OCCUPANTS : ARRAY [ 5 ] (Current Size 2) OCCUPANTS[1] : Pat OCCUPANTS[2] : Terry
バインド配列を使用する場合、PL/SQLでは、次の宣言で各変数をPL/SQL変数にバインドできます(ここで、TypeName
はPL/SQLデータ型を一意に識別し、DataType
には、CHAR
、NCHAR
、VARCHAR2
またはNVARCHAR2
を指定できます)。
TYPETypeName
IS TABLE OFDataType
(<precision>) INDEX BY BINARY_INTEGER;
変数がNUMBER
の配列として宣言された場合、NUMBER
、INTEGER
、FLOAT
またはDOUBLE PRECISION
のデータ型のPL/SQL変数にバインドできます。これを行うには、次の適切な宣言を行います。
TYPETypeName
IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; TYPETypeName
IS TABLE OF INTEGER INDEX BY BINARY_INTEGER; TYPETypeName
IS TABLE OF FLOAT INDEX BY BINARY_INTEGER; TYPETypeName
IS TABLE OF DOUBLE PRECISION INDEX BY BINARY_INTEGER;
次の例は、その後PL/SQLブロックで宣言され使用されるoccupants
VARCHAR2
配列を宣言します。
Command> VARIABLE occupants[5] VARCHAR2(15); Command> SETVARIABLE occupants[1] := 'Pat'; Command> SETVARIABLE occupants[2] := 'Terry'; Command> DECLARE TYPE occuname IS TABLE OF VARCHAR2(15) INDEX BY BINARY_INTEGER; x occuname; BEGIN x := :occupants; FOR LROW IN x.FIRST..x.LAST LOOP x(LROW) := x(LROW) || ' Doe'; END LOOP; :occupants := x; END; / PL/SQL procedure successfully completed. Command> PRINT occupants; OCCUPANTS : ARRAY [ 5 ] (Current Size 2) OCCUPANTS[1] : Pat Doe OCCUPANTS[2] : Terry Doe
ttIsqlにautovariables
を構成すると、TimesTenでは、最後にフェッチした行の各列名を使用したバインド変数を自動作成します。自動バインド変数は、他のすべてのバインド変数と同様に使用できます。
次の例では、employees
表からすべての行が選択されます。すべての列が取得されるので、自動変数が作成され、各列に名前が付けられます。このバインド変数には、各列で取得した最後の値が含まれます。
Command> SET AUTOVARIABLES ON; Command> SELECT * FROM employees; ... < 204, Hermann, Baer, HBAER, 515.123.8888, 1994-06-07 00:00:00, PR_REP, 10000, <NULL>, 101, 70 > < 205, Shelley, Higgins, SHIGGINS, 515.123.8080, 1994-06-07 00:00:00, AC_MGR, 12000, <NULL>, 101, 110 > < 206, William, Gietz, WGIETZ, 515.123.8181, 1994-06-07 00:00:00, AC_ACCOUNT, 8300, <NULL>, 205, 110 > Command> PRINT; EMPLOYEE_ID : 206 FIRST_NAME : William LAST_NAME : Gietz EMAIL : WGIETZ PHONE_NUMBER : 515.123.8181 HIRE_DATE : 1994-06-07 00:00:00 JOB_ID : AC_ACCOUNT SALARY : 8300 COMMISSION_PCT : <NULL> MANAGER_ID : 205 DEPARTMENT_ID : 110
列名として別名を渡すと、自動バインド変数名に列名ではなくその別名が使用されます。
Command> SET AUTOVARIABLES ON; Command> SELECT employee_id ID, First_name SURNAME, last_name LASTNAME FROM employees; ID, SURNAME, LASTNAME ... < 204, Hermann, Baer > < 205, Shelley, Higgins > < 206, William, Gietz > 107 rows found. Command> PRINT; ID : 206 SURNAME : William LASTNAME : Gietz
既知の列名を指定せずにデータをフェッチする問合せでは、列名を表示するようにcolumnlabels
on
を設定します。次の例では、ttConfiguration
組込みプロシージャによって、paramname
およびparamvalue
の列が返されています。
Command> SET AUTOVARIABLES ON; Command> SET COLUMNLABELS ON; Command> call TTCONFIGURATION('LockLevel'); PARAMNAME, PARAMVALUE < LockLevel, 0 > 1 row found. Command> IF :paramvalue = 1 THEN "e:Database-level locking is enabled"; Command> IF NOT :paramvalue = 1 THEN "e:Row-level locking is enabled"; Row-level locking is enabled
また、describe
を使用すると列名を表示することもできます。次の例では、describeコマンドを使用し、ttConfiguration
組込みプロシージャの列名を表示します。
Command> DESCRIBE TTCONFIGURATION; Procedure TTCONFIGURATION: Parameters: PARAMNAME TT_VARCHAR (30) Columns: PARAMNAME TT_VARCHAR (30) NOT NULL PARAMVALUE TT_VARCHAR (1024) 1 procedure found.
PL/SQLブロックは、ttIsql
コマンドラインから作成および実行できます。
PL/SQLブロックから生成された結果を表示するには、serveroutput
をonに設定します。
Command> set serveroutput on
出力バッファにテキスト行を挿入する無名ブロックを作成します。ブロックはスラッシュ(/)で終了する必要があります。
Command> BEGIN DBMS_OUTPUT.put_line('Welcome!'); END; / Welcome! PL/SQL procedure successfully completed. Command>
その他の例は、『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』を参照してください。PL/SQLオブジェクト用のttIsql
におけるエラー処理の詳細は、『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』のttIsqlにおけるエラー表示に関する項を参照してください。
OUT
パラメータを使用して、PL/SQLからアプリケーションにデータを戻すことができます。次の例では、TimesTenデータベースの空き状況に関する情報を戻します。
tt_space_info
PL/SQLプロシージャを作成し、SQLを使用してpermpct
、permmaxpct
、temppct
およびtempmaxpct
の各パラメータに値を入力します。
Command> CREATE OR REPLACE PROCEDURE tt_space_info (permpct OUT PLS_INTEGER, permmaxpct OUT PLS_INTEGER, temppct OUT PLS_INTEGER, tempmaxpct OUT PLS_INTEGER) AS monitor sys.monitor%ROWTYPE; BEGIN SELECT * INTO monitor FROM sys.monitor; permpct := monitor.perm_in_use_size * 100 / monitor.perm_allocated_size; permmaxpct := monitor.perm_in_use_high_water * 100 / monitor.perm_allocated_size; temppct := monitor.temp_in_use_size * 100 / monitor.temp_allocated_size; tempmaxpct := monitor.temp_in_use_high_water * 100 / monitor.temp_allocated_size; END; / Procedure created.
変数を宣言し、tt_space_info
をコールします。出力できるように、パラメータ値がttIsql
に戻されます。
Command> VARIABLE permpct NUMBER Command> VARIABLE permpctmax NUMBER Command> VARIABLE temppct NUMBER Command> VARIABLE temppctmax NUMBER Command> BEGIN tt_space_info(:permpct, :permpctmax, :temppct, :temppctmax); END; / PL/SQL procedure successfully completed. Command> PRINT permpct; PERMPCT : 4 Command> PRINT permpctmax; PERMPCTMAX : 4 Command> PRINT temppct; TEMPPCT : 11 Command> PRINT temppctmax; TEMPPCTMAX : 11
また、PL/SQL文で実行可能な文ハンドルを、OUT
参照カーソル・パラメータで戻すこともできます。PL/SQL文はカーソルに関連付けられている問合せを選択できます。次の例は、昇順と降順をランダムに選択する参照カーソルをオープンします。
Command> VARIABLE ref REFCURSOR; Command> BEGIN IF (mod(dbms_random.random(), 2) = 0) THEN open :ref for select object_name from SYS.ALL_OBJECTS order by 1 asc; ELSE open :ref for select object_name from SYS.ALL_OBJECTS order by 1 desc; end if; END; / PL/SQL procedure successfully completed.
参照カーソルから結果セットをフェッチするには、PRINT
コマンドを使用します。
Command> PRINT ref REF : < ACCESS$ > < ALL_ARGUMENTS > < ALL_COL_PRIVS > < ALL_DEPENDENCIES > ... 143 rows found.
または、結果セットが降順になっている場合、次のように出力されます。
Command> PRINT ref REF : < XLASUBSCRIPTIONS > < WARNING_SETTINGS$ > < VIEWS > ... 143 rows found.
IF-THEN-ELSE
コマンド構成を使用すると、ttIsqlセッションに条件ブランチ・ロジックを実装できます。IF
コマンドによって条件がテストされ、THEN
句内またはオプションのELSE
句内のコマンドを実行するかが決定されます。SQL文、SQLスクリプト、PL/SQLブロックまたはTimesTenユーティリティのコマンドを実行できます。
ノート: IF-THEN-ELSE 構成の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttIsqlに関する項を参照してください。 |
次の例では、TimesTenデータベースで有効になっているロックのタイプを確認するバインド変数を作成およびテストします。これでは、autovariables
コマンドを使用し、ttConfiguration
に対するコールの結果からバインド変数が作成されます。この値はparamvalue
変数をテストすることによってIF-THEN-ELSE
条件内でテストできます。
Command> SET AUTOVARIABLES ON; Command> CALL TTCONFIGURATION('LockLevel'); PARAMNAME, PARAMVALUE < LockLevel, 0 > 1 row found. Command> IF :paramvalue = 1 THEN "e:Database-level locking is enabled" > ELSE "e:Row-level locking is enabled"; Row-level locking is enabled
次の例では、employees
表の存在の有無が確認されます。存在しない場合、employees
表を作成するSQLスクリプトが実行されます(存在する場合はメッセージが表示されます)。
Command> IF 0 = "SELECT COUNT(*) FROM SYS.TABLES WHERE TBLNAME LIKE 'employees';" THEN "e:EMPLOYEES table already exists" ELSE "@HR_CRE_TT.SQL;"; EMPLOYEES table already exists
結果を含めるためのキャッシュ・グループおよびキャッシュ表を作成しないで、バックエンドOracle DatabaseからのSQL問合せの結果をTimesTenの単一表にロードできます。TimesTenでは、Oracle Databaseでユーザーが指定したSELECT
文を実行し、その結果セットをTimesTenの表にロードするツールが提供されます。
次は、このタスクを実行するために行う主要なステップです。
適切な列とデータ型を備えた表をTimesTenに作成します。
Oracle Databaseで実行されて目的の結果セットを生成するSELECT
文を指定します。
結果セットをTimesTenの表にロードします。
TimesTenには、これらのタスクを実行するために2通りの方法があります。
ttIsql
ユーティリティは、createandloadfromoraquery
コマンドを備えており、このコマンドではTimesTen表名およびSELECT
文が指定されると自動的にTimesTen表を作成し、SELECT
文をOracle Databaseで実行して、結果セットをTimesTen表にロードします。このコマンドの詳細は、「ttIsqlを使用した表の作成およびSQL問合せ結果のロード」を参照してください。
ttTableSchemaFromOraQueryGet
組込みプロシージャは、ユーザー指定のSELECT
文を評価して、TimesTenに表を作成するために実行できるCREATE TABLE
文を生成します。この文は、SELECT
文からの結果セットを適切に受け取ります。ttLoadFromOracle
組込みプロシージャは、Oracle DatabaseでSELECT
文を実行し、結果セットをTimesTen表にロードします。これらの組込みプロシージャの詳細は、「TimesTen組込みプロシージャを使用した表の推奨およびSQL問合せ結果のロード」を参照してください。
両方の方法では、次のことが必要です。
関係するTimesTenデータベースとOracle Databaseの両方が同じ各国語データベース文字セットで構成されている必要があります。
TimesTenデータベースに接続する場合、接続は、次のようにキャッシュ・グループを使用するときに必要な同じ接続属性を含んでいる必要があります。
TimesTenデータベースとOracle Databaseの両方で同じである必要があるユーザー名
ノート: SQL文がそのために実行されるように、データベースごとにユーザーに適切な権限が付与されている必要があります。 |
PWD
およびOraclePWD
接続属性で適切な各ユーザーの適切なパスワード
Oracle Databaseインスタンスを識別するOracleNetServiceName
接続属性
いずれの方法でも、ユーザーは次のものを指定します。
SQL問合せの結果がロードされるTimesTenデータベースの表名。表の所有者を指定しない場合、現行のユーザーが所有者として表が作成されます。表名は、SQL文が実行されるOracle Databaseの表名と同じである必要はありません。この表は主キーを必要としません。表がすでに存在している場合は、警告が発行され、取得された行が表に追加されます。
必要な行を取得するためにOracle Databaseに対して実行されるSQL SELECT
文。このSELECT
文内に指定する表は、表が現行のOracle Databaseユーザーのスキーマ内にある場合を除き、完全修飾する必要があります。問合せはパラメータ・バインディングを持つことができません。
SELECT
リストには、単一の列参照または列エイリアスを含める必要があります。たとえば、SELECT
リスト内の式は、列エイリアスとともに指定する必要があります。結果表内で列の重複を避けるために、列エイリアスを使用することもできます。たとえば、SELECT C1+1 FROM T1
を使用するかわりに、SELECT C1 + 1 C2 FROM T1
を使用します。これは、C2
という列を作成します。
TimesTenは、SELECT
文を評価し、列名、データ型およびNULL値可能情報を使用して、結果セットをロードする表をTimesTenに作成します。列名およびデータ型(同じまたはマップ済)は、SELECT
文に関係するOracle Databaseの表から取得されます。ただし、その他のOracle Database表定義情報(DEFAULT
値、主キー、外部キー関係など)は、TimesTen表にCREATE TABLE
文を作成する場合には使用されません。
ノート: サポートされていないデータ型が評価によって返される場合、または構文エラーなどでOracle Databaseで問合せが実行できない場合、警告がログに記録され、出力中のサポートされていない行にコメントが表示されます。ただし、データ型がTimesTenでサポートされていない場合、SELECT リストでデータ型を、TimesTenでサポートされているデータ型にキャストできます。 |
ロード・プロセスでは、TimesTen表の列のデータ型とサイズが結果セットのデータ型とサイズに一致することを確認しません。かわりに、挿入が試行され、列のデータ型がマップできない場合、またはSQL問合せからのOracle DatabaseデータがTimesTenの列サイズを超える場合は、TimesTenによってエラーが返されます。
256行ごとにロードは自動的にコミットされます。ロード時にエラーが発生した場合、ロードは終了しますが、コミットされたトランザクションはロールバックされません。Oracle Databaseから返されるエラーは、キャッシュ・グループを使用する場合と同じ方法で報告されます。
createandloadfromoraquery
コマンドおよびttLoadFromOracle
組込みプロシージャを使用して既存のTimesTen表にロードできるため、次の制限事項が適用されます。
システム表、ディクショナリ表、一時表、ビューのディテール表、マテリアライズド・ビュー表、表、またはキャッシュ・グループ内にすでにある表にはロードできません。また、表名にシノニムは使用できません。
外部キー制約の参照表(子表)である既存の表に結果セットをロードする場合、その制約は検証されません。その結果、親行を失っている行がロードされることがあります。そのかわり、表がロードされた後ですべての外部キーを確認する必要があります。ただし、ttLoadFromOracle
組込みプロシージャでは、オプション・パラメータをIgnoreDuplicates=Y
に設定することにより、制約違反を無視できます。
次の項では、個々の方法の詳細について説明します。
ttIsql
ユーティリティは、createandloadfromoraquery
コマンドを提供します。これは、表名、パラレル・スレッドの数、および入力パラメータとしてOracle Databaseで実行できるSELECT
文を取得します。これらのパラメータで、TimesTenは次のことを実行します。
SQL問合せを評価し、適切な表を作成します(まだ作成されていない場合)。そのとき、この表は提供された表名を持ち、列名はSQL問合せで指定された名前を使用し、結果データの取得元のOracle Database表と同じ(またはマップされた)データ型を持ちます。
Oracle Databaseで実行されるSQL問合せの結果をこの表にロードします。コールは、ロードされる行数を示す単一の数を返します。このコマンドに対する後続のコールは、取得された行を表に追加します。
ノート: 構文、要件、制限および必要な権限の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttIsql」のcreateandloadfromoraquery コマンドを参照してください。 |
次のttIsql
の例では、DSN、ユーザー名、このユーザーのTimesTenでのパスワード、およびOracle Databaseでの同じユーザー名のパスワードを指定して接続します。次に、createandloadfromoraquery
コマンドを実行して、SELECT
文を評価します。取得された行の列とデータ型と同じ列名とデータ型のemployees
表がTimesTenに作成されます。この表には、2つのパラレル・スレッドによってOracle Databaseから返された結果セットが移入されます。
% ttisql -connstr "DSN=database1;UID=hr;PWD=hr;OraclePWD=oracle" Copyright (c) 1996, 2020 Oracle. All rights reserved. Type ? or "help" for help, type "exit" to quit ttIsql connect -connstr "DSN=database1;UID=hr;PWD=********;OraclePWD=********"; Connection successful: DSN=database1;UID=hr; DataStore=/timesten/install/sample_db/DemoDataStore/database1; DatabaseCharacterSet=AL32UTF8; ConnectionCharacterSet=US7ASCII;DRIVER=/timesten/install/lib/libtten.so; PermSize=128;TempSize=64;OracleNetServiceName=inst1; (Default setting AutoCommit=1) Command> createandloadfromoraquery employees 2 SELECT * FROM hr.employees; Mapping query to this table: CREATE TABLE "HR"."EMPLOYEES" ( "EMPLOYEE_ID" number(6,0) NOT NULL, "FIRST_NAME" varchar2(20 byte), "LAST_NAME" varchar2(25 byte) NOT NULL, "EMAIL" varchar2(25 byte) NOT NULL, "PHONE_NUMBER" varchar2(20 byte), "HIRE_DATE" date NOT NULL, "JOB_ID" varchar2(10 byte) NOT NULL, "SALARY" number(8,2), "COMMISSION_PCT" number(2,2), "MANAGER_ID" number(6,0), "DEPARTMENT_ID" number(4,0) ) Table employees created < 107, 0, 0, Started=2015-09-11 21:12:45 (GMT); Ended=2015-09-11 21:12:46 (GMT); Load successfully completed; OracleSCN=779534; Rows Loaded=107; Errors=0; Statement=ttLoadFromOracle(HR, EMPLOYEES, SELECT * FROM hr.employees, 2) > 1 row found.
DESCRIBE
コマンドを実行して、新しい表を発行します。
ノート: この例では表の所有者が指定されていないため、デフォルトで現行のユーザーになります。この例では、現行のユーザーはhr です。 |
Command> DESCRIBE employees; Table HR.EMPLOYEES: Columns: EMPLOYEE_ID NUMBER (6) NOT NULL FIRST_NAME VARCHAR2 (20) INLINE LAST_NAME VARCHAR2 (25) INLINE NOT NULL EMAIL VARCHAR2 (25) INLINE NOT NULL PHONE_NUMBER VARCHAR2 (20) INLINE HIRE_DATE DATE NOT NULL JOB_ID VARCHAR2 (10) INLINE NOT NULL SALARY NUMBER (8,2) COMMISSION_PCT NUMBER (2,2) MANAGER_ID NUMBER (6) DEPARTMENT_ID NUMBER (4) 1 table found. (primary key columns are indicated with *) Command> SELECT * FROM employees; < 114, Den, Raphaely, DRAPHEAL, 515.127.4561, 2002-12-07 00:00:00, PU_MAN, 11000, <NULL>, 100, 30 > < 115, Alexander, Khoo, AKHOO, 515.127.4562, 2003-05-18 00:00:00, PU_CLERK, 3100, <NULL>, 114, 30 > … < 205, Shelley, Higgins, SHIGGINS, 515.123.8080, 2002-06-07 00:00:00, AC_MGR, 12008, <NULL>, 101, 110 > < 206, William, Gietz, WGIETZ, 515.123.8181, 2002-06-07 00:00:00, AC_ACCOUNT, 8300, <NULL>, 205, 110 > 107 rows found.
次の例は、createandloadfromoraquery
コマンドを使用してTimesTenにemp
表を作成し、この表に、Oracle Databaseのhr.employees
表のデータ(employee_id
が200未満)を、4つのスレッドによりパラレルに移入します。
Command> createandloadfromoraquery emp 4 SELECT * FROM hr.employees WHERE employee_id < 200; Mapping query to this table: CREATE TABLE "HR"."EMP" ( "EMPLOYEE_ID" number(6,0) NOT NULL, "FIRST_NAME" varchar2(20 byte), "LAST_NAME" varchar2(25 byte) NOT NULL, "EMAIL" varchar2(25 byte) NOT NULL, "PHONE_NUMBER" varchar2(20 byte), "HIRE_DATE" date NOT NULL, "JOB_ID" varchar2(10 byte) NOT NULL, "SALARY" number(8,2), "COMMISSION_PCT" number(2,2), "MANAGER_ID" number(6,0), "DEPARTMENT_ID" number(4,0) ) Table emp created< 100, 0, 0, Started=2015-09-11 21:30:56 (GMT); Ended=2015-09-11 21:30:57 (GMT); Load successfully completed; OracleSCN=780073; Rows Loaded=100; Errors=0; Statement=ttLoadFromOracle(HR, EMP, SELECT * FROM hr.employees WHERE employee_id < 200, 4) >1 row found.
そして、次のcreateandloadfromoraquery
は、idが200より大きいすべての従業員を取得し、結果セットはTimesTenの既存の表に追加されます。警告によって、表がすでに存在していて、6行がこの表に追加されたことが伝えられます。
Command> createandloadfromoraquery emp 4 SELECT * FROM hr.employees WHERE employee_id > 200; Warning 2207: Table HR.EMP already exists < 6, 0, 0, Started=2015-09-11 21:34:31 (GMT); Ended=2015-09-11 21:34:31 (GMT); Load successfully completed; OracleSCN=780176; Rows Loaded=6; Errors=0; Statement=ttLoadFromOracle(HR, EMP, SELECT * FROM hr.employees WHERE employee_id > 200, 4) > 1 row found.
パラレル・ロード処理は実行時間が長くなる場合があるため、処理を取り消す必要がある場合があります。パラレル・ロード処理の取消し方法の詳細は、「パラレル・ロード処理の取消し」を参照してください。
createandloadfromoraquery
コマンドが、TimesTen表を作成しOracle Databaseからの結果セットをこの表にロードするためのすべてのタスクを自動的に実行する一方で、次の2つの組込みプロシージャは同じ機能を次の2つのステップに分離します。
ttTableSchemaFromOraQueryGet
組込みプロシージャは、SQL問合せを評価し、発行を選択できるCREATE TABLE
SQL文を生成します。この文を発行するには、Oracle Databaseで問合せを発行するために必要なすべての権限をユーザーが持つ必要があります。これにより、実行なしで表構造を表示することができます。ただし、推奨されたCREATE TABLE
文を自分で発行する必要があります。
ttLoadFromOracle
組込みプロシージャは、バックエンドOracle DatabaseでSQL問合せを実行し、次に結果セットをTimesTen表にロードします。これは、結果をロードするTimesTen表名、必要な行を取得するためのOracle Database SQL SELECT
文、および表に結果セットをロードする際に並行して使用するパラレル・スレッドの数を必要とします。オプションで、エラーしきい値オプションを指定して、一意性の違反などの問題およびIgnoreDuplicates
オプションでのデータ変換の問題を回避できます。
ノート: 構文、要件、制限および必要な権限の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttTableSchemaFromOraQueryGet」および「ttLoadFromOracle」を参照してください。 |
次の例は、DSN、ユーザー名、このユーザーのTimesTenでのパスワード、Oracle Databaseでの同じ名前のユーザーのパスワード、およびOracle DatabaseインスタンスのOracleNetServiceName
を指定して接続します。次に、ttTableSchemaFromOraQueryGet
組込みプロシージャをコールして、SELECT
文を評価し、employees
表用に推奨されたCREATE TABLE
文を返します。次に、CREATE TABLE
文が実行されます。最後に、この例では、ttLoadFromOracle
組込みプロシージャをコールして、Oracle Databaseからの結果セットをemployees
表にロードします。ロードは、4つのスレッドによりパラレルに実行されます(デフォルト)。
ノート: autocommit がoffに設定されている場合、表のロード後に、ユーザーは手動でコミットまたはロールバックを行う必要があります。 |
% ttisql -connstr "DSN=database1;uid=hr;pwd=hr;OraclePWD=oracle" Copyright (c) 1996, 2020 Oracle. All rights reserved. Type ? or "help" for help, type "exit" to quit ttIsql connect -connstr "DSN=database1;UID=hr;PWD=********;OraclePWD=********"; Connection successful: DSN=database1;UID=hr; DataStore=/timesten/install/sample_db/DemoDataStore/database1; DatabaseCharacterSet=AL32UTF8; ConnectionCharacterSet=US7ASCII;DRIVER=/timesten/install/lib/libtten.so; PermSize=128;TempSize=64;OracleNetServiceName=inst1; Command> call ttTableSchemaFromOraQueryGet('hr','employees', 'SELECT * FROM hr.employees'); < CREATE TABLE "HR"."EMPLOYEES" ( "EMPLOYEE_ID" number(6,0) NOT NULL, "FIRST_NAME" varchar2(20 byte), "LAST_NAME" varchar2(25 byte) NOT NULL, "EMAIL" varchar2(25 byte) NOT NULL, "PHONE_NUMBER" varchar2(20 byte), "HIRE_DATE" date NOT NULL, "JOB_ID" varchar2(10 byte) NOT NULL, "SALARY" number(8,2), "COMMISSION_PCT" number(2,2), "MANAGER_ID" number(6,0), "DEPARTMENT_ID" number(4,0) ) > 1 row found. Command> CREATE TABLE "HR"."EMPLOYEES" ( "EMPLOYEE_ID" number(6,0) NOT NULL, "FIRST_NAME" varchar2(20 byte), "LAST_NAME" varchar2(25 byte) NOT NULL, "EMAIL" varchar2(25 byte) NOT NULL, "PHONE_NUMBER" varchar2(20 byte), "HIRE_DATE" date NOT NULL, "JOB_ID" varchar2(10 byte) NOT NULL, "SALARY" number(8,2), "COMMISSION_PCT" number(2,2), "MANAGER_ID" number(6,0), "DEPARTMENT_ID" number(4,0) ); Command> call ttLoadFromOracle ('HR','EMPLOYEES','SELECT * FROM HR.EMPLOYEES'); < 107, 0, 0, Started=2015-09-11 21:52:51 (GMT); Ended=2015-09-11 21:52:51 (GMT); Load successfully completed; OracleSCN=780552; Rows Loaded=107; Errors=0; Statement=ttLoadFromOracle(HR, EMPLOYEES, SELECT * FROM HR.EMPLOYEES, 4) > 1 row found. Command> SELECT * FROM hr.employees; < 100, Steven, King, SKING, 515.123.4567, 2003-06-17 00:00:00, AD_PRES, 24000, <NULL>, <NULL>, 90 > < 101, Neena, Kochhar, NKOCHHAR, 515.123.4568, 2005-09-21 00:00:00, AD_VP, 17000, <NULL>, 100, 90 > ... < 205, Shelley, Higgins, SHIGGINS, 515.123.8080, 2002-06-07 00:00:00, AC_MGR, 12008, <NULL>, 101, 110 > < 206, William, Gietz, WGIETZ, 515.123.8181, 2002-06-07 00:00:00, AC_ACCOUNT, 8300, <NULL>, 205, 110 > 107 rows found.
次の例では、Oracle Databaseに表を作成しますが、ここでemployee_id
はPRIMARY KEY
制約のある列で、email
はUNIQUE
制約のある列です。
SQL> CREATE TABLE employees (employee_id NUMBER(6) PRIMARY KEY, first_name VARCHAR2(20), last_name VARCHAR2(25) NOT NULL, email VARCHAR2(25) NOT NULL UNIQUE, phone_number VARCHAR2(20), hire_date DATE NOT NULL, job_id VARCHAR2(10) NOT NULL, salary NUMBER(8,2), commission_pct NUMBER(2,2), manager_id NUMBER(6), department_id NUMBER(4)); Table created.
次に、次のttTableSchemaFromOraQueryGet
組込みプロシージャがSQL問合せを評価し、CREATE TABLE
SQL文を生成します。推奨されたCREATE TABLE
SQL文では、PRIMARY KEY
制約およびUNIQUE
制約はOracle Databaseから継承されないことに注意してください。NULL値可能制約はOracle Databaseから継承されます。これはcreateandloadfromoraquery
コマンドにも適用されます。
Command> call ttTableSchemaFromOraQueryGet ('hr', 'employees', 'SELECT * FROM hr.employees'); < CREATE TABLE "HR"."EMPLOYEES" ( "EMPLOYEE_ID" number(6,0) NOT NULL, "FIRST_NAME" varchar2(20 byte), "LAST_NAME" varchar2(25 byte) NOT NULL, "EMAIL" varchar2(25 byte) NOT NULL, "PHONE_NUMBER" varchar2(20 byte), "HIRE_DATE" date NOT NULL, "JOB_ID" varchar2(10 byte) NOT NULL, "SALARY" number(8,2), "COMMISSION_PCT" number(2,2), "MANAGER_ID" number(6,0), "DEPARTMENT_ID" number(4,0) ) > 1 row found.
パラレル・ロード処理は実行時間が長くなる場合があるため、処理を取り消す必要がある場合があります。パラレル・ロード処理の取消し方法の詳細は、「パラレル・ロード処理の取消し」を参照してください。
SQLCancel(
hstmt
)
ODBC関数(ODBC 2.5およびODBC 3.5に適用される)を使用して、またはttIsql
ユーティリティで[Ctrl]キーを押したまま[C]キーを押すことによって、パラレル・ロード処理を実行しているすべてのスレッドを取り消して、完全に停止できます。詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』のTimesTen ODBCのサポートに関する項およびこのガイドの「ODBC関数の取消し」を参照してください。
パラレル・ロード処理は定期的にコミットされるため、成功した処理はロールバックされません。cancelコマンドを発行すると、次の時点でTimesTenは処理を取り消します。
挿入スレッドが生成される前。
挿入バッチのコミット後(256行ごと)。
メイン・スレッドがOracle Databaseからのフェッチを完了した後。
取り消したパラレル・ロード処理を再試行するには、重複行を避けるためにTimesTenデータベースから前回挿入した行を削除します。
次の項では、問合せオプティマイザ計画、SQLコマンド・キャッシュ内のコマンド、またはSQLコマンド・キャッシュ内のコマンドに関する問合せ計画を表示する方法について説明します。
組込みshowplan
コマンドを使用すると、TimesTenで問合せの実行に使用される問合せオプティマイザ計画が表示されます。また、ttIsql
には、この問合せオプティマイザ計画を変更するための組込み問合せオプティマイザ・ヒント・コマンドが用意されています。showplan
コマンドと、次に示すttIsql
コマンドを組み合せて使用すると、最適な実行計画を設計できます。TimesTen問合せオプティマイザの詳細は、「TimesTen問合せオプティマイザ」を参照してください。
showplan
コマンドおよび問合せオプティマイザ・ヒント・コマンドを使用する場合は、自動コミット機能が無効である必要があります。自動コミットを無効にするには、ttIsql
のautocommit
コマンドを使用します。
次の例では、これらのコマンドを使用して問合せオプティマイザの実行計画を変更する方法を示します。
Command> CREATE TABLE T1 (A NUMBER); Command> CREATE TABLE T2 (B NUMBER); Command> CREATE TABLE T3 (C NUMBER); Command> INSERT INTO T1 VALUES (3); 1 row inserted. Command> INSERT INTO T2 VALUES (3); 1 row inserted. Command> INSERT INTO T3 VALUES (3); 1 row inserted. Command> INSERT INTO T1 VALUES (4); 1 row inserted. Command> INSERT INTO T2 VALUES (5); 1 row inserted. Command> INSERT INTO T3 VALUES (6); 1 row inserted. Command> autocommit 0; Command> showplan; Command> SELECT * FROM T1, T2, T3 WHERE A=B AND B=C AND A=B; Query Optimizer Plan: STEP: 1 LEVEL: 3 OPERATION: TblLkSerialScan TBLNAME: T2 IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> STEP: 2 LEVEL: 3 OPERATION: TblLkSerialScan TBLNAME: T3 IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: T2.B = T3.C STEP: 3 LEVEL: 2 OPERATION: NestedLoop TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> STEP: 4 LEVEL: 2 OPERATION: TblLkSerialScan TBLNAME: T1 IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: T1.A = T2.B AND T1.A = T2.B STEP: 5 LEVEL: 1 OPERATION: NestedLoop TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> < 3, 3, 3 > 1 row found. Command> trytbllocks 0; Command> tryserial 0; Command> SELECT * FROM T1, T2, T3 WHERE A=B AND B=C AND A=B; Query Optimizer Plan: STEP: 1 LEVEL: 3 OPERATION: TmpRangeScan TBLNAME: T2 IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> STEP: 2 LEVEL: 3 OPERATION: RowLkSerialScan TBLNAME: T3 IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: T2.B = T3.C STEP: 3 LEVEL: 2 OPERATION: NestedLoop TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> STEP: 4 LEVEL: 2 OPERATION: RowLkSerialScan TBLNAME: T1 IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: T1.A = T2.B AND T1.A = T2.B STEP: 5 LEVEL: 1 OPERATION: NestedLoop TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> < 3, 3, 3 > 1 row found.
この例では、3つの表に対して問合せが実行され、問合せオプティマイザの計画が表示されています。1つ目のバージョンの問合せでは、問合せオプティマイザのデフォルトの実行計画が使用されています。ただし、2つ目のバージョンでは、trytbllocks
およびtryserial
のttIsql
組込みヒント・コマンドを使用して問合せオプティマイザの計画が変更されています。2つ目のバージョンの問合せでは、シリアル・スキャンおよびネステッド・ループ結合ではなく、一時索引スキャン、シリアル・スキャンおよびネステッド・ループが使用されています。
このように、showplan
コマンドをttIsql
の組込み問合せオプティマイザ・ヒント・コマンドと組み合せて使用すると、アプリケーション要件を満たすために使用する実行計画を迅速に決定できます。
次の項では、コマンドおよびその実行計画の表示方法について説明します。
ttIsql
のcmdcache
コマンドで、ttSqlCmdCacheInfo
組込みプロシージャが起動され、TimesTen SQLコマンド・キャッシュの内容が表示されます。このプロシージャの詳細は、「SQLコマンド・キャッシュに格納されたコマンドの表示」を参照してください。
パラメータなしでcmdcache
コマンドを実行する場合、SQLコマンド・キャッシュの内容がすべて表示されます。ttSqlCmdCacheInfo
組込みプロシージャと同様、コマンドIDを指定して、表示する特定のコマンドを指定できます。
また、特定の所有者または問合せテキストと一致するコマンドのみが表示されるように、ttIsql
のcmdcache
コマンドで結果をフィルタ処理できます。
cmdcache
コマンドの構文は次のとおりです。
cmdcache [[by {sqlcmdid | querytext | owner}] <query_substring>
owner
パラメータを指定した場合、結果が所有者によりフィルタ処理され、<query_substring>
により識別され、戻された各コマンドに表示されます。querytext
パラメータを指定した場合、<query_substring>
内で指定された部分文字列を含む問合せがすべて表示されるように結果がフィルタ処理されます。cmdcache
の<query_substring>
など、<query_substring>
のみを指定した場合、コマンドでは<query_substring>
で問合せテキストがフィルタ処理されます。
ttIsql
のexplain
コマンドでは、個々のコマンドに関する問合せ計画を表示します。
SQLコマンド・キャッシュからコマンドIDを指定した場合、explain
コマンドによりttSqlCmdQueryPlan
組込みプロシージャが起動され、TimesTen SQLコマンド・キャッシュに格納された個々のコマンドに関する問合せ計画が表示されます。実行計画を書式設定された方法で表示する場合は、ttSqlCmdQueryPlan
組込みプロシージャをコールするかわりにexplain
コマンドを実行します。両方では同じ情報が得られますが、ttSqlCmdQueryPlan
組込みプロシージャではデータはRAWデータ形式で得られます。ttSqlCmdQueryPlan
組込みプロシージャの詳細は、「SQLコマンド・キャッシュに格納されているコマンドに関連付けられた問合せ計画の表示」を参照してください。
SQL文または履歴項目番号を指定した場合、そのSQL文に関する実行計画を表示するために必要なSQL文をexplain
コマンドでコンパイルします。
explain
コマンドの構文は次のとおりです。
explain [plan for] {[<Connid>.]<ttisqlcmdid> | sqlcmdid <sqlcmdid> | <sqlstmt> | !<historyitem>}
ttSqlCmdQueryPlan
組込みプロシージャと同様、コマンドIDを提示して、表示する特定のコマンドを指定できます。コマンドIDは、「SQLコマンド・キャッシュに格納されたコマンドの表示」で説明されているとおり、cmdcache
コマンドで取得できます。
次の例に、38001456
というコマンドIDに関する実行計画を示します。
Command> EXPLAIN SQLCMDID 38001456; Query Optimizer Plan: Query Text: select * from all_objects where object_name = 'DBMS_OUTPUT' STEP: 1 LEVEL: 12 OPERATION: TblLkRangeScan TABLENAME: OBJ$ TABLEOWNERNAME: SYS INDEXNAME: USER$.I_OBJ INDEXEDPRED: NONINDEXEDPRED: (RTRIM( NAME )) = DBMS_OUTPUT;NOT( 10 = TYPE#) ; ( FLAGS ^ 128 = 0) ; STEP: 2 LEVEL: 12 OPERATION: RowLkRangeScan TABLENAME: OBJAUTH$ TABLEOWNERNAME: SYS INDEXNAME: OBJAUTH$.I_OBJAUTH1 INDEXEDPRED: ( (GRANTEE#=1 ) OR (GRANTEE#=10 ) ) AND ( (PRIVILEGE#=8 ) ) NONINDEXEDPRED: OBJ# = OBJ#; STEP: 3 LEVEL: 11 OPERATION: NestedLoop(Left OuterJoin) TABLENAME: TABLEOWNERNAME: INDEXNAME: INDEXEDPRED: NONINDEXEDPRED: ... STEP: 21 LEVEL: 1 OPERATION: Project TABLENAME: TABLEOWNERNAME: INDEXNAME: INDEXEDPRED: NONINDEXEDPRED: Command>
また、ttIsql
のexplain
コマンドで、指定したSQL問合せに関する実行計画を生成できます。たとえば、SELECT * FROM employees;
というSQL問合せに関する実行計画は次のようになります。
Command> EXPLAIN SELECT * FROM employees; Query Optimizer Plan: STEP: 1 LEVEL: 1 OPERATION: TblLkRangeScan TBLNAME: EMPLOYEES IXNAME: EMP_NAME_IX INDEXED CONDITION: <NULL> NOT INDEXED: <NULL>
また、コマンド履歴をもとに実行計画を取得することもできます。次の例では、以前に実行したSQL文の実行計画を、履歴コマンドIDを使用して表示する方法を示します。
Command> SELECT * FROM all_objects WHERE object_name = 'DBMS_OUTPUT'; < SYS, DBMS_OUTPUT, <NULL>, 241, <NULL>, PACKAGE, 2009-10-13 10:41:11, 2009-10-13 10:41:11, 2009-10-13:10:41:11, VALID, N, N, N, 1, <NULL> > < PUBLIC, DBMS_OUTPUT, <NULL>, 242, <NULL>, SYNONYM, 2009-10-13 10:41:11, 2009-10-13 10:41:11, 2009-10-13:10:41:11, INVALID, N, N, N, 1, <NULL> > < SYS, DBMS_OUTPUT, <NULL>, 243, <NULL>, PACKAGE BODY, 2009-10-13 10:41:11, 2009-10-13 10:41:11, 2009-10-13:10:41:11, VALID, N, N, N, 2, <NULL> > 3 rows found. Command> HISTORY; 1 connect "DSN=cache"; 2 help cmdcache; 3 cmdcache; 4 explain select * from dual; 5 select * from all_objects where object_name = 'DBMS_OUTPUT'; Command> EXPLAIN !5; Query Optimizer Plan: STEP: 1 LEVEL: 10 OPERATION: TblLkRangeScan TBLNAME: SYS.OBJ$ IXNAME: USER$.I_OBJ INDEXED CONDITION: <NULL> NOT INDEXED: O.FLAGS & 128 = 0 AND CAST(RTRIM (O.NAME) AS VARCHAR2(30 BYTE) INLINE) = 'DBMS_OUTPUT' AND O.TYPE# <> 10 STEP: 2 LEVEL: 10 OPERATION: RowLkRangeScan TBLNAME: SYS.OBJAUTH$ IXNAME: OBJAUTH$.I_OBJAUTH1 INDEXED CONDITION: (OA.GRANTEE# = 1 OR OA.GRANTEE# = 10) AND OA.PRIVILEGE# = 8 NOT INDEXED: OA.OBJ# = O.OBJ# STEP: 3 LEVEL: 9 OPERATION: NestedLoop(Left OuterJoin) TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: <NULL> STEP: 4 LEVEL: 9 OPERATION: TblLkRangeScan TBLNAME: SYS.OBJAUTH$ IXNAME: OBJAUTH$.I_OBJAUTH1 INDEXED CONDITION: (OBJAUTH$.GRANTEE# = 1 OR OBJAUTH$.GRANTEE# = 10) AND (OBJAUTH$.PRIVILEGE# = 2 OR OBJAUTH$.PRIVILEGE# = 3 OR OBJAUTH$.PRIVILEGE# = 4 OR OBJAUTH$.PRIVILEGE# = 5 OR OBJAUTH$.PRIVILEGE# = 8) NOT INDEXED: O.OBJ# = OBJAUTH$.OBJ# ... STEP: 19 LEVEL: 1 OPERATION: NestedLoop(Left OuterJoin) TBLNAME: <NULL> IXNAME: <NULL> INDEXED CONDITION: <NULL> NOT INDEXED: O.OWNER# = 1 OR (O.TYPE# IN (7,8,9) AND (NOT( ISNULLROW (SYS.OBJAUTH$.ROWID)) OR NOT( ISNULLROW (SYS.SYSAUTH$.ROWID)))) OR (O.TYPE# IN (1,2,3,4,5) AND NOT( ISNULLROW (SYS.SYSAUTH$.ROWID))) OR (O.TYPE# = 6 AND NOT( ISNULLROW (SYS.SYSAUTH$.ROWID))) OR (O.TYPE# = 11 AND NOT( ISNULLROW (SYS.SYSAUTH$.ROWID))) OR (O.TYPE# NOT IN (7,8,9,11) AND NOT( ISNULLROW (SYS.OBJAUTH$.ROWID))) OR (O.TYPE# = 28 AND NOT( ISNULLROW (SYS.SYSAUTH$.ROWID))) OR (O.TYPE# = 23 AND NOT( ISNULLROW (SYS.SYSAUTH$.ROWID))) OR O.OWNER# = 10
ttIsqlのODBC関数では、次の操作を実行できます。
一般的なODBC関数コールの実行に必要な時間に関する情報は、ttIsql
のtiming
コマンドを使用して表示できます。タイミング機能が有効になっている場合は、多くの組込みttIsql
コマンドによって、実行されるttIsql
コマンドに対応する主要ODBC関数コールの実行経過時間がレポートされます。
たとえば、ttIsql
のconnect
コマンドの実行時には、いくつかのODBC関数コールが実行されますが、connect
に関連付けられている主要ODBC関数コールはSQLDriverConnect
です。この関数コールは、次に示すように測定およびレポートされます。
Command> timing 1; Command> connect "DSN=MY_DSN"; Connection successful: DSN=MY_DSN;DataStore=/disk1/databases/MY_DSN; DRIVER=E:\WINNT\System32\TTdv181.dll; (Default setting AutoCommit=1) Execution time (SQLDriverConnect) = 1.2626 seconds. Command>
前述の例では、SQLDriverConnect
コールの実行に約1.26秒かかりました。
問合せを測定するtiming
コマンドを使用すると、問合せの実行に必要な時間および問合せ結果のフェッチに必要な時間が測定されます。問合せ結果を書式設定し表示する時間の測定を回避するには、問合せを実行する前に冗長性レベルを0(ゼロ)に設定します。
Command> timing 1; Command> verbosity 0; Command> SELECT * FROM t1; Execution time (SQLExecute + FetchLoop) = 0.064210 seconds. Command>
WHENEVER
SQLERROR
コマンドを発行すると、SQLエラーの発生時の対処法を指示できます。WHENEVER
SQLERROR
は、SQL文、SQLスクリプトまたはPL/SQLブロックのリカバリ・アクションの設定に使用できます。
ttIsqlの使用中にSQLエラーが発生すると、デフォルトでは、エラー情報が表示されてttIsqlが続行されるので、ユーザーは新しいコマンドを入力できます。デフォルト設定は、WHENEVER SQLERROR CONTINUE NONE
です。エラーが発生するたびにttIsqlを終了することを指定することも可能ですが、これは対話的に使用する場合またはSQLスクリプトまたはPL/SQLブロックの実行する場合、は最良の対処法ではない場合があります。
ノート: WHENEVER SQLERROR コマンドの構文については、『Oracle TimesTen In-Memory Databaseリファレンス』のttIsqlに関する項を参照してください。 |
次の例では、EXIT
を使用しエラー・コード255を返し、ttIsqlを終了する前に現在の接続にすべての変更を保存するようCOMMIT
文が実行されます。この例では、Cシェルecho $status
コマンドを使用してエラー・コードを取得します。
Command> WHENEVER SQLERROR EXIT 255 COMMIT; Command> SELECT emp_id FROM employee; 2206: Table PAT.EMPLOYEE not found WHENEVER SQLERROR exiting. % echo $status 255
次の例では、エラーが発生した際に、WHENEVER
SQLERROR
コマンドによってttIsqlコマンドまたはTimesTenユーティリティを実行する方法を示します(エラーが別のTimesTenユーティリティで発生した場合もこの方法を使用できます)。
Command> WHENEVER SQLERROR EXEC "DSSIZE;CALL TTSQLCMDCACHEINFOGET();"; Command> call TTCACHEPOLICYGET; 5010: No OracleNetServiceName specified in DSN The command failed. DSSIZE; PERM_ALLOCATED_SIZE: 32768 PERM_IN_USE_SIZE: 9204 PERM_IN_USE_HIGH_WATER: 9204 TEMP_ALLOCATED_SIZE: 40960 TEMP_IN_USE_SIZE: 7785 TEMP_IN_USE_HIGH_WATER: 7848 CALL TTSQLCMDCACHEINFOGET(); CMDCOUNT, FREEABLECOUNT, SIZE < 10, 7, 41800 > 1 row found.
次に、SUPPRESS
コマンドのオプションを示します。これでは、すべてのエラー・メッセージが抑止され、次のコマンドに進みます。この例では、別のコマンド・オプション(この場合はEXIT
コマンド)を使用して、既存の接続でエラー・メッセージを再度表示できることを示しています。
Command> WHENEVER SQLERROR SUPPRESS; Command> SELECT *; Command> WHENEVER SQLERROR EXIT; Command> SELECT *; 1001: Syntax error in SQL statement before or at: "", character position: 9 select * ^ WHENEVER SQLERROR exiting.
次の例では、SQLエラーが発生したときに戻される値であるretcode
というバインド変数を設定します。
Command> VARIABLE retcode NUMBER := 111; Command> WHENEVER SQLERROR EXIT :retcode; Command> INSERT INTO EMPLOYEES VALUES ( 202, 'Pat', 'Fay', 'PFAY', '603.123.6666', TO_DATE ('17-AUG-1997', 'DD-MON-YYYY'), 'MK_REP', 6000, NULL, 201, 20); 907: Unique constraint (EMPLOYEES on PAT.EMPLOYEES) violated at Rowid <BMUFVUAAACOAAAAIiB> WHENEVER SQLERROR exiting. % echo $status; 111