クライアント/サーバーのチューニング
クライアント/サーバーをチューニングできます。
次の各項では、クライアント/サーバーのチューニングに関するヒントを示します:
クライアント/サーバーのパフォーマンスの診断
パフォーマンスへの影響: 不定
SYS.SYSTEMSTATS
表に記録される統計で分析できます。
これらの統計は、ttStats
ユーティリティまたはTT_STATS
PL/SQLパッケージを使用して表示することもできます。
ノート:
SYS.SYSTEMSTATS
表の詳細は、『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』のSYS.SYSTEMSTATSを参照してください。ttStats
ユーティリティの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttStatsを参照してください。TT_STATS
PL/SQLパッケージの詳細は、『Oracle TimesTen In-Memory Database PL/SQLパッケージ・リファレンス』のTT_STATSを参照してください。
-
クライアント/サーバー・アプリケーションからの総実行回数。
-
サーバーによる
INSERT
、UPDATE
、DELETE
、SELECT
、MERGE
、ALTER
、CREATE
、DROP
文の総実行回数。 -
サーバーによるトランザクションのコミットまたはロールバックの総回数。
-
サーバーによる、表への行の挿入、更新または削除の総回数。
-
クライアント/サーバーのラウンドトリップの総回数。
-
サーバーが転送または受信したバイトの総数。
-
クライアント/サーバーの切断の総回数。
ローカル処理(可能な場合)
パフォーマンスへの影響: 大
クライアントのタイムアウト接続属性の選択
パフォーマンスへの影響: 不定
TTC_Timeout
属性により、クライアント・アプリケーションでその対応するサーバー・プロセスからの結果を何秒まで待ってからタイムアウトにするかを指定します。
自動クライアント・フェイルオーバーに複数のサーバーを使用している場合は、TTC_ConnectTimeout
属性を設定して、クライアントがSQLDriverConnect
リクエストまたはSQLDisconnect
リクエストを待機する最大秒数を指定できます。これは、それらのリクエストに対するTTC_Timeout
の値を上書きします。接続リクエストが、問合せリクエストに指定されたタイムアウトとは異なる時間枠でタイムアウトするようにする場合は、TTC_ConnectTimeout
を設定します。たとえば、接続に長時間かかることがわかっている場合は、接続のタイムアウトを長く設定できますが、他のすべての問合せのタイムアウトは短く設定できます。
SQLDriverConnect
コールに割り当てられた全体の経過時間は、自動クライアント・フェイルオーバーが構成されているかどうかによって決まります。
-
TTC_SERVER
n
接続属性が1つのみ定義されている場合、自動クライアント・フェイルオーバーは構成されておらず、初期接続試行に割り当てられる全体の経過時間は10秒に制限されます。 -
自動クライアント・フェイルオーバーが定義されており、
TTC_SERVER
n
接続属性が複数構成されている場合、全体の経過時間はタイムアウト値(TTC_Timeout
またはTTC_ConnectTimeout
のいずれか)の4倍になります。たとえば、ユーザーがTTC_TIMEOUT
=10を指定し、複数のTTC_SERVER
n
サーバーが構成されている場合、SQLDriverConnect
コールは最大40秒かかります。
ただし、この全体の経過タイムアウト内で、各接続試行はTTC_Timeout
またはTTC_ConnectTimeout
の値で指定された時間を要することがあります。TTC_ConnectTimeout
の値は、TTC_Timeout
の値より優先されます。
TTC_Timeout
とTTC_ConnectTimeout
がSQLおよびPL/SQLのタイムアウトとどのように関連するかの詳細は、「SQLおよびPL/SQLのタイムアウト値の選択」を参照してください。
『Oracle TimesTen In-Memory Databaseリファレンス』のTTC_TimeoutおよびTTC_ConnectTimeoutを参照してください。
ロック待機タイムアウト間隔の選択
パフォーマンスへの影響: 不定
LockWait
接続属性を設定するか、ttLockWait
組込みプロシージャを使用します。
ロック競合の可能性が高いワークロードを実行する際には、LockWait
接続属性を小さい値に設定してアプリケーションに制御を迅速に戻すか、LockWait
を大きな値に設定してロック付与率を増加する(スループットが減少するリスクがある)ことを検討してください。
このマニュアル内の「ロック取得の待機時間の設定」、または『Oracle TimesTen In-Memory Databaseリファレンス』のLockWaitまたはttLockWaitを参照してください。
最適なロック方法の選択
パフォーマンスへの影響: 不定
TimesTenでは、トランザクション管理で説明される分離レベルをサポートしています。
また、データベース・レベル・ロック、表レベル・ロックおよび行レベル・ロックのロック・レベルをサポートしています。LockLevel
接続属性を使用すると、データベース・レベル・ロックと行レベル・ロックのどちらを使用するか指定できます。表ロックを使用するかどうかを示すオプティマイザ・ヒントを設定するには、ttOptSetFlag
プロシージャを使用します。デフォルトのロック粒度は行レベル・ロックです。
ノート:
『Oracle TimesTen In-Memory Databaseリファレンス』のLockLevelおよびttOptSetFlagを参照してください。
適切なロック・レベルの選択
データベースで競合がほとんど発生しない場合は、表レベル・ロックを使用します。これによって、パフォーマンスが改善され、デッドロックの可能性も低くなります。通常、トランザクションが短時間の場合または接続が少ない場合は、データベースで競合はほとんど発生しません。この場合、トランザクションが重複する可能性は低くなります。
-
また、表レベル・ロックは、文が表のほぼすべての行にアクセスする場合にも有効です。このような文には、1つのトランザクションで実行される問合せ、更新、削除、複数の挿入などがあります。
-
データベース・レベル・ロックは、単一のトランザクションに対するデータベース・アクセスを完全に制限するため、通常の操作には推奨されません。データベース・レベル・ロックを使用して長時間実行されるトランザクションは、データベースへの他のアクセスをすべてブロックし、データベースの監視と保守に必要な各種のバックグラウンド・タスクにさえ影響します。
-
通常、同じ行にアクセスする必要がほとんどない同時トランザクションが多数存在する場合は、行レベル・ロックを使用することを薦めします。プロセッサ数が十分で、同時実行性能が高い最新のシステム、たとえば複数の
ttBulkCp
プロセスでは、行レベル・ロックのほうがデータベース・レベル・ロックよりパフォーマンスが高いのが普通です。
ノート:
Oracle TimesTen In-Memory DatabaseリファレンスのttBulkCpを参照してください。
適切な分離レベルの選択
行レベル・ロックを使用している場合、アプリケーションでは、トランザクションをSERIALIZABLE
またはREAD_COMMITTED
の分離レベルで実行できます。
デフォルトの分離レベルはREAD_COMMITTED
です。Isolation
接続属性を使用すると、これらの分離レベルのいずれかを新しい接続に指定できます。
SERIALIZABLE
トランザクション分離レベルで実行すると、トランザクションの間、TimesTenではすべてのロックが維持されます。
-
行を更新するトランザクションでは、トランザクションがコミットされるまで書込みユーザーがブロックされます。
-
行を読み込むトランザクションでは、トランザクションがコミットされるまで書込みユーザーがブロックされます。
READ_COMMITTED
トランザクション分離レベルで実行すると、トランザクションの間、TimesTenでは更新のロックのみが維持されます。
-
行を更新するトランザクションでは、トランザクションがコミットされるまで、この行に対する書込みユーザーはブロックされます。この行を読み取るユーザーは、この行の以前コミットされたバージョンを受け取ります。
-
ファントム行が発生する場合があります。ファントム行とは、トランザクション時に読取りのロックが早く解放されたため、同じトランザクションにおいて、その行が、ある読取りでは表示されるが別の読取りでは表示されなかったり、2つの異なる読取りが異なる形式で表示されることが発生することです。
タイムアウトおよびデッドロックのエラー(エラー6001、6002および6003)をチェックすると、システムに競合が過度に存在しているかどうかを確認できます。この情報は、SYS.SYSTEMSTATS
表のlock.timeouts
列およびlock.deadlocks
列でも確認できます。
「トランザクションの分離レベル」を参照してください。
読取り専用トランザクションのプリフェッチ・クローズの有効化
パフォーマンスへの影響: 不定
-
ODBC:
SQLSetConnectOption
を使用してTT_PREFETCH_CLOSE
ODBC接続オプションを設定します。『Oracle TimesTen In-Memory Database C開発者ガイド』の問合せのパフォーマンスの最適化を参照してください -
JDBC:
true
を設定してTimesTenConnection
メソッドsetTtPrefetchClose()
をコールします。『Oracle TimesTen In-Memory Database Java開発者ガイド』の問合せのパフォーマンスの最適化を参照してください
SQLTransactのコール時における接続ハンドルの使用
パフォーマンスへの影響: 大
SQLTransact
をコールする場合は、必ず、有効なHDBCおよびnullの環境ハンドルを使用する必要があります。
SQLTransact (SQL_NULL_HENV, ValidHDBC, fType)
非nullの環境ハンドルおよびnullの接続ハンドルを使用してSQLTransact
をコールできますが、プロセスのすべてのトランザクションが突然コミットされたりロールバックされ、処理に時間がかかり、アプリケーションの予期しない動作が発生する可能性があるため、使用することはお薦めしません。
同時接続を処理するためのマルチスレッド・モードの有効化
MaxConnsPerServer
接続属性は、TimesTenサーバー・プロセスに許可される最大同時接続数を設定します。
デフォルトでは、MaxConnsPerServer
は1に設定されています。つまり、各TimesTenサーバー・プロセスは1つのクライアント接続のみを処理できます。
MaxConnsPerServer
を1より大きい値に設定すると、データベースに対してマルチスレッド・モードが有効になり、プロセスではなくスレッドを使用してクライアント接続を処理できます。これにより、アプリケーションが新しい接続を確立するのに必要な時間が短縮され、多数の同時クライアント/サーバー接続を使用する構成の全体的な効率が向上します。