TimesTen Scaleoutでのみサポートされているオプティマイザ・ヒント
これらのオプティマイザ・ヒントは、TimesTen Scaleoutのみでサポートされています。これらは文レベルおよび接続レベルで有効です。
接続レベルのヒントの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の「OptimizerHint」、文レベルのオプティマイザ・ヒントの詳細は、このマニュアルの「文レベルのオプティマイザ・ヒント」を参照してください。
TT_GridQueryExecオプティマイザ・ヒント
TT_GridQueryExecオプティマイザ・ヒントを使用すると、問合せによって、ローカル要素から、またはすべての要素から(K-safetyが2に設定されている場合はレプリカ・セット内の要素を含む)のデータが返されるようにすることを指定できます。
このヒントを指定しない場合、問合せは1つの論理データ領域で実行されます。ローカルでもグローバルでもありません。これは、問合せを計算するためにデータの1つの完全なコピーのみが使用されることを意味します。複数の結果を取得することが正しい結果を取得するよりも重要な場合(1つ以上のレプリカ・セットを使用できない場合など)、このヒントを使用します。このヒントの有効なオプションは、LOCALおよびGLOBALです。
詳細は、次を参照してください。
-
このヒントの使用方法は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』の「TT_GridQueryExec」を参照してください。
-
このヒントを接続レベルで使用する方法は、『Oracle TimesTen In-Memory Databaseリファレンス』の「OptimizerHint」を参照してください。
-
このヒントを文レベルで使用する方法は、「文レベルのオプティマイザ・ヒント」を参照してください。
この例は、dual表に対するTT_GridQueryExec(GLOBAL)ヒントを使用して、すべての要素、レプリカ・セットおよびデータ領域のIDを判別する方法を示しています。
Command> SELECT /*+TT_GridQueryExec(GLOBAL)*/ elementId#, replicasetId#,
dataspaceId# FROM dual ORDER BY elementId#,replicasetId#,dataspaceId#;
ELEMENTID#, REPLICASETID#, DATASPACEID#
< 1, 1, 1 >
< 2, 1, 2 >
< 3, 2, 1 >
< 4, 2, 2 >
< 5, 3, 1 >
< 6, 3, 2 >
6 rows found.
他の例は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』の「TT_GridQueryExec」を参照してください。
TT_PartialResultオプティマイザ・ヒント
TT_PartialResultオプティマイザ・ヒントを使用すると、一部のデータを使用できない場合、問合せによって結果の一部が返されるようにするかどうかを指定できます。
レプリカ・セット内のすべての要素を使用できない場合に、問合せによって結果の一部が返されるようにするには、TT_PartialResult(1)を使用します。
レプリカ・セット内のすべての要素を使用できず、必要なデータを使用できない場合に、問合せによってエラーが返されるようにするには、TT_PartialResult(0)を使用します。各レプリカ・セットの少なくとも1つの要素が使用可能であるか、問合せに必要なデータが使用可能な場合、オプティマイザは問合せ結果を正常に返し、エラーは発生しません。
デフォルトは、TT_PartialResult(0)です。
詳細は、次を参照してください。
-
このヒントの使用方法と例は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』の「TT_PartialResult」を参照してください。
-
このヒントを接続レベルで使用する方法は、『Oracle TimesTen In-Memory Databaseリファレンス』の「OptimizerHint」を参照してください。
-
このヒントを文レベルで使用する方法は、「文レベルのオプティマイザ・ヒント」を参照してください。
TT_CommitDMLOnSuccessオプティマイザ・ヒント
TT_CommitDMLOnSuccessヒントは、コミット操作をDML実行の一部として使用可能または使用不可にするために使用されます。
-
文レベルでは、
TT_CommitDMLOnSuccessは、DML操作の実行時にDML文(DELETE、INSERT、INSERT... SELECTおよびUPDATE)でトランザクションのコミット動作を有効または無効にするために使用します。INSERT...SELECT文では、TT_CommitDMLOnSuccessはSELECTキーワードの後に指定します。TT_CommitDMLOnSuccessはDML操作のみで有効です。問合せやDDL操作では無効となり、DML以外の文で指定した場合は無視され、エラーは戻されません。構文およびセマンティクスの詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。 -
接続レベルでも、
TT_CommitDMLOnSuccessは、DML操作の実行時にトランザクションのコミットの動作を有効または無効にするために使用します。ただし、TT_CommitDMLOnSuccessはOptimizerHint接続属性に対するパラメータとして指定します。接続レベルでTT_CommitDMLOnSuccessを使用する方法は、『Oracle TimesTen In-Memory Databaseリファレンス』の「OptimizerHint」を参照してください。
どちらのレベルも、有効なオプションは0と1です。TT_CommitDMLOnSuccessを指定しない場合、標準のコミット動作に変更はありません。優先順位は、文レベル、接続レベルの順です。
文レベルのTT_CommitDMLOnSuccessコミット動作は次のとおりです。
-
ヒントが指定されたDML文が正常に実行された場合、
TT_CommitDMLOnSuccess(1)は現在のトランザクションをコミットします。コミット時にオープン・カーソルがある場合、すべてのカーソルがクローズされ、トランザクションがコミットされます。このヒントを含む文が失敗した場合、トランザクションはコミットされません。 -
ヒントが指定されたDML文が正常に実行された場合、
TT_CommitDMLOnSuccess(0)は現在のトランザクションのコミットを無効にします。
表6-4に、TT_CommitDMLOnSuccessを設定しない場合と、文レベルおよび接続レベルでTT_CommitDMLOnSuccessを0および1に設定した場合のコミット動作を示します。この表は、autocommitを0に設定した場合のコミット動作を示しています。
表6-5に、TT_CommitDMLOnSuccessを設定しない場合と、文レベルおよび接続レベルでTT_CommitDMLOnSuccessを0および1に設定した場合のコミット動作を示します。この表は、autocommitを1に設定した場合のコミット動作を示しています。
表6-4 TT_CommitDMLOnSuccessのコミット動作: 自動コミット0
| 空白 | 接続レベルで未設定 | 接続レベルで0に設定 | 接続レベルで1に設定 |
|---|---|---|---|
|
文レベルで未設定 |
|
|
|
|
文レベルで0に設定 |
|
|
|
|
文レベルで1に設定 |
|
|
|
表6-5 TT_CommitDMLOnSuccessのコミット動作: 自動コミット1
| 空白 | 接続レベルで未設定 | 接続レベルで0に設定 | 接続レベルで1に設定 |
|---|---|---|---|
|
文レベルで未設定 |
|
|
|
|
文レベルで0に設定 |
|
|
|
|
文レベルで1に設定 |
|
|
|
詳細は、次を参照してください。
-
詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』の「TT_CommitDMLOnSuccessヒントの使用方法」を参照してください。
-
接続レベルで
TT_CommitDMLOnSuccessを使用する方法は、『Oracle TimesTen In-Memory Databaseリファレンス』の「OptimizerHint」を参照してください。 -
文レベルの
TT_CommitDMLOnSuccessの構文の詳細は、「文レベルのオプティマイザ・ヒント」。
次の例は、TT_CommitDMLOnSuccessオプティマイザ・ヒントの使用例を示しています。
TT_CommitDMLOnSuccessを1に設定
この例では、最初にmytable表を作成します。次に、autocommitを0に設定し、mytable表に行を挿入します。2番目の接続(conn2)がデータベースに接続し、mytable表に対してSELECT問合せを発行します。問合せによって0行が戻されます。ttIsql useコマンドを使用すると、アプリケーションは最初の接続(database1)に戻され、2番目のINSERT操作が発行されて、文レベルでTT_CommitDMLOnSuccessが1に設定されます。2番目のttIsql useコマンドは、アプリケーションをconn2接続に戻します。SELECT問合せは、2つの行がmytable表に挿入されたことを示します。この例は、TT_CommitDMLOnSuccess(1)を発行すると、2番目のINSERT操作(ヒントを設定)が正常に実行された後、トランザクションがコミットされることを示しています。
Command> CREATE TABLE mytable (col1 TT_INTEGER, col2 VARCHAR2(4000)); Command> autocommit 0; Command> INSERT INTO mytable VALUES (10, 'ABC'); 1 row inserted.
2番目の接続(conn2)を確立します
Command> connect as conn2; Using the connection string of connection database1 to connect... ... (Default setting AutoCommit=1)
SELECT問合せを発行し、autocommitが0に設定されているため、0行となることが予測されます。
conn2: Command> SELECT * FROM mytable; 0 rows found.
最初の接続(database1)に戻り、TT_CommitDMLOnSuccessを1に設定してINSERT操作を発行します。
conn2: Command> use database1;
database1: Command> INSERT /*+TT_CommitDMLOnSuccess(1)*/
INTO mytable VALUES (10, 'ABC');
1 row inserted.
2番目の接続(conn2)に戻り、SELECTが問合せを発行します。(2つのINSERT文により) 2行を予測します。(TT_CommitDMLOnSuccess文レベルのヒントが1に設定され、2つのINSERT操作が正常に実行されたため、トランザクションがコミットされます。)
database1: Command> use conn2 conn2: Command> SELECT * FROM mytable; < 10, ABC > < 10, ABC > 2 rows found.
接続レベルでのTT_CommitDMLOnSuccessの使用
この例では、最初にmytable表を作成します。次に、PL/SQLを使用して表に1000行を挿入します。データベースへの2番目の接続(conn2)があり、この接続はTT_CommitDMLOnSuccessを接続レベルで1に設定して接続します。文レベルと接続レベルの両方のTT_CommitDMLOnSuccessの動作を示す様々な操作が実行されます。
Command> CREATE TABLE mytable (col1 TT_INTEGER NOT NULL PRIMARY KEY,
col2 VARCHAR2 (4000));
Command> BEGIN
FOR i in 1..1000
LOOP
INSERT INTO mytable VALUES (i,i);
END LOOP;
END;
/
PL/SQL procedure successfully completed.
2番目の接続(conn2)を確立し、TT_CommitDMLOnSuccessを接続レベルで1に設定して接続します。
Command> CONNECT adding "OptimizerHint=TT_CommitDMLOnSuccess(1)" as conn2; Connection successful: ...
autocommitを0に設定し、DELETE操作を発行します。
conn2: Command> autocommit 0; conn2: Command> DELETE FROM mytable WHERE col1=1000; 1 row deleted.
元の接続(database1)に戻り、SELECT問合せを発行し、DELETE操作がコミットされたかどうかを確認します。TT_CommitDMLOnSuccessが接続レベルで1に設定されているため、操作はコミットされました。
conn2: Command> use database1; database1: Command> SELECT * FROM mytable WHERE col1=1000; 0 rows found.
2番目の接続(conn2)に戻り、INSERT操作を発行します。次に、元の接続(database1)に戻ります。INSERT操作を含むトランザクションはコミットされました。
database1: Command> use conn2; conn2: Command> INSERT INTO mytable VALUES (1000,1000); 1 row inserted. conn2: Command> use database1 database1: Command> SELECT * FROM mytable WHERE col1=1000; < 1000, 1000 > 1 row found.
2番目の接続(conn2)に戻り、DELETE操作を発行した後、INSERT操作を発行し、次にTT_CommitDMLOnSuccessを文レベルで0に設定した2番目のINSERT操作を発行します(2番目のINSERT操作)。
database1: Command> use conn2;
conn2: Command> DELETE FROM mytable WHERE col1=1000;
1 row deleted.
conn2: Command> INSERT INTO mytable VALUES (1001,1001);
1 row inserted.
conn2: Command> INSERT /*+TT_CommitDMLOnSuccess(0)*/ INTO mytable
VALUES (1002,1002);
1 row inserted.
SELECT問合せを発行し、問合せの結果を確認します。1つのDELETE操作と2つのINSERT操作が正常に実行されました。
conn2: Command> SELECT * FROM mytable where col1 >= 1000; < 1001, 1001 > < 1002, 1002 > 2 rows found.
元の接続(database1)に戻り、同じSELECT問合せを発行します。1つのDELETE文と最初のINSERT操作がコミットされたことを確認します。これは、TT_CommitDMLOnSuccessが接続レベルで1に設定されているためです。この2番目のINSERT文のTT_CommitDMLOnSuccessが0に設定されているため、2番目のINSERT文はコミットされませんでした。
conn2: Command> use database1; database1: Command> SELECT * FROM mytable where col1 >= 1000; < 1001, 1001 > 1 row found.
2番目の接続(conn2)に戻り、3番目のINSERT操作を発行します。SELECT問合せを発行し、結果を確認します。
database1: Command> use conn2; conn2: Command> INSERT INTO mytable VALUES (1003,1003); 1 row inserted. conn2: Command> SELECT * FROM mytable where col1 >= 1000 ORDER BY col1; < 1001, 1001 > < 1002, 1002 > < 1003, 1003 > 3 rows found.
元の接続(database1)に戻り、同じSELECT問合せを発行します。結果がconn2接続と同じであることに注意してください。TT_CommitDMLOnSuccessが接続レベルで1に設定され、2番目と3番目のINSERT操作が正常に実行されたため、トランザクションはコミットされます。
conn2: Command> use database1 database1: Command> SELECT * FROM mytable where col1 >= 1000 ORDER BY col1; < 1001, 1001 > < 1002, 1002 > < 1003, 1003 > 3 rows found.