クライアント/サーバーのチューニング

クライアント/サーバーをチューニングできます。

次の各項では、クライアント/サーバーのチューニングに関するヒントを示します:

クライアント/サーバーのパフォーマンスの診断

パフォーマンスへの影響: 不定

クライアント/サーバーのパフォーマンスは、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を参照してください。

  • クライアント/サーバー・アプリケーションからの総実行回数。

  • サーバーによるINSERTUPDATEDELETESELECTMERGEALTERCREATEDROP文の総実行回数。

  • サーバーによるトランザクションのコミットまたはロールバックの総回数。

  • サーバーによる、表への行の挿入、更新または削除の総回数。

  • クライアント/サーバーのラウンドトリップの総回数。

  • サーバーが転送または受信したバイトの総数。

  • クライアント/サーバーの切断の総回数。

ローカル処理(可能な場合)

パフォーマンスへの影響: 大

TimesTenクライアントを使用してリモート・サーバー・システムにあるデータベースにアクセスする場合、その接続にはネットワーク上のオーバーヘッドが発生します。可能な場合は常に、ダイレクト・ドライバを使用してローカルにTimesTenにアクセスするようアプリケーションを記述し、TimesTenにアプリケーションを直接リンクします。

クライアントのタイムアウト接続属性の選択

パフォーマンスへの影響: 不定

デフォルトでは、接続においての、TimesTenクライアントとTimesTenサーバーでネットワーク操作が完了するのを待つ時間は60秒です。TTC_Timeout属性により、クライアント・アプリケーションでその対応するサーバー・プロセスからの結果を何秒まで待ってからタイムアウトにするかを指定します。

自動クライアント・フェイルオーバーに複数のサーバーを使用している場合は、TTC_ConnectTimeout属性を設定して、クライアントがSQLDriverConnectリクエストまたはSQLDisconnectリクエストを待機する最大秒数を指定できます。これは、それらのリクエストに対するTTC_Timeoutの値を上書きします。接続リクエストが、問合せリクエストに指定されたタイムアウトとは異なる時間枠でタイムアウトするようにする場合は、TTC_ConnectTimeoutを設定します。たとえば、接続に長時間かかることがわかっている場合は、接続のタイムアウトを長く設定できますが、他のすべての問合せのタイムアウトは短く設定できます。

SQLDriverConnectコールに割り当てられた全体の経過時間は、自動クライアント・フェイルオーバーが構成されているかどうかによって決まります。

  • TTC_SERVERn接続属性が1つのみ定義されている場合、自動クライアント・フェイルオーバーは構成されておらず、初期接続試行に割り当てられる全体の経過時間は10秒に制限されます。

  • 自動クライアント・フェイルオーバーが定義されており、TTC_SERVERn接続属性が複数構成されている場合、全体の経過時間はタイムアウト値(TTC_TimeoutまたはTTC_ConnectTimeoutのいずれか)の4倍になります。たとえば、ユーザーがTTC_TIMEOUT=10を指定し、複数のTTC_SERVERnサーバーが構成されている場合、SQLDriverConnectコールは最大40秒かかります。

ただし、この全体の経過タイムアウト内で、各接続試行はTTC_TimeoutまたはTTC_ConnectTimeoutの値で指定された時間を要することがあります。TTC_ConnectTimeoutの値は、TTC_Timeoutの値より優先されます。

TTC_TimeoutTTC_ConnectTimeoutがSQLおよびPL/SQLのタイムアウトとどのように関連するかの詳細は、「SQLおよびPL/SQLのタイムアウト値の選択」を参照してください。

『Oracle TimesTen In-Memory Databaseリファレンス』TTC_TimeoutおよびTTC_ConnectTimeoutを参照してください。

ロック待機タイムアウト間隔の選択

パフォーマンスへの影響: 不定

デフォルトでは、接続は10秒待機してロックを設定します。ロックのタイムアウト間隔を変更するには、LockWait接続属性を設定するか、ttLockWait組込みプロシージャを使用します。

ロック競合の可能性が高いワークロードを実行する際には、LockWait接続属性を小さい値に設定してアプリケーションに制御を迅速に戻すか、LockWaitを大きな値に設定してロック付与率を増加する(スループットが減少するリスクがある)ことを検討してください。

このマニュアル内の「ロック取得の待機時間の設定」、または『Oracle TimesTen In-Memory Databaseリファレンス』LockWaitまたはttLockWaitを参照してください。

最適なロック方法の選択

パフォーマンスへの影響: 不定

複数の接続で同時にデータベースにアクセスする場合、TimesTenは、ロックを使用して様々なトランザクションが明示的に分離されて処理されるようにします。

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列でも確認できます。

「トランザクションの分離レベル」を参照してください。

読取り専用トランザクションのプリフェッチ・クローズの有効化

パフォーマンスへの影響: 不定

TimesTen拡張機能により、アプリケーションでは、クライアント/サーバー・アプリケーションの読取り専用問合せのパフォーマンスを最適化できます。プリフェッチ・クローズを有効化すると、サーバーでは、結果セット全体が読取り専用の問合せに対してフェッチされた後でカーソルが閉じられ、トランザクションがコミットされます。これによって、クライアントとサーバー間のネットワーク・ラウンドトリップが減少するため、パフォーマンスが向上します
  • 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より大きい値に設定すると、データベースに対してマルチスレッド・モードが有効になり、プロセスではなくスレッドを使用してクライアント接続を処理できます。これにより、アプリケーションが新しい接続を確立するのに必要な時間が短縮され、多数の同時クライアント/サーバー接続を使用する構成の全体的な効率が向上します。

「LinuxまたはUNIXシステム上のTimesTenサーバーのサーバーDSNの定義」を参照してください。