Oracle® TimesTen In-Memory Database

オペレーション・ガイド

11gリリース2(11.2.2)

B66441-07(原本部品番号:E21633-12)

2014年10月

Oracle TimesTen In-Memory Databaseオペレーション・ガイド, 11gリリース2 (11.2.2)

B66441-07

Copyright © 1996, 2014, Oracle and/or its affiliates.All rights reserved.

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

タイトルおよび著作権情報

はじめに

- 対象読者

- 関連ドキュメント

- 表記規則

- ドキュメントのアクセシビリティについて

新機能

- リリース11.2.2.8.0の新機能

- リリース11.2.2.7.0の新機能

- リリース11.2.2.6.0の新機能

- リリース11.2.2.5.0の新機能

- リリース11.2.2.4.0の新機能

- リリース11.2.2.2.0の新機能

- リリース11.2.2.1.0の新機能

- リリース11.2.2.0.0の新機能

1 TimesTenデータベースの管理

- ODBCドライバおよびJDBCドライバを使用したTimesTenへの接続

- TimesTen ODBCドライバを使用した接続

- TimesTen JDBCドライバおよびドライバ・マネージャを使用した接続

- TimesTenデータベースを識別するためのデータソース名の指定

- ユーザーDSNおよびシステムDSNの概要

- 直接接続またはクライアント/サーバー接続用のDSNの定義

- Data Manager DSNまたはサーバーDSN用の接続属性

- Data Manager DSNの定義

- WindowsでのData Manager DSNの作成

- ODBCドライバの指定

- Data Manager DSNの指定

- 接続属性の指定

- UNIXでのData Manager DSNの作成

- ユーザーodbc.iniファイルまたはシステムodbc.iniファイルの作成

- データベースのパス名での環境変数の使用方法

- クライアントDSNおよびサーバーDSNの定義

- DSN用の解決パス

- DSNの例

- デフォルトDSNの設定

- 一時データベースの設定

- DSNでのPL/SQL接続属性の指定

- 単一のデータベースに対する複数DSNの作成

- odbc.iniファイル・エントリの説明

- ODBCデータソース

- DSNの指定

- odbc.iniファイルの例

- 接続文字列を使用したデータベース接続

- RAMポリシーの指定

- 自動リカバリ失敗後のRAMポリシーの変更

- 自動リカバリ失敗後のデータベースの自動リロードを防止する

- メモリーからのデータベースのロードとアンロード

- メモリーへのデータベースのロード

- メモリーからのデータベースのアンロード

- データベースのサイズ指定

- データベースのメモリー領域サイズの見積りおよび変更

- 十分なディスク領域があることの確認

- PermSize属性およびTempSize属性の監視

- メモリー不足の警告受信

- データベースの既存の表の管理

- TimesTenを使用したスレッド・プログラミング

- TimesTenデータベースのデフラグ

- TimesTenデータベースのオフライン・デフラグメンテーション

- TimesTenデータベースのオンライン・デフラグメンテーション

- アクティブ・スタンバイ・ペアのレプリケーション・スキーム内のデータベースのオンライン・デフラグメンテーション

- アクティブ・スタンバイ・ペアではないレプリケーション・スキーム内のデータベースのオンライン・デフラグメンテーション

2 TimesTen ClientおよびTimesTen Serverの使用方法

- TimesTen Client/Serverの概要

- クライアント/サーバー通信に対する制限

- クライアント/サーバー通信用プロトコル

- TCP/IP通信

- 共有メモリー通信

- UNIXドメイン・ソケット通信

- TimesTen ClientおよびTimesTen Serverの構成

- TimesTen Client/Server構成の概要

- クライアント/サーバー接続用のインストールおよび構成

- 同一リリースのTimesTen ClientおよびTimesTen Serverの構成方法

- リリースが異なるTimesTen ClientおよびTimesTen Serverの構成

- TimesTen ServerシステムでのサーバーDSNの定義

- odbc.iniファイルで定義されたサーバーDSN接続属性

- ODBCデータソース・アドミニストレータで定義されたサーバーDSN接続属性

- 論理サーバー名の定義

- Windowsでの論理サーバー名の作成および構成

- UNIXでの論理サーバー名の作成および構成

- TimesTen ClientシステムでのクライアントDSNの作成

- WindowsでのクライアントDSNの作成および構成

- UNIXでのクライアントDSNの作成および構成

- 自動クライアント・フェイルオーバーの使用

- 自動クライアント・フェイルオーバーの機能

- 自動クライアント・フェイルオーバーの構成

- TimesTen Serverの起動

- サーバー情報メッセージ

- UNIXでのリモート・データベースへのアクセス

- 接続のテスト

3 TimesTen Data Managerデーモンでの処理

- TimesTenデーモンの起動および停止

- WindowsでのOracle TimesTen Data Managerサービスの起動および停止

- スタートアップ・モードの変更

- UNIXでのデーモンの起動および停止

- setuprootスクリプトの実行

- TimesTenアプリケーションの停止

- TimesTenデーモン・オプションの管理

- アドレスをリスニングするデーモンの決定

- IPv6のリスニング

- 情報メッセージの変更

- サブデーモンの生成可能な数の変更

- NFSマウントされたシステムを介したデータベース・アクセスの許可

- Linuxラージ・ページのサポートの有効化

- 致命的なエラー後の自動データベース・リカバリのデフォルトを変更する

- 範囲を共有メモリー・キー向けに構成する

- TimesTen Client/Serverのオプションの管理

- TimesTen Serverのオプションの変更

- TimesTen Serverの制御

- TimesTen Serverプロセスの事前生成

- TimesTen Serverに対する複数の接続の指定

- 子サーバー・プロセス当たりのクライアント接続の最大数の構成

- サーバーDSNに生成された子サーバー・プロセス間に接続を分散する方法の構成

- 子サーバー・プロセスのスレッド・スタック・サイズの構成

- クライアント/サーバーIPCでの共有メモリーの使用方法

- 共有メモリー・セグメントのサイズの管理

- 共有メモリー・セグメントのサイズの変更

- TimesTen Serverログ・メッセージの制御

4 アクセス制御の管理

- ユーザー管理による認証の制御

- ユーザーの概要

- ユーザーの作成およびデータベースでのユーザーの識別

- 内部ユーザーのパスワードの変更

- データベースからのユーザーの破棄

- 権限によるオブジェクトへの認可の付与

- 権限の概要

- システム権限

- オブジェクト権限

- PUBLICロール

- 権限階層のルール

- システム権限の付与または取消し

- 管理者権限の付与

- ALL PRIVILEGESの付与

- データベースに接続するための権限の付与

- 追加のシステム権限の付与

- 任意のデータベース・オブジェクト・タイプに対するユーザーによる処理の許可

- オブジェクト権限の付与または取消し

- すべてのオブジェクト権限の付与

- 表のオブジェクト権限

- ビューのオブジェクト権限

- 順序のオブジェクト権限

- マテリアライズド・ビューのオブジェクト権限

- REFERENCES句による外部キーの作成時に必要なオブジェクト権限

- PL/SQL関数、プロシージャおよびパッケージのオブジェクト権限

- シノニムのオブジェクト権限

- 単一のSQL文による複数の権限の付与または取消し

- キャッシュ・グループの権限の付与または取消し

- キャッシュ・マネージャ権限

- キャッシュ・グループのシステム権限

- キャッシュ・グループのオブジェクト権限

- ユーザー権限の表示

- ユーティリティ、組込みプロシージャおよび初期接続属性に必要な権限

- 親子表の権限チェック・ルール

5 グローバリゼーション・サポート

- グローバリゼーション・サポート機能の概要

- データベース・キャラクタ・セットの選択

- キャラクタ・セットおよび言語

- クライアント・オペレーティング・システムとアプリケーションの互換性

- パフォーマンスおよび記憶域への影響

- キャラクタ・セットおよびレプリケーション

- 長さセマンティクスおよびデータ記憶域

- 接続キャラクタ・セット

- 言語ソート

- 単一言語ソート

- 多言語ソート

- 大/小文字およびアクセントを区別しない言語ソート

- 言語ソートの実行

- 言語索引の使用

- SQL文字列および文字関数

- グローバリゼーション・サポート属性の設定

- TIMESTEN8を使用した後方互換性

- 移行時のグローバリゼーション・サポート

6 ttIsqlユーティリティの使用方法

- バッチ・モードおよび対話モード

- TTISQL環境変数を使用したデフォルト設定の定義

- ttIsqlコマンド・プロンプトのカスタマイズ

- ttIsqlオンライン・ヘルプの使用

- ttIsqlのeditline機能の使用(UNIXのみ)

- emacsバインディング

- viバインディング

- ttIsqlのコマンド履歴の使用

- ttIsqlのコマンド履歴の保存および消去

- ttIsqlのeditコマンドの使用

- ttIsqlのeditコマンドのデフォルトのテキスト・エディタの変更

- キャラクタ・セットの処理

- データベース構造情報の表示

- ttIsqlのdescribeコマンドの使用

- ttIsqlのcachegroupsコマンドの使用

- ttIsqlのdssizeコマンドの使用

- ttIsql tablesizeコマンドの使用

- ttIsqlのmonitorコマンドの使用

- オブジェクト・タイプ別のデータベース・オブジェクトのリスト

- 接続属性の表示および設定

- トランザクションの処理

- 準備済およびパラメータ化済のSQL文の処理

- 変数の使用、宣言、構成方法

- バインド変数の宣言および設定

- 取得した列のバインド変数の自動作成

- PL/SQLブロックの作成および実行

- OUTパラメータを使用したPL/SQLからのデータの受渡し

- IF-THEN-ELSEコマンド構成を使用した条件制御

- Oracle DatabaseからTimesTen表へのデータのロード

- ttIsqlを使用した表の作成およびSQL問合せ結果のロード

- TimesTen組込みプロシージャを使用した表の推奨およびSQL問合せ結果のロード

- パラレル・ロード処理の取消し

- 問合せオプティマイザ計画の参照および変更

- showplanコマンドの使用

- SQLコマンド・キャッシュからのコマンドおよび実行計画の表示

- SQLコマンド・キャッシュに格納されたコマンドの表示

- SQLコマンド・キャッシュでの文に関する問合せ計画の表示

- ODBC関数の管理

- ODBC関数の取消し

- timing ODBC関数コール

- WHENEVER SQLERRORを使用したエラーのリカバリ

7 トランザクション管理

- トランザクションの概要

- トランザクションの暗黙的なコミット動作

- トランザクションの自動コミット動作

- TimesTenのDDLコミット動作

- 自動コミットおよびDDLCommitBehaviorの関係

- ACIDセマンティクスの確認

- トランザクションのアトミック性、一貫性および分離

- トランザクションの一貫性と永続性

- 分離およびロックによる並行性制御

- トランザクションの分離レベル

- ロックの粒度

- ロック取得の待機時間の設定

- チェックポイント処理

- チェックポイントの目的

- チェックポイント・ファイルの使用

- チェックポイントのタイプ

- ファジー・チェックポイント(非ブロッキング・チェックポイント)

- トランザクション一貫性チェックポイント

- チェックポイントの設定および管理

- プログラムによるチェックポイントの実行

- バックグラウンドのチェックポイント処理の構成または無効化

- チェックポイントの履歴およびステータスの表示

- チェックポイント処理速度の設定

- チェックポイント・ファイル読込みスレッド数の設定

- トランザクションのロギング

- トランザクション・ログのバッファおよびファイルの管理

- 蓄積されるトランザクション・ログ・ファイルの監視

- トランザクション・ログ・ファイルのパージ

- TimesTenのコンポーネントまたは操作によるログの保持

- 保持されるログとログ・ファイルの蓄積の監視

- トランザクション・ロギングの永続性オプション

- 永続性の保証

- 永続性の遅延

- 永続コミットのパフォーマンス強化

- トランザクションの再要求操作

- 再要求操作について

- コミット・バッファを再要求操作用に構成する

- チェックポイントおよびトランザクション・ログ・ファイルを使用したリカバリ

8 TimesTenデータベースのデータの処理

- データベースの概要

- データベースのコンポーネント

- データベースのユーザーおよび所有者

- データベースの永続性

- 表の理解

- 表の概要

- 列の概要

- インライン列およびアウトライン列

- デフォルトの列値

- 表名

- 表へのアクセス

- 主キー、外部キーおよび一意索引

- システム表

- 表の処理

- 表の作成

- 表の破棄

- 表サイズの見積り

- 表へのエージングの実装

- 使用状況ベースのエージング

- 時間ベースのエージング

- エージングおよび外部キー

- エージング開始のスケジュール

- エージングおよびレプリケーション

- ビューの理解

- ビューの作成

- CREATE VIEW文でのSELECT問合せ

- ビューの破棄

- ビューおよびディテール表に対する制限

- マテリアライズド・ビューの理解

- マテリアライズド・ビューの概要

- 同期マテリアライズド・ビュー

- 非同期マテリアライズド・ビュー

- 同期マテリアライズド・ビューまたは非同期マテリアライズド・ビューを使用する状況

- マテリアライズド・ビューの処理

- マテリアライズド・ビューの作成

- マテリアライズド・ビューまたはマテリアライズド・ビュー・ログの破棄

- マテリアライズド・ビューおよびディテール表に対する制限

- マテリアライズド・ビューによるパフォーマンスへの影響

- 索引の理解

- 索引タイプの概要

- 索引の作成

- 索引の変更

- 索引の破棄

- 索引サイズの見積り

- 索引アドバイザを使用した索引の推奨

- 索引アドバイザを実行するための準備

- 索引推奨項目を生成するために使用するデータの取得

- 索引推奨項目およびデータ収集情報の取得

- 索引アドバイザ用に収集したデータを破棄してデータをファイナライズする

- 索引アドバイザの組込みプロシージャの使用例

- 行の理解

- 行の挿入

- 行の削除

- シノニムの理解

- シノニムの作成

- シノニムの削除

- シノニムが原因のSQL問合せの無効化または再コンパイル

9 TimesTen問合せオプティマイザ

- 最適化を実行するタイミング

- SQLコマンド・キャッシュに格納されているSQL文の表示

- パフォーマンス管理およびトラブルシューティングのコマンド

- SQLコマンド・キャッシュに格納されたコマンドの表示

- SQL問合せ計画の表示

- システムPLAN表からの問合せ計画の表示

- 計画をシステムPLAN表に格納するようにTimesTenに指示する方法

- PLAN表からの問合せ計画の読取り

- PLAN表の各列の説明

- SQLコマンド・キャッシュに格納されているコマンドに関連付けられた問合せ計画の表示

- 計画生成の変更

- 実行計画を変更する理由

- ヒントが実行計画に与えることができる影響

- オプティマイザ・ヒントを使用して実行計画を変更する

- SQL文への文レベルのオプティマイザ・ヒントの適用

- トランザクションへのトランザクション・レベルのオプティマイザ・ヒントの適用

10 TimesTenデータベースのパフォーマンス・チューニング

- システムとデータベースのチューニング

- 十分なメモリーの用意

- データベースの適切なサイズ設定

- PL/SQLランタイム用の共有メモリー・サイズの計算

- LogBufMBの増加(必要な場合)

- 一時データベースの使用(適切な場合)

- 接続オーバーヘッドの回避

- 複製時のRAMへのデータベースのロード

- 自動リカバリ失敗後のデータベースのリロードを防止する

- 競合の軽減

- ロード時のオペレーティング・システムのページングの回避

- メンテナンス用の特別なオプションの検討

- 使用するドライバの確認

- トレース機能の有効化(必要な場合のみ)

- メトリックを使用してパフォーマンスを評価する

- 別のJVMの調査

- キャラクタ・セット変換を伴うデータの移行

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

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

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

- タイムアウト時間の選択

- 最適なロック方法の選択

- 適切なロック・レベルの選択

- 適切な分離レベルの選択

- クライアントとサーバーが同じシステム上にあるとき、共有メモリー・セグメントをIPCとして使用

- シリアライズ可能トランザクションのTT_PREFETCH_CLOSEの有効化

- SQLTransactのコール時における接続ハンドルの使用

- SQLのチューニング

- 文のチューニングと索引の使用

- SQL文の実行時間のサンプリングを収集および評価する

- ハッシュ索引、範囲索引またはビットマップ索引の適切な選択

- ハッシュ索引サイズの適切な設定

- 外部キー制約の適切な使用

- 正確な統計または見積り統計の計算

- 大規模な表の表統計のパラレルでの更新

- 現在の表統計を再生成するスクリプトを作成する

- コマンドの無効化をSQLコマンド・キャッシュで制御する

- ALTER TABLEの回避

- 問合せのネストの回避

- 文の事前準備

- 不要な準備処理の回避

- 表圧縮を使用したデータの効率的な保存

- 同時書込み処理時の読取り最適化の制御

- マテリアライズド・ビューのチューニング

- 結合行の数の制限

- 結合列に対する索引の使用

- 不要な更新の回避

- 外部結合の内部表への変更の回避

- ビュー表の列数の制限

- トランザクションのチューニング

- トランザクション・サイズの適切な設定

- 永続コミットの適切な使用

- 頻繁なチェックポイント処理の回避

- 自動コミット・モードの無効化

- トランザクション・ロールバックの回避

- 大量のDELETE文の回避

- DELETE FROM文の回避

- TRUNCATE TABLE文の優先

- DELETE FIRST句の使用の考慮

- コミット・バッファのキャッシュ・サイズの増加

- リカバリのチューニング

- RecoveryThreadsの設定

- CkptReadThreadsの設定

- 複数CPUのスケーリング

- プロトタイプとしてのデモ・アプリケーションの実行

- CPU当たりのデータベース集中型の接続の数の制限

- 読取り処理の使用(使用可能な場合)

- 準備、再準備および接続の制限

- リカバリ時の索引再構築のパラレル実行

- プライベート・コマンドの使用

- XLAのチューニング

- XLA使用時のトランザクション・ログ・バッファのサイズの増加

- 複数の更新レコードのプリフェッチ

- XLA更新の確認

- キャッシュとレプリケーションのチューニング

用語集

索引

はじめに

Oracle TimesTen In-Memory Database (TimesTen)は、迅速な応答およびスループット用にメモリーが最適化されたリレーショナル・データベースです。実行時にはデータベース全体がメモリーに常駐し、リカバリおよび再起動できるようにディスク記憶域に保存されます。レプリケーション機能によって、高可用性が実現します。TimesTenでは、OracleインタフェースであるPL/SQL、OCIおよびPro*C/C++に加えて、標準的なアプリケーション・インタフェースであるJDBC、ODBCおよびODP.NETがサポートされます。TimesTenは、単独で使用することもOracle Databaseのキャッシュとして使用することもできます。

このマニュアルでは次の情報を提供します。

- TimesTenの動作の理解に役立つ基礎知識

- 最も一般的なタスクの実行方法を説明するステップバイステップ形式の手順と例

対象読者

このマニュアルは、データベース・システムの仕組みを理解しているとともに、Structured Query Language(SQL)についての一般的な知識を持っていることを前提としています。

関連ドキュメント

TimesTenのドキュメントは、製品配布メディアおよび次のURLのOracle Technology Networkで入手できます。

http://www.oracle.com/technetwork/database/database-technologies/timesten/documentation/index.html

Oracle DatabaseのドキュメントもOracle Technology Networkで入手できます。これは、TimesTenでサポートされているが、説明されていないOracle Databaseの機能の場合に役立ちます。

http://www.oracle.com/pls/db112/homepage/

表記規則

TimesTenは複数のプラットフォームをサポートしています。このマニュアルに記述されている内容は、特に表記しないかぎり、サポートされるすべてのプラットフォームに適用されます。Windowsという用語は、サポートされるすべてのWindowsプラットフォームを表します。UNIXという用語は、サポートされるすべてのUNIXおよびLinuxプラットフォームを表します。TimesTenでサポートされるプラットフォームの具体的なバージョンについては、『Oracle TimesTen In-Memory Databaseリリース・ノート』のプラットフォームに関する説明を参照してください。

注意:
TimesTenのドキュメントでは、「データ・ストア」と「データベース」という用語を同じ意味で使用しています。両方の用語は、TimesTenデータベースを指します。

このマニュアルの表記規則は、次のとおりです。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック体

イタリックは、ドキュメントのタイトル、強調またはユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

固定幅フォントのイタリック

固定幅フォントのイタリックは、置き換える必要があるコード例の変数です。次に例を示します。
Driver=TimesTen_install_dir/lib/libtten.so

TimesTen_install_dirをご使用のTimesTenインストール・ディレクトリに置き換えます。

[ ]

大カッコは、カッコ内の項目を任意に選択することを表します。大カッコは、入力しないでください。

{ }

中カッコは、カッコ内の項目のうち、1つが必須であることを表します(中カッコは入力しないでください)。

|

縦線は、選択項目の引数を区切ります。

. . .

引数の後の水平の省略記号は、1行のコマンドラインで複数の引数を使用できることを表します。

%

%は、UNIXのシェル・プロンプトを表します。

#

#は、UNIXルート・ユーザーのプロンプトを表します。

このマニュアルでは、次の変数を使用して、パス、ファイルおよびユーザー名を表します。

規則

意味

TimesTen_install_dir

TimesTenの現在のリリースがインストールされているディレクトリのパスです。

TTinstance

TimesTenのインストールで指定するインスタンス名です。インストール時に、英数字の一意のインスタンス名でTimesTenの各インストールを識別する必要があります。この名前はインストール・パスに表示されます。

bitsまたはbb

32または64の2桁の数字は、32-bitまたは64-bitバージョンのオペレーティング・システムを表します。

releaseまたはrr

リリース番号の最初の3つの部分(ドットが付く場合と付かない場合があります)。リリース番号の最初の3つの部分は、TimesTenのメジャー・リリースを表します。たとえば、1122または11.2.2はTimesTen 11gリリース2(11.2.2)を表します。

jdk_version

1桁または2桁の数字は、JDK(Java Development Kit)リリースのメジャー・バージョン番号を表します。たとえば、5は、JDK 5を表します。

DSN

データソースの名前です。

ドキュメントのアクセシビリティについて

Oracleのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイト(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc)を参照してください。

Oracle Supportへのアクセス

Oracleサポート・サービスでは、My Oracle Supportを通して電子支援サービスを提供しています。詳細情報は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info)か、聴覚に障害のあるお客様は(http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs)を参照してください。

新機能

この項では、このマニュアルで説明するOracle TimesTen In-Memory Databaseリリース11.2.2の新機能の概要、および各機能の詳細への参照先を示します。

- リリース11.2.2.8.0の新機能

- リリース11.2.2.7.0の新機能

- リリース11.2.2.6.0の新機能

- リリース11.2.2.5.0の新機能

- リリース11.2.2.4.0の新機能

- リリース11.2.2.2.0の新機能

- リリース11.2.2.1.0の新機能

- リリース11.2.2.0.0の新機能

リリース11.2.2.8.0の新機能

- CkptReadThreads接続属性を使用して、データベースをメモリーにロードするときTimesTenがチェックポイント・ファイルの読込みに使用するスレッドの数を設定できます。詳細は、「チェックポイント・ファイル読込みスレッド数の設定」と「CkptReadThreadsの設定」を参照してください。

リリース11.2.2.7.0の新機能

- ttIsql editコマンドを使用してファイルを編集するか、テキスト・エディタでttIsqlコマンドを編集できます。ttIsql editコマンドは、emacs、gedit、viなどのテキスト・エディタを起動します。詳細は、「ttIsqlのeditコマンドの使用」を参照してください。

- ユーザー・ログ・ファイルおよびサポート・ログ・ファイルのデフォルト・サイズが増えました。ユーザー・ログ・ファイルの新しいデフォルト・サイズは10MBで、サポート・ログ・ファイルは100MBです。詳細は、「情報メッセージの変更」を参照してください。

リリース11.2.2.6.0の新機能

- パラレル・ロード処理は実行時間が長くなる場合があります。SQLCancel(hstmt) ODBC関数を使用して、またはttIsqlユーティリティで[Ctrl]キーを押したまま[C]キーを押すことによって、パラレル・ロード処理を実行しているすべてのスレッドを取り消して、完全に停止できます。詳細は、「パラレル・ロード処理の取消し」を参照してください。

- TimesTenは読取り問合せおよび書込み問合せを同時に最適に処理します。ttOptSetFlag ('tblLock',1)などのトランザクション・レベル・オプティマイザ・ヒントまたは/*+ tt_tbllock(1) tt_rowlock(0) */などの文レベル・オプティマイザ・ヒントを使用すると、読取り専用同時実行性に対して読取り問合せを最適化できます。読取り最適化問合せと同時に処理する書込み問合せは競合する可能性があります。ttDbWriteConcurrencyModeSet組込みプロシージャにより、同時書込み処理時に読取り最適化を制御できます。詳細は、「同時書込み処理時の読取り最適化の制御」を参照してください。

リリース11.2.2.5.0の新機能

- デフォルトでは、致命的なエラー後のデータベースの自動リカバリが失敗した場合、TimesTenはalwaysおよびmanual RAMポリシーをInUseに変更して、失敗の再発を防止します。ttendaemon.optionsファイルの-enablePolicyInactiveオプションを設定してRAMポリシーの変更を防ぐことを含め、デフォルトのリカバリ・プロセスを変更できるようになりました。このオプションはデータベースのリロードも防ぎます。詳細は、「自動リカバリ失敗後のRAMポリシーへの変更」を参照してください。

- データベースのリカバリでは、TimesTenはデータベースをメモリーにリロードします。無効化されたデータベースがまだメモリーに存在している場合にデータベースをリロードすると、使用可能なRAMが一杯になる場合があります。ttAdmin -noautoreloadコマンドを使用してデータベースの自動リロードを防止する方法の詳細は、自動リカバリ失敗後のデータベースのリロードを防止する方法の説明を参照してください。

- SQLコマンド・キャッシュ内のコマンドのコマンド無効化を、すべての統計が生成されるか、表や索引への主要な変更が完了するまで延期できます。完了後、ttOptCmdCacheInvalidate組込みプロシージャを使用してコマンドを手動で無効にできます。詳細は、「コマンドの無効化をSQLコマンド・キャッシュで制御する」を参照してください。

- CREATE [UNIQUE] HASH INDEX文を使用して、一意または一意でないハッシュ索引を作成できます。ハッシュ索引作成の詳細は、「索引の理解」を参照してください。

- これまでは、トランザクションの再要求操作(トランザクションのうちリソースをクリーンアップする部分)の実行中に、少数のトランザクション・ログ・レコードがキャッシュされ、ディスク上のトランザクションにアクセスする必要性を軽減していました。しかし、これは比較的小さいトランザクションでしか役に立ちませんでした。大きいトランザクションのパフォーマンスも同様に向上させるため、TimesTenにCommitBufferSizeMax接続属性が追加され、キャッシュ・サイズをユーザーが構成できるようになりました。詳細は、トランザクションの再要求操作に関する説明を参照してください。

- TimesTenには、SQL操作の実行時間を測定して表示することでSQL文のパフォーマンスを判断できる組込みプロシージャがあります。追跡のかわりに、組込みプロシージャがSQL文の実行中に実行時間をサンプリングします。詳細は、「SQL文の実行時間のサンプリングを収集および評価する」を参照してください。

- ttStatsユーティリティおよびTT_STATS PL/SQLパッケージを使用して、データベース・メトリックを収集および表示できます。収集されたメトリックを評価して、TimesTenデータベースのパフォーマンスを評価できます。「メトリックを使用してパフォーマンスを評価する」を参照してください。

- ヒントを適用して、TimesTen問合せオプティマイザに指示を渡すことができます。問合せに対して最適な実行計画を選択するとき、オプティマイザではこれらのヒントが考慮されます。今回のリリースでは、特定のSQL文に対して文レベルのオプティマイザ・ヒントを適用できます。詳細は、「SQL文への文レベルのオプティマイザ・ヒントの適用」を参照してください。

- TimesTenで-shmkeyrangeデーモン・オプションを使用して、範囲をすべての共有メモリー・キー向けに構成できます。詳細は、「範囲を共有メモリー・キー向けに構成する」を参照してください。

リリース11.2.2.4.0の新機能

- 索引アドバイザという新しいツールを使用すると、特定のSQLワークロードのパフォーマンスを向上させることができる一連の索引を推奨できます。詳細は、「索引アドバイザを使用した索引の推奨」を参照してください。

- 表統計を現在の状態にリストアできるttOptStatsExport組込みプロシージャを使用して、SQLスクリプトを生成できます。詳細は、「現在の表統計を再生成するスクリプトを作成する」を参照してください。

- 結果を含めるためのキャッシュ・グリッド、キャッシュ・グループおよびキャッシュ表を作成しないで、SQL問合せの結果をバックエンドOracle DatabaseからTimesTenの単一表にロードできる新しいツールが追加されました。TimesTenでは、Oracle Databaseでユーザーが指定したSELECT文を実行し、その結果セットをTimesTenの表にロードするツールが提供されます。詳細は、「Oracle DatabaseからTimesTen表へのデータのロード」を参照してください。

- ttMigrateユーティリティを使用してTimesTenデータベースをデフラグできます。詳細は、「TimesTenデータベースのデフラグ」を参照してください。
最小の総サービス・ダウンタイムで複数のデータベースをデフラグするには、ttMigrateとttRepAdmin -duplicateユーティリティを組み合せて、アクティブ・スタンバイ・ペア・レプリケーション・スキームに関係しているTimesTenデータベースをデフラグします。詳細は、「TimesTenデータベースのオンライン・デフラグメンテ-ション」を参照してください。

リリース11.2.2.2.0の新機能

- ttIsqlで、variableおよびsetvariableコマンドを使用し、バインド変数を宣言、使用、構成できるようになりました。さらに、自動バインド変数も作成できるようになりました。詳細は、「変数の使用、宣言、構成方法」を参照してください。

- [Ctrl]キーを押したまま[C]キーを押すことによって、ODBC関数を取り消すことができます。詳細は、「ODBC関数の取消し」を参照してください。

- ttIsqlでのエラーのリカバリを、WHENEVER SQLERRORコマンドを使用して制御できます。詳細は、「WHENEVER SQLERRORを使用したエラーのリカバリ」を参照してください。

- IF-THEN-ELSEコマンド構成を使用し、ttIsqlセッションに条件ブランチ・ロジックを実装できます。詳細は、「IF-THEN-ELSEコマンド構成を使用した条件制御」を参照してください。

リリース11.2.2.1.0の新機能

- トランザクション・ログ・ファイルが過度に蓄積されないよう、保持されているトランザクション・ログがないことを頻繁に確認することが重要です。非常に多くのトランザクション・ログのファイルが蓄積され、利用可能なディスク領域がなくなると、トランザクション・ログの保持が進行して、次のチェックポイント操作によってトランザクション・ログ・ファイルがパージされるまで、TimesTenデータベースでは新しいトランザクションを開始できません。詳細は、「蓄積されるトランザクション・ログ・ファイルの監視」を参照してください。

- LOBデータ型がサポートされるようになりました。詳細は、「SQL文字列および文字関数」を参照してください。

リリース11.2.2.0.0の新機能

- 範囲索引は、これまでTツリー索引と呼ばれていました。現在、すべての表示およびコマンドでこれを識別する用語として範囲を使用するようになりました。「問合せオプティマイザ計画の参照および変更」のとおり、showplanコマンドのオプションとしてtryrangeおよびtrytmprangeが実装され、問合せ計画の出力でTmpRangeScanなどが範囲索引として使用されるようになりました。

- ttIsqlに新しいコマンドtablesizeが追加され、TimesTenデータベースの実際の表サイズを表示できるようになりました。詳細は、「ttIsql tablesizeコマンドの使用」を参照してください。

1 TimesTenデータベースの管理

TimesTenデータベースは、表、ビュー、順序などの要素の集合です。TimesTenデータベースはSQLを使用してアクセスし、操作できます。データベースが存在しない場合、インスタンス管理者がデータベースに接続する際に指定した属性を使用して、TimesTenによってデータベースが作成されます。TimesTenデータベースへの既存の接続をすべて切断することで、データベースの共有メモリー・セグメントを解放できます。

TimesTenデータベースの構成および管理は接続定義の属性に含まれているため、この章では、まずTimesTenデータベース接続の構成方法について説明します。

一度データベースを作成すると、次の処理を実行できます。

- ttIsqlユーティリティを使用したデータべースへの接続およびSQLファイルの実行または対話型SQLセッションの開始(「バッチ・モードと対話モード」を参照)。

- データベースを使用するアプリケーションの実行。

主な内容は次のとおりです。

- ODBCドライバおよびJDBCドライバを使用したTimesTenへの接続

- TimesTenデータベースを識別するためのデータソース名の指定

- Data Manager DSNの定義

- クライアントDSNおよびサーバーDSNの定義

- DSN用の解決パス

- DSNの例

- odbc.iniファイル・エントリの説明

- RAMポリシーの指定

- メモリーからのデータベースのロードとアンロード

- データベースのサイズ指定

- データベースの既存の表の管理

- TimesTenを使用したスレッド・プログラミング

- TimesTenデータベースのデフラグ

ODBCドライバおよびJDBCドライバを使用したTimesTenへの接続

Oracle TimesTen Application-Tier Database Cache概要のTimesTenの接続オプションに関する説明に記載されているとおり、アプリケーションではTimesTen ODBCドライバを使用して、TimesTenデータベースにアクセスします。アプリケーションでは、提供されているインタフェースを介してODBCダイレクト・ドライバ、Windows ODBCドライバ・マネージャ、ODBCクライアント・ドライバまたはODBCドライバを間接的に使用し、TimesTenデータベースにアクセスできます。

図1-1に、アプリケーションで様々なドライバおよびインタフェースを使用して、TimesTenデータベースにアクセスする方法を示します。

図1-1 アプリケーションからTimesTenデータベースへのアクセスを表す図

- Cアプリケーションでは、TimesTen ODBCドライバと直接リンクしたり、Windows ODBCドライバ・マネージャとリンクしたり、ODBCドライバにアクセスするOCIまたはPro*C/C++インタフェースを使用して、TimesTenと対話します。

- Javaアプリケーションでは、JDBCライブラリをロードして、TimesTenと対話します。

- C++アプリケーションでは、TimesTenで提供されるクラス・セット(TTClasses)、またはODBCドライバにアクセスするOCIまたはPro*C/C++インタフェースを使用して、TimesTenと対話します。

- C#アプリケーションはTimesTenデータベース用のOracle Data Provider for .NETサポートを介してTimesTenと対話します。

次の点について考慮します。

- ODBCドライバに直接リンクするアプリケーションでは、ダイレクト・ドライバにリンクしているか、クライアント・ドライバにリンクしているかにかかわらず、リンクしているドライバのみ使用できます。いずれかのTimesTenドライバに直接リンクするアプリケーションでは、複数のデータベースに同時に接続できます。

- TimesTenダイレクト・ドライバでは、複数のTimesTenデータベース(すべて同じバージョンのTimesTen)への複数の接続がサポートされています。

- TimesTenクライアント・ドライバ(クライアント/サーバー接続を支援するために使用)では、複数のTimesTenデータベース(それぞれが異なるバージョンのTimesTenでも可能)への複数の接続がサポートされています。

このオプションの場合、ドライバ・マネージャにリンクする場合と比較すると、柔軟性は低くなりますがパフォーマンスは向上します。

- ドライバが別のデータベース用である場合でも、同じアプリケーション内で複数のODBCドライバとアプリケーションをリンクできます。アプリケーションが複数のODBCドライバをロードする場合、アプリケーションでWindows ODBCドライバ・マネージャなどのドライバ・マネージャを使用する必要があります。
また、TimesTenダイレクト・ドライバおよびTimesTenクライアント・ドライバの両方を使用する必要がある場合は、複数のドライバが必要になることがあります。

Windows ODBCドライバ・マネージャは、実行時にODBCドライバを動的にロードします。ただし、ODBCドライバ・マネージャを使用する場合は、ランタイム・オーバーヘッドが増大し、アプリケーションのパフォーマンスに影響が出る場合があるため、ODBCドライバ・マネージャを使用する利点を十分検討してください。

注意:
ODBCドライバ・マネージャを使用しているアプリケーションで、XLAは使用できません。

TimesTenドライバ・マネージャを使用するアプリケーションのコンパイル方法の詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』のアプリケーションのコンパイルおよびリンクに関する説明、『Oracle TimesTen In-Memory Database Java開発者ガイド』のJavaアプリケーションのコンパイルに関する説明および『Oracle TimesTen In-Memory Database TTClassesガイド』のアプリケーションのコンパイルおよびリンクに関する説明を参照してください。

次の項では、TimesTenデータベースの定義方法について説明します。

- TimesTen ODBCドライバを使用した接続

- TimesTen JDBCドライバおよびドライバ・マネージャを使用した接続

TimesTen ODBCドライバを使用した接続

TimesTenには次のODBCドライバが含まれています。

- TimesTen Data Managerドライバ: 直接接続のアプリケーションで使用するTimesTen ODBCドライバ。

- TimesTenクライアント・ドライバ: クライアント/サーバー・アプリケーションで使用するTimesTen Client ODBCドライバ。

TimesTenには、次の2つのバージョンのData Manager ODBCドライバが含まれています。

- 本番: ほぼすべてのアプリケーション開発およびすべてのデプロイメントには、本番バージョンのTimesTen Data Managerドライバを使用します。

- デバッグ: デバッグ・バージョンのTimesTen Data Managerドライバは、TimesTenで問題が発生した場合にのみに使用します。このバージョンは、内部エラーのチェックも行うため、本番バージョンより処理が遅くなります。UNIXの場合は、追加のデバッグ情報を表示するために、TimesTenデバッグ・ライブラリを-gオプションでコンパイルします。

Windowsの場合、本番バージョンのTimesTen Data Managerがデフォルトでインストールされます。デバッグ・バージョンをインストールするには、「Custom」セットアップを選択します。TimesTen Clientドライバをインストールするには、「Typical」または「Custom」のいずれかを選択します。

表1-1に、Windows用のODBCドライバを示します。

表1-1 Windowsプラットフォーム用に提供されているODBCドライバ

環境

バージョン

名前

Windows

本番

TimesTen Data Manager 11.2.2 Driver。

Windows

デバッグ

TimesTen Data Manager 11.2.2 Debug Driver。

Windows

クライアント

TimesTen Client 11.2.2 Driver。

UNIXの場合、インストール時に選択したオプションに応じて、TimesTenは、クライアント・ドライバまたは本番バージョンおよびデバッグ・バージョンのTimesTen Data Manager ODBCドライバがインストールされることがあります。

表1-2に、UNIXプラットフォーム用のTimesTen ODBCドライバを示します。

表1-2 UNIXプラットフォーム用に提供されているODBCドライバ

環境

バージョン

場所および名前

Solaris

Linux

本番

install_dir/lib/libtten.so

TimesTen Data Manager 11.2.2 Driver。

Solaris

Linux

デバッグ

install_dir/lib/libttenD.so

TimesTen Data Manager 11.2.2 Debug Driver。

Solaris

Linux

クライアント

install_dir/lib/libttclient.so

TimesTen Client 11.2.2 Driver。

AIX

本番

install_dir/lib/libtten.a

TimesTen Data Manager 11.2.2 Driver。

AIX

デバッグ

install_dir/lib/libttenD.a

TimesTen Data Manager 11.2.2 Debug Driver。

AIX

クライアント

install_dir/lib/libttclient.a

TimesTen Client 11.2.2 Driver。

TimesTen JDBCドライバおよびドライバ・マネージャを使用した接続

JDBCを使用すると、JavaアプリケーションからTimesTenにSQL文を実行し、結果を処理できるようになります。これは、Javaプログラミング言語でデータにアクセスする主要なインタフェースです。JDBCは、TimesTenのインストール時にTimesTen Data Managerとともにインストールされます。

図1-1に示すとおり、TimesTen JDBCドライバは、ODBCドライバを使用してTimesTenデータベースにアクセスします。このドライバは、JDBCメソッドごとに一連のODBC関数を実行して適切な処理を行います。JDBCはすべてのデータベース処理でODBCに依存するため、JDBCを使用する場合の最初の手順は、TimesTenデータベースおよびJDBCのかわりにTimesTenデータベースにアクセスするODBCドライバの定義になります。

TimesTen JDBC APIは、TimesTenネイティブAPIにブリッジするためのネイティブ・メソッドを使用して実装され、複数のドライバが異なるデータベースに接続できるドライバ・マネージャを備えています。DriverManagerクラスのJDBCドライバ・マネージャは、ロード済で、Javaアプリケーションで使用可能なすべてのJDBCドライバの情報を追跡します。Javaアプリケーションを使用すると、複数のドライバのロードおよび各ドライバへの個別接続を実行できます。たとえば、TimesTen Client JDBCドライバおよびTimesTenダイレクト・ドライバの両方を1つのアプリケーションでロードできます。その後、Javaアプリケーションによって、ローカル・システムまたはリモート・システムのいずれかのデータベースに接続できます。

TimesTenでサポートされているJava関数のリストは、『Oracle TimesTen In-Memory Database Java開発者ガイド』のjava.sqlパッケージのインタフェースのサポートに関する説明を参照してください。

TimesTenデータベースを識別するためのデータソース名の指定

アプリケーションから接続する場合は、データソース名(DSN)を使用して、接続先となる特定のTimesTenデータベースを一意に識別します。具体的に、DSNは、TimesTenデータベースを識別する名前(文字列)で、データベースへの接続時に使用する接続属性の集まりです。Windowsの場合、データベースへのアクセスに使用するODBCドライバもDSNで指定します。

また、ユーザーまたはアプリケーションのいずれかがDSNを指定しなかった場合や接続時にodbc.iniファイルに定義されていなかったDSNを指定した場合に使用可能なデフォルトDSNを定義することもできます。詳細は、「デフォルトDSNの設定」を参照してください。

注意:
ユーザーが、権限のない接続属性(初期接続属性など)を持つDSNを使用しようとすると、エラーが表示されます。初期接続属性の権限の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の接続属性に関する説明を参照してください。

DSNではTimesTenデータベースを一意に識別しますが、データベースは複数のDSNが参照できます。このような一意のDSN間で異なる点は、データベースへの接続属性の指定です。これによって、1つのデータベースの様々な接続構成に対してわかりやすい名前が付きます。

注意:
ODBC標準に従うと、ある属性が接続文字列内に複数回出現する場合、指定されている最初の値が使用され、後続値は使用されません。

DSNには次の特性があります。

- 最大長は32文字です。

- 大文字と小文字は区別されません。

- ()[]{},;?*=!@\/を除くASCII文字で構成されます。

- TimesTenではDSNの一部としてスペースを使用することを推奨しません。DSNにスペースが含まれている場合、一部のTimesTenユーティリティはスペースに遭遇したところでDSNを切り捨てます。さらに、DSNをスペースで開始または終了したり、スペースのみで構成することはできません。

次の項では、DSNの構成および管理方法について説明します。

- ユーザーDSNおよびシステムDSNの概要

- 直接接続またはクライアント/サーバー接続用のDSNの定義

- Data Manager DSNまたはサーバーDSN用の接続属性

ユーザーDSNおよびシステムDSNの概要

DSNは2層の命名システムで解決され、TimesTenはまず定義済ユーザーDSN内で、次に定義済システムDSNでDSNの解決を試みます。

- ユーザーDSNは、このDSNを作成したユーザーのみが使用できます。

- Windowsの場合、ユーザーDSNは「ODBC データソース アドミニストレータ」の「ユーザー DSN」タブで定義します。

- UNIXでは、ユーザーDSNはユーザーのodbc.iniファイルで定義します。TimesTenによるこのファイルの特定では、まずファイルがODBCINI環境変数で指定されているかを検索します。ない場合、TimesTenは$HOME/.odbc.iniファイルを特定します。

ユーザーDSNは、作成したユーザーのみが使用できますが、使用を制限されるのはDSN(文字列名およびその属性)のみです。基礎となるデータベースは、他のユーザーのユーザーDSNまたはシステムDSNで参照できます。

TimesTenでは、TimesTen Data ManagerとTimesTen Clientの両方のデータソースを.odbc.iniファイルでサポートしています。

- システムDSNは、TimesTenデータベースへの接続用にシステムDSNが定義されているシステム上ですべてのユーザーが使用できます。

- Windowsの場合、システムDSNは、「ODBC データソース アドミニストレータ」の「システム DSN」タブで定義します。

- UNIXの場合、システムDSNは、システムodbc.iniファイルと呼ばれるsys.odbc.iniファイルに定義されます。TimesTenはシステムDSNファイルの場所を次の順序で特定します。

- ファイルがSYSODBCINI環境変数で指定されている場合、そのファイルが特定されます。

- root以外のインストールでは、ファイルはinstall_dir/info/sys.odbc.iniにあります。rootインストールでは、/var/TimesTen/InstanceName/sys.odbc.iniにあります。

- rootまたはroot以外の場所のいずれでも見つからない場合、TimesTenは/var/TimesTen/sys.odbc.iniファイルを検索します。

- これらのいずれの場所でも見つからない場合、TimesTenはシステム上で/etc/odbc.iniファイルを参照します。

直接接続またはクライアント/サーバー接続用のDSNの定義

DSNは、ローカル・データベースやリモート・データベースを一意に識別するために作成します。直接接続またはクライアント/サーバー接続用に使用するDSNのタイプを次に説明します。

- Data Manager DSN: ローカル・データベースを指定するDSNは、ダイレクト・ドライバであるTimesTen Data Manager ODBCドライバを使用します。本番バージョンまたはデバッグ・バージョンのTimesTen Data Managerドライバを使用できます。
Data Manager DSNは、パス名およびファイル名の接頭辞を使用してデータベースを参照します。データベースのパス名は、C:\data\chns\AdminDSや/home/chns/AdminDSなど、データベースが格納されているディレクトリの場所およびデータベースの接頭辞を示します。

注意:
このパス名および接頭辞は、ファイル名を定義するものではなく、データベースが格納されているディレクトリの場所およびすべてのデータベース・ファイルの接頭辞を示しています。データベースが使用する実際のファイルにはC:\data\chns\AdminDS.ds0や/home/chns/AdminDS.log2など接尾辞が付きます。

指定したTimesTenデータベースを参照するData Manager DSNは、データベースが存在するシステムと同じシステムで定義する必要があります。TimesTenによって、各データベースにdsName.resnファイルが作成されます。これらのファイルは、ログを維持するためにTimesTenによって内部的に使用されます。

同じデータベースを複数のData Manager DSNで参照している場合、他のパス名で同じ場所を識別できても、必ず同一のデータベース・パス名を使用する必要があります。たとえば、1つのDSNでデータベースを参照するシンボリック・リンクを使用し、別のDSNで実際のパス名を使用することはできません。Windowsの場合、マップしたドライブ文字はデータベースのパス名に指定できません。

- クライアントDSN: クライアントDSNではリモート・データベースを指定し、TimesTenクライアントを使用します。クライアントDSNは、hostname、DSNのペアを指定して間接的にTimesTenデータベースを参照します(ここで、hostnameはTimesTenサーバーが実行しているサーバー・システムを表し、DSNはサーバー・ホスト上のTimesTenデータベースを指定するサーバーDSNを表します)。

- サーバーDSN: サーバーDSNは常にシステムDSNとして定義され、クライアント・アプリケーションがアクセス可能な、そのサーバー上の各データベースのサーバー・システム上で定義されます。サーバーDSNの形式および属性は、Data Manager DSNのものと似ています。

UNIXの場合、特定のユーザーが作成したすべてのユーザーDSN(クライアントDSNおよびData Manager DSNの両方)は、同じユーザーodbc.iniファイルで定義されます。同様に、すべてのシステムDSNは同じシステムodbc.iniファイルで定義されます。

次の表に、TimesTenでサポートされているDSNタイプ、ユーザーDSNとシステムDSNのいずれを作成するか、およびDSNの場所を示します。

DSNタイプ

ユーザーDSNかシステムDSNか

DSNの場所

Data Manager DSN

ユーザーDSNまたはシステムDSN

データベースがあるシステム上にあります。

クライアントDSN

ユーザーDSNまたはシステムDSN

任意のローカルまたはリモート・システム上にあります。

サーバーDSN

システムDSN

データベースがあるシステム上にあります。

クライアントDSNおよびサーバーDSNの詳細は、「TimesTen ClientおよびTimesTen Serverの使用方法」を参照してください。

Data Manager DSNまたはサーバーDSN用の接続属性

TimesTen Data Manager DSNまたはサーバーDSN属性には次の4つのタイプがあります。

注意:
すべての属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の接続属性に関する説明を参照してください。

- データ・ストア属性は、データベースの作成時にデータベースに関連付け、その後の接続では変更できません。変更するには、データベースを破棄して作成しなおす必要があります。
最もよく使用されるデータ・ストア属性は、次のとおりです。

- DataStore: データベースのディレクトリ名およびファイル名の接頭辞。

- LogDir: データベースのトランザクション・ログ・ファイルのディレクトリ名。デフォルトでは、トランザクション・ログ・ファイルはチェックポイント・ファイル・ディレクトリに入っています。トランザクション・ログ・ファイルおよびチェックポイント・ファイルを別々のディスクに保存すると、システムのスループットが向上する場合があります。

- DatabaseCharacterSet: ストレージ・エンコーディングを定義する必須のキャラクタ・セット指定。

- 初期接続属性は、TimesTenデータベースがメモリーにロードされる際に使用されます。初期接続属性の設定でデータベースをロードできるのは、インスタンス管理者のみです。デフォルトでは、最初の接続が確立されたときにはアイドル・データベース(接続のないデータベース)がメモリーにロードされます。これらの属性は、データベースへの最後の接続がクローズされるまで、後続のすべての接続で保持されます。初期接続属性は、TimesTenデータベースをアンロードしてから、インスタンス管理者が初期接続属性に異なる値を使用して再接続しないかぎり、変更できません。
最もよく使用される初期接続属性は、次のとおりです。

- PermSize: データベースの永続メモリー領域の割当て済サイズを構成します。永続メモリー領域には、永続データベース要素が含まれています。TimesTenでは、チェックポイント処理の際に、永続メモリー領域のみがディスクに書き込まれます。

- TempSize: データベースの一時メモリー領域の割当て済サイズを構成します。一時メモリー領域には、文の実行時に生成された一時データが含まれます。

注意:
ご使用のシステムには、データベース全体を格納できるだけの十分なメイン・メモリーが必要です。領域サイズの設定の詳細は、「データベースのサイズ指定」を参照してください。

- 一般接続属性は、接続のたびに設定され、その接続期間中のみ保持されます。各同時接続には別の値を設定できます。
最もよく使用される一般接続属性は、次のとおりです。

- UID: 直接またはクライアント/サーバー接続を使用してデータベースへの接続に使用されるユーザー名を指定します。インスタンス管理者として、または外部ユーザーとして接続する場合、ユーザー名を指定する必要はありません。ユーザー名を指定しない場合、TimesTenはUIDがオペレーティング・システムで指定されたユーザー名であると想定します。

- PWD: 指定されているUIDに対応するパスワードを指定します。内部ユーザーの場合、指定したDSNのodbc.iniファイルで、または接続文字列でPWD属性を設定しないと、パスワードを要求されます。外部ユーザーの場合は、オペレーティング・システムによって検証されるので、パスワードを指定する必要はありません。
クライアント/サーバー接続を開始すると、接続用に送信されるパスワードはすべて、クライアント/サーバー・プロトコルで暗号化されます。

注意:
UIDとPWDの一般接続属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のUIDとPWDに関する項を参照してください。インスタンス管理者、外部ユーザー、内部ユーザーの詳細は、「ユーザー管理による認証の制御」を参照してください。

- PWDCrypt: 指定したUIDに対応する、暗号化されたパスワードを指定します。

注意:
接続文字列の接続属性を指定すると、DSNの接続属性が上書きされます。詳細は、「接続文字列を使用したデータベース接続」を参照してください。

- TimesTenキャッシュ属性では、TimesTenにロードされるデータのロード元であるOracle DatabaseインスタンスのOracleサービス識別子を入力できます。

注意:
TimesTen Client ODBCドライバで使用可能な接続属性については、「TimesTen ClientおよびTimesTen Serverの使用方法」を参照してください。

Windowsの場合、「ODBC データソース アドミニストレータ」で属性を指定します。

UNIXの場合、odbc.iniファイルで属性を指定します。odbc.iniファイルに指定されていない属性に対しては、デフォルト値が使用されます。

Data Manager DSNの定義

次の項では、次のいずれかのプラットフォームでData Manager DSNを作成する方法について説明します。

- WindowsでのData Manager DSNの作成

- UNIXでのData Manager DSNの作成

WindowsでのData Manager DSNの作成

次の項では、WindowsでDSNを作成する方法について説明します。

- ODBCドライバの指定

- Data Manager DSNの指定

- 接続属性の指定

注意:
Data Manager DSNの設定に関する追加の例は、「DSNの例」を参照してください。

ODBCドライバの指定

「ODBC データソース アドミニストレータ」でODBCドライバを指定します。

注意:
JDBCユーザーは、JDBCドライバで使用するODBCドライバを指定する必要があります。「TimesTen JDBCドライバおよびドライバ・マネージャを使用した接続」を参照してください。

1. Windowsデスクトップで、「スタート」→「設定」→「コントロール パネル」→「管理ツール」→「データ ソース (ODBC)」を選択します。「ODBC データソース アドミニストレータ」が開きます。

注意:
64ビットのWindowsシステムで32ビットのTimesTenインストールを使用している場合、次の実行可能ファイルから32ビットのODBC Data Source Administratorを起動してください。

C:\WINDOWS\SysWOW64\odbcad32.exe

2. ユーザーDSNまたはシステムDSNのどちらを作成するか選択します。ユーザーDSNおよびシステムDSNについては、「ユーザーDSNおよびシステムDSNの概要」を参照してください。

3. 次のいずれかを実行します。

- 既存のTimesTenデータソースを選択して、「構成」をクリックします。

- 「追加」をクリックします。次に、適切なTimesTenドライバをリストから選択します。「完了」をクリックします。これによって、「TimesTen ODBC Setup」ダイアログ・ボックスが表示されます。

注意:
TimesTen ODBCドライバのリストは、「TimesTen ODBCドライバを使用した接続」を参照してください。

Data Manager DSNの指定

「TimesTen ODBC Setup」ダイアログ・ボックスの「Data Store」タブで、データソース名(DSN)、データベース・ディレクトリのパスと接頭辞、およびデータベース・キャラクタ・セットを指定します。データベース・ディレクトリのパスは、マップしたドライブを参照できません。図1-2を参照してください。

図1-2 「Data Store」タブ

DSN、データベース・パス、接頭辞の詳細は、「TimesTenデータベースを識別するためのデータソース名の指定」を参照してください。データベース・キャラクタ・セットについては、「データベース・キャラクタ・セットの選択」を参照してください。説明フィールドはオプションです。

接続属性の指定

図1-3、図1-4および図1-5で示すとおり、「TimesTen ODBC Setup」ダイアログ・ボックスの「First Connection」タブ、「General Connection」タブ、「NLS Connection」で適切な接続属性を指定します。さらに、Oracle DatabaseにTimesTen Cacheを使用している場合は、図1-6に示す接続属性を指定します。マルチスレッドのクライアント/サーバー構成を使用している場合は、図1-7に示す接続属性を指定します。

注意:
接続属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の接続属性に関する説明を参照してください。

図1-3 初期接続属性

図1-4 一般接続属性

図1-5 NLS接続属性

図1-6 TimesTen Cache属性

図1-7 サーバー属性

図 1-8 PL/SQL属性

終了後、「OK」をクリックします。

UNIXでのData Manager DSNの作成

この項の内容は次のとおりです。

- ユーザーodbc.iniファイルまたはシステムodbc.iniファイルの作成

- データベースのパス名での環境変数の使用方法

注意:
DSNの定義に関する例は、「DSNの例」を参照してください。

ユーザーodbc.iniファイルまたはシステムodbc.iniファイルの作成

UNIXの場合、ユーザーDSNは、$HOME/.odbc.iniファイルまたはODBCINI環境変数に指定したファイルで定義します。このファイルは、ユーザーodbc.iniファイルと呼ばれます。システムDSNは、install_dir/info/sys.odbc.ini内のシステムodbc.iniファイルで定義します。

ユーザーおよびシステムのodbc.iniファイルの構文は同じです。構文は、「odbc.iniファイル・エントリの説明」で説明されています。システムodbc.iniファイルは、TimesTenをマシンにインストールすると作成されます。ユーザーodbc.iniファイルはユーザーが独自に作成する必要があります。

DSNを作成するには、次の手順を実行します。

1. odbc.iniファイルでDSNを指定します。DSNは、DSN定義の最初に大カッコで囲み1行で指定します。次に例を示します。

[AdminDS]

2. ODBCドライバを指定します。

注意:
JDBCユーザーは、JDBCドライバで使用するODBCドライバを指定する必要があります。「TimesTen JDBCドライバおよびドライバ・マネージャを使用した接続」を参照してください。

TimesTenドライバを設定するには、odbc.iniファイルでDRIVER属性を指定します。次の例では、このDSNが使用されるように設定されているTimesTen ODBCドライバを示します。

[AdminDS]
DRIVER=install_dir/lib/libtten.so

注意:
使用できるTimesTen ODBCドライバのリストは、表1-2を参照してください。

3. odbc.iniファイルで、データベース・ディレクトリのパスおよび接頭辞を指定します。次の例では、/users/robinをデータベース・ディレクトリのパス、FixedDsをデータベース・ファイルの接頭辞に指定しています。

DataStore=/users/robin/FixedDs

注意:
詳細は、「TimesTenデータベースを識別するためのデータソース名の指定」を参照してください。

「データベースのパス名での環境変数の使用方法」で説明するとおり、データベース・ディレクトリのパスには環境変数を使用できます。

4. データベース・キャラクタ・セットを選択します。次の例では、odbc.iniファイルのデータベース・キャラクタ・セットをUS7ASCIIと定義しています。

DatabaseCharacterSet=US7ASCII

注意:
詳細は、「データベース・キャラクタ・セットの選択」を参照してください。

5. odbc.iniファイルに接続属性を設定します。odbc.iniファイルに指定されていない属性に対しては、デフォルト値が使用されます。

注意:
『Oracle TimesTen In-Memory Databaseリファレンス』の接続属性に関する説明を参照してください。例は、「DSNの例」を参照してください。

データベースのパス名での環境変数の使用方法

データベースのパス名およびトランザクション・ログ・ファイルのパス名の指定に環境変数を使用できます。たとえば、データベースの場所に$HOME/AdminDSを指定できます。

環境変数は、$varnameまたは$(varname)で表現できます。カッコはオプションです。データベースのパス名のバックスラッシュ(\)は、後続の文字をエスケープします。

注意:
環境変数の展開では、データベースに接続しているプロセスの環境を使用します。異なるプロセスでは、同じ環境変数に対して異なる値を指定できるため、データベースのパス名を様々に展開することができます。環境変数は、ユーザーodbc.iniファイルでのみ使用できます。システムodbc.iniファイルでは指定できません。

クライアントDSNおよびサーバーDSNの定義

各プラットフォームにクライアント・サーバーDSNを定義する方法の詳細は、「TimesTen ServerシステムでのサーバーDSNの定義」と「TimesTen ClientシステムでのクライアントDSNの作成」を参照してください。

DSN用の解決パス

TimesTenでは、特定のDSNを解決する際、次の処理が実行されます。

注意:

- 同じ名前を持つユーザーDSNとシステムDSNが存在する場合は、ユーザーDSNを取得します。

- UNIXでは、同じodbc.iniファイルに同じ名前を持つ複数のDSNがある場合、TimesTenは、ファイルで指定された最初のDSNを取得します。

1. 次のファイル内で指定された名前のユーザーDSNを検索します。

1. ODBCINI環境変数で参照されるファイル(環境変数が設定されている場合)。

2. ユーザーのホーム・ディレクトリ内の.odbc.iniファイル(ODBCINI環境変数が設定されていない場合)。

2. 一致するユーザーDSNが検出されない場合は、指定した名前を持つシステムDSNを検索します。

1. SYSODBCINI環境変数で参照されるファイル(この環境変数が設定されている場合)。

2. デーモンのホーム・ディレクトリ内のsys.odbc.iniファイル(SYSODBCINI環境変数が設定されていない場合)。

3. UNIXの場合、非rootインストールでは、ファイルはinstall_dir/info/sys.odbc.iniに入っています。また、rootインストールでは、/var/TimesTen/InstanceName/sys.odbc.iniまたは/var/TimesTen/sys.odbc.iniに入っています。

DSNの例

この項では、データベースの設定方法に関する追加の例を示します。

- デフォルトDSNの設定

- 一時データベースの設定

- DSNでのPL/SQL接続属性の指定

- 単一のデータベースに対する複数DSNの作成

例ごとに、Windowsの「ODBC データソース アドミニストレータ」の設定およびその設定に対応するUNIXのodbc.iniエントリについて説明します。

デフォルトDSNの設定

必要に応じてデフォルトのデータソース定義を追加することもできます。接続時にアプリケーションでodbc.iniファイルにないDSNが指定された場合やアプリケーションでDSNが指定されなかった場合、TimesTenデータベースへの接続はデフォルトDSNを使用して構成されます。

デフォルトのデータソースを定義する際には、名前をdefaultにする必要があります。「DSN 仕様」で説明しているとおり、デフォルトDSNはその他のデータソースと同じ属性を使用して定義できます。

注意:
Windowsプラットフォームでは、「ODBCデータ ソース アドミニストレーター」を使用してデフォルトDSNを作成する場合、「ユーザーDSN」、「システムDSN」、「ファイルDSN」のそれぞれのタブに1つずつしかDSNを指定できません。デフォルトDSNをODBCドライバと関連付ける必要があります。

接続時、TimesTenは次のいずれかのシナリオでデフォルトDSNを使用します。

- 接続文字列にキーワードと値のペアDSN=defaultを指定した場合。

- 接続文字列のDSN接続属性に未定義の値を指定した場合。

- 接続文字列のDSN接続属性に値を指定しなかった場合。

ただし、一般的には特定のデータソースを使用して接続するのが最善です。

デフォルトDSNを使用する場合、ttDestroyユーティリティによるデータベース破棄などDSN名を必要とするTimesTenユーティリティ操作を実行する際に、DSN名としてdefaultと入力してください。

次の例は、ユーザーがttIsqlを呼び出して、未定義のDSNで接続しているところを示します。odbc.iniファイルのdoesNotExistに定義がないため、TimesTenはdefault DSNを使用してデータベースを作成し、そのデータベースに接続を開始します。 この例はまた、DSNにdefaultを指定してttStatusとttDestroyの両方のユーティリティを呼び出しているユーザーも示します。さらに、ユーザーがDSNとしてdefaultのかわりにdoesNotExistを指定した場合のエラーも示します。

$ ttIsql doesNotExist;

Copyright (c) 1996-2011, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.

connect "DSN=doesNotExist";
Connection successful:
Command> exit
Disconnecting...
Done.
]$ ttStatus default
TimesTen status report as of Mon Oct 22 12:27:52 2012

Daemon pid 13623 port 16138 instance myhost
TimesTen server pid 13632 started on port 16140
------------------------------------------------------------------------
Data store /timesten/install/info/default
There are no connections to the data store
Replication policy  : Manual
Cache Agent policy  : Manual
PL/SQL enabled.
------------------------------------------------------------------------
Accessible by group xyz
End of report
$ ttDestroy doesNotExist;
Failed to destroy data store: Specified DSN is not found in user and system
odbc.ini files (or registry)
$ ttDestroy default;

次の例は、デフォルトDSN用の接続属性を構成する方法を示します。必須ではありませんが、他のDSNと同様の方法で、デフォルトDSN用の接続属性を構成できます。これは「ODBC Data Sources」の項には指定されていません。

[ODBC Data Sources]
sampledb_1122=TimesTen 11.2.2 Driver
...

[default]
Driver=install_dir/lib/libtten.so
DataStore=install_dir/info/DemoDataStore/default
PermSize=40
TempSize=64
DatabaseCharacterSet=US7ASCII

[sampledb_1122]
Driver=install_dir/lib/libtten.so
DataStore=install_dir/info/DemoDataStore/sampledb_1122
PermSize=40
TempSize=32
PLSQL=1
DatabaseCharacterSet=US7ASCII

一時データベースの設定

この例では、一時データベースを設定する方法について説明します。一時データベースの詳細は、「データベースの概要」の説明を参照してください。

Windowsの場合、「TimesTen ODBC Setup」ダイアログ・ボックスで一時データベースを設定できます。図1-9および図1-10を参照してください。

図1-9 「Data Store」タブ

図1-10 初期接続属性

UNIXで一時データベースを設定するには、odbc.iniファイルで次のエントリを作成します。すべてのUNIXプラットフォームのドライバのリストは、「TimesTen ODBCドライバを使用した接続」の表を参照してください。

大カッコで囲まれたテキストは、データソース名です。

[TempDs]
Driver=install_dir/lib/libtten.so
DataStore=/users/robin/TempDs
#this is a temporary database
Temporary=1
#create database if it is not found
AutoCreate=1
#log database updates to disk
LogPurge=1
DatabaseCharacterSet=US7ASCII

DSNでのPL/SQL接続属性の指定

PL/SQL一般接続属性の値を指定できます。

注意:
すべてのPL/SQL接続属性の完全なリストは、『Oracle TimesTen In-Memory Databaseリファレンス』の接続属性に関する説明を参照してください。

PL/SQL接続属性には次のものがあります。

- PLSCOPE_SETTINGS: PL/SQLコンパイラで相互参照情報を生成するかどうかを制御します。

- PLSQL_OPTIMIZE_LEVEL: PL/SQLライブラリ・ユニットのコンパイルに使用する最適化レベルを設定します。

- PLSQL_MEMORY_ADDRESS: TimesTenダイレクト・ドライバを使用する各プロセスにPL/SQL共有メモリー・セグメントがロードされる場所を示す仮想アドレス(16進値)を指定します。このメモリー・アドレスは、データベースへのすべての接続、およびデータベースに接続するすべてのプロセスで同じである必要があります。

- PLSQL_MEMORY_SIZE:PL/SQL共有メモリー・セグメントのサイズ(MB)を定義します。

次の例では、PLdsn DSNを作成し、PLSQLを1に設定してPL/SQLを有効にし、PL/SQL共有メモリー・セグメントのサイズを32MBに設定します。

[PLdsn]
Datastore=/users/user1/PLdsn
PermSize=32
DatabaseCharacterSet=AL32UTF8
ConnectionCharacterSet=AL32UTF8
PLSQL=1
PLSQL_MEMORY_SIZE=32

この他の例は、『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』のPL/SQL接続属性に関する説明を参照してください。

単一のデータベースに対する複数DSNの作成

異なる接続属性を持ち、同じデータベースを参照する複数のDSNを作成できます。

この例では、AdminDSNおよびGlobalDSNの2つのDSNを作成します。これらのDSNは、接続キャラクタ・セット以外は同じです。US7ASCIIキャラクタ・セットを使用するアプリケーションは、AdminDSNを使用することによってTTDSデータベースに接続できます。マルチバイト文字を使用するアプリケーションは、GlobalDSNを使用してTTDSデータベースに接続できます。

Windowsの場合、ODBCデータソース・アドミニストレータを使用して、図1-11に示すようにAdminDSNを定義します。AdminDSNは、AL32UTF8データベース・キャラクタ・セットを使用して作成されます。図1-12は、US7ASCIIがAdminDSNの接続キャラクタ・セットであることを示しています。

図1-11 TTDSデータベースを使用したAdminDSNの作成

図1-12 AdminDSNの接続キャラクタ・セットの設定

図1-13に示すように、GlobalDSNもAL32UTF8データベース・キャラクタ・セットを使用して作成されます。図1-14は、GlobalDSNの接続キャラクタ・セットがAL32UTF8であることを示しています。

図1-13 TTDSデータベースを使用したGlobalDSNの作成

図1-14 GlobalDSNの接続キャラクタ・セットの設定

次の例では、UNIXでDSNを指定する方法を示しています。ここでは、Solaris用のTimesTen Data Manager ODBCドライバを使用します。

大カッコで囲まれたテキストは、データソース名です。

[AdminDSN]
Driver=install_dir/lib/libtten.so
Datastore=/data/TTDS
DatabaseCharacterSet=AL32UTF8
ConnectionCharacterSet=US7ASCII

[GlobalDSN]
Driver=install_dir/lib/libtten.so
DataStore=/data/TTDS
DatabaseCharacterSet=AL32UTF8
ConnectionCharacterSet=AL32UTF8

odbc.iniファイル・エントリの説明

次の項では、odbc.iniファイルのエントリについて説明します。

- ODBCデータソース

- DSNの指定

- odbc.iniファイルの例

ODBCデータソース

オプションのODBC Data Sourcesセクションの各エントリは、データソースおよび使用するドライバの記述が示されます。このデータソース・セクションの形式は、次のとおりです。

[ODBC Data Sources]
DSN=driver-description

- DSNは必須で、ドライバが接続するデータソースを識別します。この名前を選択します。

- driver-descriptionは必須です。これは、データソースに接続するドライバについての説明です。

オプションのData SourcesセクションがTimesTen ServerのシステムDSNファイルに含まれる場合、クライアントDSNの設定時に使用されます。すべてのシステムDSNは、TimesTen Serverで使用できるすべてのDSNを表示する、クライアントのODBCデータソース・アドミニストレータ用のクライアントDSN設定に使用できます。ユーザーは、いつでもODBC データソース アドミニストレータで新しいシステムDSNを追加できます。DSNをシステムDSNファイルに追加する場合は、クライアントに公開できるDSNのみを含めるようにしてください。すべてのシステムDSNは、公開されていないものも、クライアント/サーバー構成からアクセスできる場合があります。

DSNの指定

ODBC Data Sourcesセクションに示される各DSNには、専用のDSN指定があります。Data Manager DSNのDSN指定の形式は、表1-3で示すとおりです。

表1-3 データ・ソース指定の形式

コンポーネント

説明

[DSN]

DSNは必須です。これは、.odbc.iniファイルのODBC Data Sourcesセクションに指定されているDSNの名前です。

Driver=driver-path-name

データソースとリンクされているTimesTen Data Managerドライバ。これが関連するのは、ドライバ・マネージャを使用している場合、またはクライアント/サーバーの使用例におけるサーバーの場合です。

DataStore=data-store-path-prefix

アクセスできるデータベースのディレクトリ・パスと接頭辞です。これは必須です。

DatabaseCharacterSet=Database-character-set

データベースのキャラクタ・セットにより、データを格納する際のキャラクタ・セットが決定されます。データベースのキャラクタ・セットは必要であり、データベースの作成後に変更することはできません。詳細は、「データベース・キャラクタ・セットの選択」を参照してください。

オプションの属性

属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の接続属性に関する説明を参照してください。

たとえば、sampledb_1122というDSNの指定は、次のようになります。

[sampledb_1122]
Driver=install_dir/lib/libtten.so
DataStore=install_dir/info/DemoDataStore/sampledb_1122
...

TimesTenクライアントDSNのデータベース指定は、表1-4で示す形式になっています。

注意:
ここではTimesTenクライアントDSNの構文を示していますが、クライアントDSNおよびサーバーDSNの詳細な設定方法については、「TimesTen ServerシステムでのサーバーDSNの定義」と「TimesTen ClientシステムでのクライアントDSNの作成」を参照してください。

表1-4 TimesTen Clientを構成するデータベース指定

コンポーネント

説明

[DSN]

DSNは必須です。これは、.odbc.iniファイルのODBC Data Sourcesセクションに指定されているのと同じDSNです。

TTC_Server=server-name

server-nameは必須です。これは、TimesTen ServerのDNS名、ホスト名、IPアドレスまたは論理サーバー名です。

TTC_Server_DSN=server-DSN

server-DSNは必須です。これは、TimesTen Server上でアクセスするデータソースの名前です。

TTC_Timeout=value

クライアント接続のタイムアウト値(秒)。

注意:
ほとんどのTimesTen Data Manager属性は、TimesTen Clientデータベースでは無視されます。

たとえば、TimesTen Server ttserver上のsampledb_1122に接続するクライアント/サーバーのデータソースsampledbCS_1122の場合、データソース指定は次のようになります。

[sampledbCS_1122]
TTC_Server=ttserver
TTC_SERVER_DSN=sampledb_1122
TTC_Timeout=30

odbc.iniファイルの例

次の例は、UNIXの.odbc.iniファイル(一部)を示します。

...
[ODBC Data Sources]
sampledb_1122=TimesTen 11.2.2 Driver
...

[sampledb_1122]
Driver=install_dir/lib/libtten.so
DataStore=install_dir/info/DemoDataStore/sampledb_1122
PermSize=40
TempSize=32
PLSQL=1
DatabaseCharacterSet=US7ASCII
...

########################################################################
# This following sample definitions should be in the .odbc.ini file
# that is used for the TimesTen 11.2.2 Client.
# The Server Name is set in the TTC_SERVER attribute.
# The Server DSN is set in the TTC_SERVER_DSN attribute.
#########################################################################

[ODBC Data Sources]
sampledbCS_1122=TimesTen 11.2.2 Client Driver
...

[sampledbCS_1122]
TTC_SERVER=localhost
TTC_SERVER_DSN=sampledb_1122
...

接続文字列を使用したデータベース接続

TimesTenアプリケーションでは、データベースに接続するためにDSNまたは接続文字列を指定する必要があります。モジュール性および保守を考えると、特定の接続で特定の属性設定によってDSN設定またはデフォルト設定を上書きする必要がある場合を除いて、属性はアプリケーション内の接続文字列ではなくDSNで設定することをお薦めします。

接続文字列の構文には、接続属性の定義が含まれます。ここでは各属性はセミコロンで区切られています。

DSN属性の設定を決定するには、次の優先ルールを使用します。

1. 接続文字列で指定された属性設定は、優先度が最も高くなります。属性が接続文字列に複数回指定されている場合は、最初の指定が使用されます。

2. 属性が接続文字列で指定されていない場合は、DSNで指定された属性設定が使用されます。

3. デフォルトの属性設定は、優先度が最も低くなります。

接続文字列にDriver、DataStoreおよびDatabaseCharacterSetの各属性が含まれている場合は、ODBCアプリケーションまたはttIsqlユーティリティを使用してDSNを事前に定義しなくても、TimesTenデータベースに接続できます。接続文字列を次のように定義します。

- Driver属性を使用したODBCドライバの名前またはパス名。

- Windowsの場合、Driver属性の値はTimesTen ODBCドライバの名前にする必要があります。たとえば、TimesTen Data Manager 11.2.2などです。

- UNIXの場合、Driver属性の値はTimesTen ODBCドライバの共有ライブラリ・ファイルのパス名にする必要があります。このファイルは、install_dir/libディレクトリにあります。

- DataStore属性を使用したデータベースのパスおよびファイル名の接頭辞。

- DatabaseCharacterSet属性を使用したデータベースのキャラクタ・セット。

次の例では、ttIsqlユーティリティで接続文字列を使用して、Driver、DataStoreおよびDatabaseCharacterSet属性を指定して接続する方法を示します。

C:\ ttIsql
Copyright (c) 1996-2011, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.
Command> connect "Driver=TimesTen Data Manager
11.2.2;DataStore=C:\sales\admin;DatabaseCharacterSet=US7ASCII";

RAMポリシーの指定

TimesTenでは、データベースをメイン・メモリーにロードまたはアンロードするタイミングを決定するRAMポリシーを指定できます。データベースごとに個別のRAMポリシーを設定できます。

RAMポリシーのオプションは次のとおりです。

- inUse: データベースは、データベースへの最初の接続をオープンするとメモリーにロードされ、1つ以上の接続がオープンしているかぎり、メモリーに常駐したままになります。データベースへの最後の接続をクローズすると、データベースはメモリーからアンロードされます。これがデフォルトのポリシーです。

- inUse with RamGrace: データベースは、データベースへの最初の接続をオープンするとメモリーにロードされ、1つ以上の接続がオープンしているかぎり、メモリーに常駐したままになります。データベースへの最後の接続をクローズすると、猶予期間中、データベースはメモリーに常駐したままになります。データベースは、猶予期間中データベースに接続されているプロセスがない場合にのみメモリーからアンロードされます。猶予期間は、随時設定および再設定できます。猶予期間は、次に猶予期間が変更されるまでのみ有効です。

- always: データベースはメモリーに常駐したままになります。TimesTenデーモンは再起動すると、データベースを自動的に再ロードします。リカバリ不能なエラー条件が発生しないかぎり、必ずデータベースは自動的に再ロードされます。データベース・エラーのリカバリに関する詳細は、「自動リカバリ失敗後のRAMポリシーの変更」を参照してください。

- 「manual」: データベースはシステム管理者によって手動でロードおよびアンロードされます。ロードされると、管理者がデータベースをアンロードするまで、またはリカバリ不能なエラー条件が発生しないかぎり、TimesTenによってデータベースはロードされたままになります。データベース・エラーのリカバリに関する詳細は、「自動リカバリ失敗後のRAMポリシーの変更」を参照してください。

システム管理者は、RAMポリシーを設定するか、ttAdminユーティリティまたはC API RAMポリシー・ユーティリティを使用してデータベースを手動でロードまたはアンロードします。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttAdminに関する説明または『Oracle TimesTen In-Memory Database C開発者ガイド』のTimesTenユーティリティAPIに関する説明を参照してください。

注意:
デフォルトでは、致命的なエラー後のデータベースの自動リカバリが失敗した場合、TimesTenはalwaysおよびmanual RAMポリシーをInUseに変更して、失敗の再発を防止します。RAMポリシーの変更を防止する方法に関する詳細は、「自動リカバリ失敗後のRAMポリシーの変更」を参照してください。

次の例では、ttdata DSNで識別されるデータベースについてRAMポリシーをalwaysに設定します。

注意:
1行目で、RAMレジデント・ポリシーがalwaysに設定されています。その他の出力には、ttAdminユーティリティで設定できる他のポリシーも示されています。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス・ガイド』のttAdminに関する説明を参照してください。

% ttadmin –rampolicy always ttdata
RAM Residence Policy            : always
Replication Agent Policy        : manual
Replication Manually Started    : False
Cache Agent Policy              : manual
Cache Agent Manually Started    : False

自動リカバリ失敗後のRAMポリシーの変更

致命的なエラーによってデータベースが無効になり、TimesTenによって実行された自動データベース・リカバリが失敗した場合、デフォルトでは以下が発生します。

- TimesTenは、alwaysおよびmanual RAMポリシーをInUseに変更して、エラーの再発を防止します。alwaysとmanual RAMポリシーのどちらの場合でも、TimesTenは、同じ障害が複数回発生していても、障害ごとにデータベースをリロードします。ただし、InUse RAMポリシーの場合は、プロセスが接続を試みるまでTimesTenは自動的にデータベースをリロードしません。

- 致命的なエラーが原因でデータベースが無効化された場合、このデータベースに接続されたユーザー・プロセスは、データベースが無効化されたことを認識できないときがあります。この場合、すべてのユーザー・プロセスが接続を閉じるまで、無効化されたデータベースがメモリー上に存在します。したがって、無効化されたデータベースと新しくリロードされたデータベースの両方がメモリーに共存することがあります。

注意:
無効なデータベースがメモリーにまだ存在している間に大きなデータベースをメモリーにリロードすると、使用可能RAMが一杯になることがあります。データベースの自動リロードを防止する方法の詳細は、「自動リカバリ失敗後のデータベースのリロードを防止する」を参照してください。

TimesTenデーモンを開始する前に、ttendaemon.optionsファイルの-enablePolicyInactiveオプションを設定して、データベースのリカバリ動作を変更できます。設定すると、自動リカバリが失敗したときの動作は次のようになります。

- manualおよびalwaysのRAMポリシーには変更はありません。

- レプリケーション・エージェントとキャッシュ・エージェントは再起動されません。

- データベースのリロードが数回失敗すると、TimesTenはpolicyInactiveモードを設定し、データベースのロードがそれ以上試行されないようにします。

次のいずれかによってpolicyInactiveはクリアされ、通常の動作に戻ります。

- TimesTenデーモンが再起動する。

- プロセスが正常に接続される。

- 管理者がデータベースのttAdminコマンドを実行し、RAMポリシーの変更、RAMロードの実施、キャッシュまたはレプリケーション・エージェントの開始のいずれかを行う。

次のメッセージのいずれかがttStatus出力に表示されることで、policyInactiveモードがアクティブかどうかを確認できます。

- 「Automatic reloads disabled.」

- 「Data store should be manually loaded, but inactive due to failures.」。RAMポリシーがmanualの場合に表示されます。

- 「Data store should be loaded, but inactive due to failures.」。RAMポリシーがalwaysの場合に表示されます。

自動リカバリ失敗後のデータベースの自動リロードを防止する

致命的なエラーが原因でデータベースが無効化された後、TimesTenは、データベースがRAMポリシー、キャッシュ・エージェントのポリシーおよびレプリケーション・エージェントのポリシーの設定と一貫性を維持しているかぎり、データベースのリロードとリカバリを試みます。ただし、ユーザー・プロセスは、データベースの無効化を認識していない場合に引き続きデータベースに接続されていることがあります。この場合、すべてのユーザー・プロセスが接続を閉じるまで、無効化されたデータベースがメモリー上に存在します。したがって、無効化されたデータベースと新しくリロードされたデータベースの両方がメモリーに共存することがあります。データベースが大きい場合、これが問題になることがあります。

注意:
データベースのリロードとリカバリを実行するかどうかはRAMポリシーによって決定されるだけでなく、キャッシュ・エージェントとレプリケーション・エージェントも無効化後にデータベースをリロードするかどうかの要素になります。障害の後にデーモンがエージェントを自動的に再起動するようにキャッシュ・エージェントとレプリケーション・エージェントのポリシーを設定すると、エージェントはデータベースへの接続を開始します。これが初めての接続であれば、デーモンはデータベースをリロードし、リカバリを実行します。
キャッシュ・エージェントおよびレプリケーション・エージェントのポリシーの詳細は、『Oracle TimesTen In-Memory Database開発者および管理者ガイド』のレプリケーション・エージェントの起動および停止に関する説明、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』のキャッシュ・エージェント起動ポリシーの設定に関する説明および『Oracle TimesTen In-Memory Databaseリファレンス』のttAdminに関する説明を参照してください。

無効化の後にデータベースが自動的にリロードすることを防止するには、ttAdmin -noautoreloadコマンドを使用します。デフォルトの自動データベース・リロード動作に戻すには、ttAdmin -autoreloadコマンドを使用します。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttAdminに関する説明を参照してください。

注意:
ttRamPolicyAutoReloadSet組込みプロシージャは、ttAdmin -noautoreloadおよびttAdmin -autoreloadと同じ処理を実行します。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttRamPolicyAutoReloadSetに関する説明を参照してください。

次のいずれかによってデータベースの初期化とリカバリが開始し、通常の動作に戻ります。

- TimesTenデーモンが再起動する。

- プロセスが正常に接続される。

- 管理者がデータベースのttAdminコマンドを実行し、RAMポリシーの変更、RAMロードの実施、キャッシュまたはレプリケーション・エージェントの開始のいずれかを行う。

データベースの自動リロードを防止する動作を設定した場合、リロードされていないデータベースに接続しようとすると次のエラーメッセージが表示されることがあります。

Error 707, "Attempt to connect to a data store that has been manually unloaded from RAM"

メモリーからのデータベースのロードとアンロード

次の項では、メモリーからデータベースのロードとアンロードについて説明します。

- メモリーへのデータベースのロード

- メモリーからのデータベースのアンロード

メモリーへのデータベースのロード

データベースをメモリーにロードする前に、RAMポリシーをmanualまたはinUseに設定します。RAMポリシーがalwaysに設定されている場合、これはデータベースを常にロードしていることを指定するポリシーなので、データベースはすでにロードされています。また、TimesTenデーモンが実行中であることも確認してください。TimesTenデータベースのデフォルトのRAMポリシーは、inUseです。RAMポリシーの指定の詳細は、「RAMポリシーの指定」を参照してください。

データベースをメモリーにロードしようとする前に、TimesTenデーモンが実行中であることを確認します。

ttDaemonAdmin -start

データベースをメモリーにロードするには、ttAdminユーティリティを実行します。

- 次の例では、TimesTenデータベースのRAMポリシーをmanualに設定します。

ttAdmin -ramPolicy manual sampledb_1122

RAM Residence Policy            : manual
Manually Loaded In RAM          : False
Replication Agent Policy        : manual
Replication Manually Started    : False
Cache Agent Policy              : manual
Cache Agent Manually Started    : False

次に、ttAdmin -ramloadユーティリティを使用してTimesTenデータベースをメモリーにロードします。ttAdminユーティリティの-ramLoadオプションは、RAMポリシーがmanualのときにしか使用できません。

ttAdmin -ramLoad sampledb_1122

RAM Residence Policy            : manual
Manually Loaded In RAM          : True
Replication Agent Policy        : manual
Replication Manually Started    : False
Cache Agent Policy              : manual
Cache Agent Manually Started    : False

- 次の例では、データベースのRAMポリシーをinUseとして定義し、猶予時間を200秒に設定しています。

ttAdmin -ramPolicy inUse -ramGrace 200 sampledb_1122

RAM Residence Policy            : inUse plus grace period
RAM Residence Grace (Secs)      : 200
Replication Agent Policy        : manual
Replication Manually Started    : False
Cache Agent Policy              : manual
Cache Agent Manually Started    : False

データベースが構成済レプリケーションである、またはデータベースのキャッシュである場合、ttAdminユーティリティを実行してレプリケーション・エージェントおよびキャッシュ・エージェントを起動します。

ttAdmin -repStart sampledb_1122

ttAdmin -cacheStart sampledb_1122

これらのユーティリティの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttAdminに関する項とttDaemonAdminに関する項を参照してください。

メモリーからのデータベースのアンロード

メモリーからデータベースをアンロードする前に、データベースへのアクティブな接続をすべてクローズし、データベースのRAMポリシーをmanualまたはinUseに設定する必要があります。

- データベースへのアクティブな接続をすべてクローズするには、ttStatusユーティリティを実行して、データベースに接続されているプロセスを検出し、停止します。ttStatusの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttStatusに関する説明を参照してください。
データベースにキャッシュまたはレプリケーションを構成している場合は、ttAdminユーティリティの-cacheStopおよび-repStopオプションを使用して、キャッシュ・エージェントとレプリケーション・エージェントを停止します。

- RAMポリシーを「manual」または「inUse」に設定する方法は、「RAMポリシーの指定」を参照してください。

- RAMポリシーがmanualに設定されているデータベースをメモリーからアンロードするには、ttAdmin -ramUnloadユーティリティを実行します。アクティブな接続をすべてクローズすると、RAMポリシーがinUseのデータベースがメモリーからアンロードされます。RAMポリシーがmanualのデータベースをメモリーからアンロードする方法については、『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』で、メモリーからのデータベースのアンロードに関する項を参照してください。

ttAdminユーティリティの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttAdminに関する説明を参照してください。

データベースのサイズ指定

TimesTenは、連続した単一のメモリー領域内に2つの個別のメモリー領域を作成してデータベース領域を管理します。1つの領域には永続データが格納され、もう1つには一時データが格納されます。

- 永続データには、TimesTenデータベースを構成する表および索引が含まれます。データベースをメモリーにロードする際に、永続メモリー領域の内容がディスク上のファイルから読み込まれます。永続メモリー領域は、チェックポイント処理の際にディスクに書き込まれます。

- 一時データには、ロック、カーソル、コンパイルしたコマンド、およびコマンドの実行と問合せ評価に必要なその他の構造が含まれます。一時メモリー領域は、データベースをメモリーにロードする際に作成され、データベースをアンロードする際に削除されます。

データベースがメモリーに格納されている場合にデータベースのサイズを制御する接続属性には、PermSizeおよびTempSizeがあります。PermSize属性には、永続メモリー領域のサイズを指定し、TempSize属性には一時メモリー領域のサイズを指定します。

注意:
これらの属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の接続設定に関する説明を参照してください。

永続データ・パーティションおよび一時メモリー領域のサイズは、データベースをメモリーにロードする際に設定され、データベースがメモリーに格納されている間は変更できません。いずれかの領域のサイズを変更するには、メモリーからデータベースをアンロードし、PermSize属性またはTempSize属性の値を変更して再度接続する必要があります。メモリーからデータベースをアンロードする方法については、「メモリーからのデータベースのアンロード」を参照してください。

次の項では、データベース・サイズの管理について説明します。

- データベースのメモリー領域サイズの見積りおよび変更

- PermSize属性およびTempSize属性の監視

- メモリー不足の警告受信

データベースのメモリー領域サイズの見積りおよび変更

永続または一時のメモリー領域に空きがない場合は、データベースにプロシージャ、表または行を作成できません。データベースを正しいサイズにするには、PermSizeおよびTempSize接続属性に適切なサイズを設定します。

- PermSize接続属性: 永続メモリー領域は、増やすことはできますが、減らすことはできません。

- TempSize接続属性: 一時メモリー領域のサイズは、レプリケーションを構成しないデータベースに対しては増減できます。

サイズを見積るには、ttSizeユーティリティを使用するか、または適切な見積りが得られるまでアプリケーションを実行します。

データベースを保持できる十分な大きさの共有メモリー・セグメントがあることを確認する必要があります。通常、この共有メモリー・セグメントの最小サイズは、次の式で計算します。

PermSize + TempSize + LogBufMB + 64 MB overhead

注意:
追加の共有セグメントを、PL/SQLの場合はPLSQL_MEMORY_SIZEを使用して作成し、クライアント/サーバーの場合は-serverShmSizeデーモン・オプションを使用して作成できます。

PermSizeに割り当てる量を計算する場合は、PL/SQLのプロシージャ、関数およびパッケージによって永続メモリー領域内の領域が使用される点を考慮に入れてください。ストアドPL/SQLユニットが必要とする永続メモリー領域の量は、ユニットのサイズと複雑さによって決定されます。小さいプロシージャに必要な量は3KBより少ない可能性がありますが、大きいプロシージャではより多い量が必要となる可能性があります。平均すると、適度に複雑なユニットでは約20KBの永続メモリー領域領域が使用されます。

データベースがレプリケーション用に構成されている場合は、データベースのすべてのレプリカについてデータベース・サイズを再構成します。データベースのサイズを変更した後、データベースをメモリーにロードし、キャッシュ・エージェントおよびレプリケーション・エージェントを再起動します。

詳細は、『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』のインストールの前提条件に関する説明および『Oracle TimesTen In-Memory Databaseリファレンス』のTempSize属性およびPermSize属性に関する説明を参照してください。

十分なディスク領域があることの確認

TimesTenは、2つのチェックポイント・ファイルにデータベースのコピーを保存し、それぞれがDataStore属性で指定されているディレクトリに格納されます。各チェックポイント・ファイルがディスク上で大きくなるので、サイズは増えません。そのため、各チェックポイント・ファイルのサイズは、データベースが永続メモリー領域でアクセスしたことのあるデータベースの最大サイズに等しくなることがあります。各チェックポイント・ファイルの最大サイズは、PermSizeにデータベース・ヘッダーを加えたサイズです。各永続データベースについて、両方のチェックポイント・ファイルとすべてのトランザクション・ログ・ファイルを保存するための十分なディスク領域が必要です。DataStore属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のDataStoreに関する説明を参照してください。

Preallocate接続属性を1に設定すると、TimesTenはチェックポイント・ファイルへの接続時にディスク領域を保持できます。これは、大規模なデータベースで、データをデータベースに追加するときに、チェックポイントファイルにディスクの空き容量が常にあるかを確認するのに役立ちます。Preallocate接続属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のPreallocateに関する説明を参照してください。

PermSize属性およびTempSize属性の監視

TimesTenのSYS.MONITOR表には、PermSizeとTempSizeの使用状況の監視に使用できるいくつかの列があります。具体的には、PERM_ALLOCATED_SIZE、TEMP_ALLOCATED_SIZE、PERM_IN_USE_SIZE、PERM_IN_USE_HIGH_WATER、TEMP_IN_USE_SIZEおよびTEMP_IN_USE_HIGH_WATERの各列です。これらの各列には、データベースに現在割り当てられているサイズや、データベースの使用中のサイズがKB単位で表示されます。この情報は、接続が確立または解放されるたび、およびトランザクションがコミットまたはロールバックされるたびにシステムによって更新されます。

データベースの断片化は、ttBlockInfo組込みプロシージャをコールすることでブロック・レベルで監視できます。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttBlockInfoに関する説明を参照してください。

メモリー不足の警告受信

TimesTenには、メモリー不足の警告を発行するタイミングを指定するPermWarnThresholdおよびTempWarnThresholdの2つの一般接続属性が用意されています。いずれの属性も、パーセントで値を指定します。

メモリー不足の警告を受信するには、アプリケーションで組込みプロシージャttWarnOnLowMemoryをコールする必要があります。

また、これらの属性によって、SNMP警告のしきい値も設定されます。『Oracle TimesTen In-Memory Databaseエラー・メッセージおよびSNMPトラップ』のSNMPトラップを使用した診断に関する説明を参照してください。

データベースの既存の表の管理

次のユーティリティを使用すると、データベースの既存の表の特定部分を管理できます。

- 既存の表への行データの追加。ttBulkCpユーティリティを使用します。データをASCIIファイルに保存して、ttBulkCpユーティリティを使用すると、TimesTenデータベースの表に行データをロードできます。
追加する行には、表と同じ列数を含める必要があります。また、各列のデータは、その列に定義されているデータ型である必要があります。

ttBulkCpユーティリティはASCIIファイルに保存されたデータに対して処理を行うため、列数とデータ型がTimesTenデータベースの表の列数とデータ型と一致し、検出されたファイルがttBulkCpと互換性を持っている場合、このユーティリティを使用して他のアプリケーションからデータをインポートすることもできます。

- データベース内の表の所有者の名前変更。ttMigrateユーティリティを使用します。表のリストア時に、-renameオプションを使用して表の所有者の名前を変更します。

TimesTenを使用したスレッド・プログラミング

TimesTenでは、データベースへのマルチスレッド・アプリケーション・アクセスがサポートされています。データベースに接続すると、すべてのスレッドで、この接続に対する処理を発行できます。

通常、スレッドは、スレッド固有の接続に対して処理を発行するので、他のすべてのスレッドでは別のトランザクションが存在します。スレッドの作成および削除が頻繁に行われる環境では、接続をプールに保持することでパフォーマンスを向上できます。スレッドは、必要に応じてこのプールから接続を割り当てて、接続および切断によるオーバーヘッドを回避できます。

TimesTenでは、複数のスレッドで同じ接続に対してリクエストを発行できるため、トランザクションにリクエストが混在します。これらのリクエストは、TimesTenによってシリアライズされます(アプリケーションによっては、独自のシリアライズが必要な場合があります)。

また、TimesTenは、1つのスレッドで複数の接続にリクエストを出したり、同一のデータベースまたは異なるデータベースに対して、複数の個別トランザクションおよび同時トランザクションを制御することができます。

TimesTenデータベースのデフラグ

一部の状況では、TimesTenデータベースではメモリー・フラグメンテーションが進行しているため、大量の空きメモリーが既存の表の部分的に埋まったページに割り当てられていることがあります。これにより、空きメモリーが不足するため、他のユーザーにメモリーを割り当てられなくなることがあります(他の表用の新しいページなど)。このような状況では、メモリーを他のユーザーが利用できるようにするために、データベースをデフラグする必要があります。

表がALTER TABLE ADD SQL文で変更されてから、2番目の表パーティションが作成されます。デフラグメンテーションにより、2番目の表パーティションを削除し、すべての表の列を含む1つの表パーティションを作成できます。2番目の表パーティションが作成された場合、領域の利用およびパフォーマンスを向上するために、データベースを定期的にデフラグすることをお薦めします。

次のプロシージャは、両方のタイプのデータベース断片化に対応します。

- TimesTenデータベースのオフライン・デフラグメンテーション

- TimesTenデータベースのオンライン・デフラグメンテーション

TimesTenデータベースのオフライン・デフラグメンテーション

データベースをデフラグするには、次のようにttMigrateユーティリティを使用します。

1. データベースへのすべての接続を停止します。

2. ttMigrateを使用してデータベースのコピーを保存します。

ttMigrate -c ttdb ttdb.dat

3. 管理ユーザーとして、ttdbデータベースを再構築します。

ttMigrate -r -relaxedUpgrade -connstr "dsn=ttdb" ttdb.dat

注意:
表パーティションを圧縮しない場合は、ttMigrate -rコマンドを実行するときに-relaxedUpgradeオプションを指定しません。

このとき

- すべてのユーザー、キャッシュ・グループおよびアクティブ・スタンバイ・ペアはttdbにリストアされています。

- キャッシュ・グループは、AUTOREFRESH STATE = OFF状態にあります。

- キャッシュ・エージェントおよびレプリケーション・エージェントは実行されていません。

ALTER TABLE ADD SQL文を使用して表に列を追加するときに表パーティションを追加できます。詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の「ALTER TABLE」の注意を参照してください。

ttMigrateの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttMigrate」を参照してください。

TimesTenデータベースのオンライン・デフラグメンテーション

(最小の総サービス・ダウンタイムで)TimesTenデータベースをデフラグするには、ttMigrate -relaxedUpgradeおよびttRepAdmin -duplicateユーティリティを組み合せて使用します。これらのデータベースは、TABLE DEFINITION CHECKINGがRELAXEDに設定されているレプリケーション・スキームに関係しています。また、ttMigrate -relaxedUpgradeオプションによってパーティションを圧縮します。

注意:
レプリケーション・スキームにいずれのキャッシュ・グループも含まれていないか、またはREADONLYキャッシュ・グループのみが含まれる場合に、アクティブ・スタンバイ・ペアのレプリケーション・スキームに関係するTimesTenデータベースのみをデフラグできます。

次の項では、レプリケーション・スキームに関係しているTimesTenデータベースをデフラグする方法について説明します。

注意:
各項で示す例は、ユーザーがレプリケーション・スキームの構成および管理に精通していることを前提としています。詳細は、『Oracle TimesTen In-Memory Database開発者および管理者ガイド』の「スタート・ガイド」に関する説明を参照してください。

- アクティブ・スタンバイ・ペアのレプリケーション・スキーム内のデータベースのオンライン・デフラグメンテーション

- アクティブ・スタンバイ・ペアではないレプリケーション・スキーム内のデータベースのオンライン・デフラグメンテーション

アクティブ・スタンバイ・ペアのレプリケーション・スキーム内のデータベースのオンライン・デフラグメンテーション

次の項では、アクティブ・スタンバイ・ペア・レプリケーション・スキームに関係しているTimesTenデータベースをデフラグする方法について説明します。

- スタンバイ・データベースの移行および再構築

- アクティブ・ロールとスタンバイ・ロールの入替え

- スタンバイの廃棄および新しいスタンバイの再作成

この項の例では、アクティブ・データベースがttdb1でスタンバイ・データベースがttdb2のアクティブ・スタンバイ・ペア・レプリケーション・スキームによるオンライン・デフラグメンテーションの実行方法を示しています。

スタンバイ・データベースの移行および再構築

スタンバイのTimesTenデータベースに対するレプリケーションを停止してそのスタンバイ・データベースのコピーを保存し、そのスタンバイ・データベースをデフラグする方法を次に示します。

注意:
スタンバイ・データベースをデフラグしている間、アプリケーション処理をアクティブ・データベースで続行できます。

スタンバイ・データベースのコピーを保存するには、次の手順を実行します。

1. スタンバイ・データベース(ttdb2)でレプリケーション・エージェントを停止します。

ttAdmin –repStop ttdb2

2. サブスクライバがある場合、アクティブ・データベースでttRepStateSaveを実行し、スタンバイのステータスを失敗に設定します。スタンバイ・データベースが使用できない間は、アクティブ・データベースへの更新は、サブスクライバ・データベースに直接レプリケートされます。

ttRepStateSave('FAILED', 'ttdb2', 'ttsrv2');

3. ttMigrateを使用してスタンバイ・データベースのコピーを保存します。

ttMigrate -c -relaxedUpgrade ttdb2 ttdb2.dat

4. キャッシュ・エージェントを停止し、キャッシュ・グループを削除し、スタンバイを廃棄します。

ttAdmin –cacheStop ttdb2

キャッシュ・マネージャ・ユーザーとして接続されている間に、すべてのキャッシュ・グループを削除します。

Command> DROP CACHE GROUP t_cg;

スタンバイ・データベースを破棄します。

ttDestroy ttdb2

5. スタンバイ・データベースを再構築します。インスタンス管理者として、スタンバイに次のことを実行します。

ttIsql ttdb2

6. キャッシュ・マネージャ・ユーザーを作成し、このユーザーにADMIN権限を付与します。

Command> CREATE USER cacheadmin IDENTIFIED BY cadminpwd;
Command> GRANT CREATE SESSION, CACHE_MANAGER, CREATE ANY TABLE,
DROP ANY TABLE TO cacheadmin;
Command> GRANT ADMIN TO cacheadmin;

注意:
ttMigrate –rを実行するには、キャッシュ・マネージャ・ユーザーにはADMIN権限が必要です。移行が完了したら、希望する場合は、このユーザーからADMIN権限を取り消します。
ttMigrateの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttMigrate」を参照してください。

7. キャッシュ・マネージャ・ユーザーとして、ttdb2データベースを再構築します。

ttMigrate -r -relaxedUpgrade -cacheuid cacheadmin -cachepwd cadminpwd -connstr
"dsn=ttdb2;uid=cacheadmin;pwd=cadminpwd;oraclepwd=oraclepwd" ttdb2.dat

このとき

- すべてのユーザー、キャッシュ・グループおよびアクティブ・スタンバイ・ペアはttdb2にリストアされています。

- キャッシュ・グループは、AUTOREFRESH STATE = OFF状態にあります。

- キャッシュ・エージェントおよびレプリケーション・エージェントは実行されていません。

8. キャッシュ・マネージャ・ユーザーとして、スタンバイでキャッシュ・エージェントを起動します。

ttAdmin –cacheStart ttdb2

9. キャッシュ・グループをロードします。

Command> ALTER CACHE GROUP t_cg SET AUTOREFRESH STATE PAUSED;
Command> LOAD CACHE GROUP t_cg COMMIT EVERY 256 ROWS PARALLEL <nThreads>;

注意:

- このロード操作の場合に、TimesTenにデータを挿入するために使用するCPUコアの数に基づいてnThreadsを選択します。

- 複数の読取り専用キャッシュ・グループがある場合、TimesTenおよびOracle Databaseリソースが使用可能なときは、複数のLOAD操作を別々のセッションでパラレルで実行することをお薦めします。

10. 完了したら、キャッシュ・グループの状態を確認します。

Command> cacheGroups;
Cache Group CACHEADMIN.T_CG:
Cache Group Type: Read Only
Autorefresh: Yes
Autorefresh Mode: Incremental
Autorefresh State: On
Autorefresh Interval: 10 Seconds

Autorefresh Status: ok
Aging: No aging defined

Root Table: ORATT.T
Table Type: Read Only

1 cache group found.

11. スタンバイ・データベースでレプリケーション・エージェントを起動します。

ttAdmin -repStart ttdb2

12. スタンバイでレプリケーションの状態を確認します。

ttIsql ttdb2
Command> call ttRepStateGet;
< STANDBY, NO GRID >
1 row found.

スタンバイ・データベース(ttdb2)はデフラグされ、アクティブ・データベースとスタンバイ・データベースの両方は機能しています。

アクティブ・ロールとスタンバイ・ロールの入替え

アクティブ・データベースにデータベース・デフラグメンテーションを実行するには、アクティブ・データベースとスタンバイ・データベースのロールを入れ替えます。アクティブ(ttdb1)はスタンバイ・データベースになります。元のスタンバイ(ttdb2)はアクティブ・データベースになります。

1. すべてのアプリケーション処理を停止し、すべてのアプリケーションの接続を切断します。処理中の問合せのみが、ttdb2 TimesTenデータベースで稼働するように移動できます。

2. 現行のスタンバイ・データベース(ttdb2)のデータベース名およびホストを入力パラメータとして、現行のアクティブ・データベース(ttdb1)でttRepSubscriberWait組込みプロシージャをコールします。これにより、キューに入れられたすべての更新が現行のスタンバイ・データベースに送信されます。

注意:
waitTimeを-1に設定した場合、コールは、コール前にコミットされたすべてのトランザクションがサブスクライバに送信されるまで待機します。
ただし、waitTimeを任意の値(NULL以外の値にします)に設定する場合、操作を実行する前に、timeOut戻りパラメータの値が0x00であることを確認してください。戻り値が0x01の場合、コール前にコミットされたすべてのトランザクションがサブスクライバに送信されるまでttRepSubscriberWait組込みプロシージャをコールします。

ttRepSubscriberWait組込みプロシージャの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttRepSubscriberWaitに関する説明を参照してください。

Command> call ttRepSubscriberWait(NULL,NULL,'ttdb2','ttsrv2', 100);

3. 現行のアクティブ・データベースでレプリケーション・エージェントを停止します。

Command> call ttRepStop;

4. 現行のアクティブ・データベースでttRepDeactivate組込みプロシージャをコールします。これによって、このデータベースはIDLE状態になります。

Command> call ttRepDeactivate;
Command> call ttRepStateGet;
< IDLE, NO GRID >
1 row found.

5. 古いスタンバイ・データベースでttRepStateSet('ACTIVE')組込みプロシージャをコールしてスタンバイをアクティブに昇格します。このデータベースがアクティブ・スタンバイ・ペアのアクティブ・データベースになります。ttRepStateGet組込みプロシージャを使用して、データベースがアクティブになったことを確認します。

Command> call ttRepStateSet('ACTIVE');
Command> call ttRepStateGet;
< ACTIVE, NO GRID >
1 row found.

6. アクティブ・データベースだったデータベースでレプリケーション・エージェントを停止します。

ttAdmin -repStop ttdb1

7. 新しいアクティブ・データベースでttRepStateSaveを実行し、以前のアクティブ・データベースの状態を失敗に設定します。スタンバイ・データベースが使用できない間は、アクティブ・データベースへの更新は、サブスクライバ・データベースに直接レプリケートされます。

Command> call ttRepStateSave('FAILED', 'ttdb1', 'ttsrv1');

8. 新しいアクティブ・データベース(ttdb2)でアプリケーションのフル・ワークロードを再起動します。

このデータベースがアクティブ・スタンバイ・ペアのスタンバイ・データベースとして機能するようになります。

スタンバイの廃棄および新しいスタンバイの再作成

新しいアクティブからttRepAdmin -duplicateを使用して、スタンバイを廃棄し、新しいスタンバイを再作成します。これらの手順の間、アクティブ・データベースではアプリケーション処理は続行できます。

1. 新しいスタンバイ・データベースでキャッシュ・エージェントを停止します。

ttAdmin –cacheStop ttdb1

2. キャッシュ・マネージャ・ユーザーとして、すべてのキャッシュ・グループを削除します。

Command> DROP CACHE GROUP t_cg;

3. データベースを破棄します。

ttDestroy ttdb1

4. 新しいアクティブを複製して新しいスタンバイ・データベースを再作成します。

ttRepAdmin -duplicate -from ttdb2 -host ttsrv2 –setMasterRepStart
-UID ttadmin -PWD ttadminpwd -keepCG -cacheUID cacheadmin
-cachePWD cadminpwd ttdb1

5. 新しいスタンバイ・データベースでキャッシュ・エージェントおよびレプリケーション・エージェントを起動します。

ttAdmin –cacheStart ttdb1
ttAdmin –repStart ttdb1

このプロセスにより、ごく数秒の間サービスが中断するのみで、アクティブ・データベースとスタンバイ・データベースの両方がデフラグされます。

アクティブ・スタンバイ・ペアではないレプリケーション・スキーム内のデータベースのオンライン・デフラグメンテーション

次の項では、アクティブ・スタンバイ・ペアではないレプリケーション・スキームに関係しているTimesTenデータベースをデフラグする方法について説明します。

- スタンバイ・データベースの移行および再構築

- レプリケーション・スキームの変更

- データベースの破棄および再作成

注意:
次の項では、双方向レプリケーション・スキームに関係しているデータベースをデフラグする方法について説明します。双方向レプリケーション・スキームでは、各データベースはマスターおよびサブスクライバの両方になります。

この項の例では、2つのTimesTenデータベース(それぞれttdb1およびttdb2という名前)で双方向および一方向レプリケーションによるオンライン・デフラグメンテーションを実行する方法を示します。一方向レプリケーションの例では、ttdb1はマスターを表し、ttdb2はサブスクライバを表します。

データベースの移行および再構築

この手順の第1歩は、TimesTenデータベースの1つでレプリケーションを停止し、このデータベースをデフラグすることです。

注意:
データベースの1つをデフラグしている間、他のデータベースではアプリケーション処理を続行できます。

TimesTenデータベースのコピーを保存するには、次の手順を実行します。

1. データベースの1つでレプリケーション・エージェントを停止します。
ttdb2データベースの場合:

ttAdmin –repStop ttdb2

2. ttMigrateを使用してttdb1データベースのコピーを保存します。

ttMigrate -c -relaxedUpgrade ttdb2 ttdb2.dat

3. データベースを破棄します。

ttDestroy ttdb2

4. ADMIN権限のあるTimesTenユーザーとして、ttdb2データベースを再構築します。

ttMigrate -r -relaxedUpgrade -connstr "dsn=ttdb2;uid=ttadmin;pwd=ttadminpwd" ttdb2.dat

このとき

- すべてのユーザーがttdb2に格納されました。

- レプリケーション・エージェントは稼働していません。

5. ttdb2でレプリケーション・エージェントを再起動します。

ttAdmin -repStart ttdb2

ttdb2 TimesTenデータベースがデフラグされました。

レプリケーション・スキームの変更

ttdb1データベースにデータベース・デフラグメンテーションを実行するには、次の操作を実行します。

1. すべてのアプリケーション処理を停止し、すべてのアプリケーションの接続を切断します。すべての処理をttdb2 TimesTenデータベースで稼働するように移動できます。

2. デフラグしたデータベース(ttdb2)のデータベース名およびホストを入力パラメータとして、デフラグされていないTimesTenデータベース(ttdb1)でttRepSubscriberWait組込みプロシージャをコールします。これにより、キューに入れられたすべての更新が両方のデータベースに送信されます。

注意:
waitTimeを-1に設定した場合、コールは、コール前にコミットされたすべてのトランザクションがサブスクライバに送信されるまで待機します。
ただし、waitTimeを任意の値(NULL以外の値)に設定する場合、操作を実行する前に、timeOut戻りパラメータの値が0x00であることを確認してください。戻り値が0x01の場合、コール前にコミットされたすべてのトランザクションがサブスクライバに送信されるまでttRepSubscriberWait組込みプロシージャをコールします。

ttRepSubscriberWait組込みプロシージャの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttRepSubscriberWaitに関する説明を参照してください。

ttdb1の場合:

ttIsql ttdb1

Command> call ttRepSubscriberWait(NULL,NULL,'ttdb2','ttsrv2', 100);

双方向レプリケーション・スキームを使用する場合、手順3および手順4をスキップして手順5に進んでください。

3. 一方向レプリケーション・スキームの場合(ttdb1がマスターでttdb2がサブスクライバ)、両方のTimesTenデータベースでレプリケーション・スキームを破棄します。
ttdb1の場合:

ttIsql ttdb1

Command> DROP REPLICATION r1;

ttdb2の場合:

ttIsql ttdb2

Command> DROP REPLICATION r1;

4. 一方向レプリケーション・スキームの場合、マスター(ttdb1)およびサブスクライバ(ttdb2)でレプリケーション・スキームを破棄します。
ttdb1の場合:

ttIsql ttdb1

Command> DROP REPLICATION r1;

ttdb2の場合:

ttIsql ttdb2

Command> DROP REPLICATION r1;

5. ttdb2でレプリケーション・エージェントを起動します。

ttAdmin -repStart ttdb2

6. ttdb1でレプリケーション・エージェントを停止します。

ttAdmin -repStop ttdb1

一方向レプリケーション・スキームを変更する場合、ttdb2データベースは一方向スキームでマスター・データベースとして稼働しており、ttdb1データベースは一方向レプリケーション・スキームでサブスクライバ・データベースとして稼働しています。

データベースの破棄および再作成

ttRepAdmin -duplicateを使用して、デフラグされていないレプリケーション・スキーム内のTimesTenデータベースを破棄して再作成します。これらの手順の間、デフラグしたデータベースではアプリケーション処理を続行できます。

1. データベースを破棄します。

ttDestroy ttdb1

2. レプリケーション・スキームに関係したデフラグ済のTimesTenデータベース(ttdb2)を複製して、新しいTimesTenデータベース(ttdb1)を再作成します。

ttRepAdmin -duplicate -from ttdb2 -host ttsrv2 –setMasterRepStart
-UID ttadmin -PWD ttadminpwd ttdb1

3. 新しいスタンバイ・データベースでレプリケーション・エージェントを起動します。

ttAdmin –repStart ttdb1

この処理は、一方向レプリケーション・スキームまたは双方向レプリケーション・スキームのいずれに属するTimesTenデータベースも、数秒のサービス停止時間のみでデフラグします。

2 TimesTen ClientおよびTimesTen Serverの使用方法

TimesTenデータベースへのネットワーク経由のクライアント/サーバー接続は、TimesTen ClientおよびTimesTen Serverを使用してオープンできます。

次の項では、TimesTen Client/TimesTen Serverおよびそれらを使用した接続方法について説明します。

- TimesTen Client/Serverの概要

- TimesTen ClientおよびTimesTen Serverの構成

- TimesTen Serverの起動

- UNIXでのリモート・データベースへのアクセス

TimesTen Client/TimesTen Serverの概要

TimesTen Serverは、サーバー・システム上で実行されるプロセスであり、TimesTen Clientからネットワーク・リクエストを受け付け、サーバー・システム上にあるデータベースでの処理に変換します。これにより、クライアントは、異なるプラットフォームおよびオペレーティング・システムのビット・レベルを実行している可能性のある様々なシステムに格納されているデータベースに接続できます。

TimesTen Clientfは、TimesTen Serverと別のシステムにも同じシステムにもインストールできます。TimesTen ClientをTimesTen Serverと同じシステムにインストールする場合は、それを使用してローカル・システムのTimesTenデータベースにアクセスできます。たとえば、32ビット・アプリケーションと64ビット・アプリケーションの両方をサポートするプラットフォームで、32ビット・アプリケーションを使用して同じシステム上の64ビット・データベースにアクセスできます。

注意:
クライアント/サーバー接続は、TimesTenがサポートするプラットフォーム間のいずれの組合せに対しても作成できます。

図2-1に、それぞれのドライバを使用したTimesTen ClientとTimesTen Serverの通信方法を示します。

図2-1 TimesTen ClientとTimesTen Serverの概要図

- TimesTen Client: リモート・システム上のTimesTenデータベースにアクセスするには、TimesTen Client ODBCドライバにアプリケーションをリンクします。その後、アプリケーションはTimesTen Serverプロセスと通信します。TimesTen Clientドライバを使用すると、アプリケーションは、TimesTen ServerおよびTimesTen Data Managerがインストールされているリモート・システムまたはローカル・システム上のTimesTenデータベースに透過的に接続できます。
クライアント・アプリケーションは、TimesTen Clientドライバに直接リンクするか、Windows ODBCドライバ・マネージャにリンクして、TimesTenデータベースにアクセスできます。TimesTenでは、UNIXとWindows両方用のドライバ・マネージャを用意しており、クイック・スタート・サンプル・アプリケーションが付属しています。ドライバ・マネージャを使用する場合には、パフォーマンス上の考慮事項があります。

また、JDBC、OCI、Pro*C/C++など指定したインタフェースを通じて、クライアント・アプリケーションをリンクし、TimesTenデータベースにアクセスすることもできます。

注意:
アプリケーションで各種のドライバとインタフェースを使用してTimesTenデータベースにアクセスする方法の詳細は、「ODBCドライバおよびJDBCドライバを使用したTimesTenへの接続」を参照してください。

- TimesTen Server: サーバー・システムでは、TimesTen ServerはTimesTen Data Manager ODBCドライバを使用します。サーバーで実行する処理は、クライアント・アプリケーションからのリクエストをリスニングし、Data Manager ODBCドライバを介してリクエストを処理した後、結果およびエラーがあればその情報をクライアント・アプリケーションに戻すことです。

注意:
TimesTenアプリケーションのコンパイルおよびリンク方法の詳細は、『Oracle TimesTen In-Memory Database Java開発者ガイド』のJavaアプリケーションのコンパイルに関する説明または『Oracle TimesTen In-Memory Database C開発者ガイド』のアプリケーションのコンパイルおよびリンクに関する説明を参照してください。

次の項では、クライアント/サーバー通信の制限および通信プロトコルについて説明します。

- クライアント/サーバー通信に対する制限

- クライアント/サーバー通信用プロトコル

クライアント/サーバー通信に対する制限

クライアント/サーバー通信に対する制限は、次のとおりです。

- クライアント/サーバー接続にXLAを使用することはできません。

- UNIXの場合、ttAdmin、ttRepAdmin、ttBackupなどの一部のTimesTenユーティリティは、直接接続経由でのみ動作します。UNIXプラットフォームのクライアント/サーバー接続経由で実行可能なユーティリティの名前には、ttIsqlCS、ttBulkCpCS、ttMigrateCS、ttSchemaCSなど、CSという接尾辞が付いています。これらのユーティリティは、TimesTen Clientドライバにリンクされており、クライアント/サーバー接続経由でデータべスースにするときにクライアントDSNに接続するために使用できます。『Oracle TimesTen In-Memory Databaseリファレンス』には、各ユーティリティにクライアント/サーバー・バージョンがある場合はその名前が示されています。

- ttCacheUidPwdSet組込みプロシージャは、クライアント/サーバー接続経由では使用できません。

- あるホスト上で定義されている外部ユーザーは、リモート・ホスト上のTimesTenデータソースに接続できません。内部ユーザーの接続には制限はありません。

- 内部ユーザーを作成または変更できるのは直接接続経由のみであり、TimesTenデータベースへのクライアント/サーバー接続経由ではできません。したがって、CREATE USERまたはALTER USER文は、TimesTenデータベースに直接接続されているときのみ実行できます。作成後、ユーザーがクライアントからサーバーに接続するには、そのユーザーにCREATE SESSION権限を付与しないと、接続は失敗します。TimesTenデータベースでのユーザーの作成方法および管理者によるCREATE SESSION権限の付与方法の詳細は、「ユーザーの作成およびデータベースでのユーザーの識別」および「データベースに接続するための権限の付与」を参照してください。

- UNIX上のTimesTenでは、親プロセスがオープンした接続をその子プロセスが使用することはできません。親プロセスがオープンした接続を使用するために子プロセスがfork()を使用して処理を試行すると、エラーが戻されます。

クライアント/サーバー通信用プロトコル

デフォルトでは、サーバー・プロセスは、クライアントが接続をリクエストした時点で生成されます。サーバー・システム上のttendaemon.optionsファイルに-serverPoolオプションを設定することで、サーバー・プロセスの予約プールを事前に生成できます。詳細は、「TimesTen Serverプロセスの事前生成」を参照してください。

次の項では、TimesTen ClientがTimesTen Serverとの間で使用できる通信プロトコルについて説明します。

- TCP/IP通信

- 共有メモリー通信

- UNIXドメイン・ソケット通信

TCP/IP通信

デフォルトでは、TimesTen Clientは、TCP/IPソケットを使用してTimesTen Serverと通信します。これは、TimesTen ClientとTimesTen Serverが異なるシステムにインストールされている場合に使用可能な唯一の通信形式です。

共有メモリー通信

TimesTen ClientおよびTimesTen Serverの両方が同じシステムにインストールされている場合、TimesTen Client ODBCドライバを使用しているアプリケーションでは、プロセス間通信(IPC)用の共有メモリー・セグメントを使用できます。共有メモリー・セグメントを使用すると、TCP/IP通信よりパフォーマンスが向上します。共有メモリー・セグメントを通信に使用するには、次の操作を行う必要があります。

1. 共有メモリー通信を使用するように、ttendaemon.optionsファイルでサーバー・オプションを構成します。詳細は、「クライアント/サーバーIPCでの共有メモリーの使用方法」を参照してください。

2. 論理サーバー名で、ネットワーク・アドレスをttShmHostと定義します。詳細は、「論理サーバー名の定義」を参照してください。

注意:
TimesTenでは、共有メモリーのIPC対応サーバーの最大16の異なるインスタンスがサポートされています。アプリケーションで16を超えて異なる共有メモリー・セグメントに接続しようとすると、エラーが戻されます。

UNIXドメイン・ソケット通信

UNIXプラットフォームでは、TimesTen ClientとTimesTen Serverが同一のシステムにインストールされている場合、通信用にUNIXドメイン・ソケットを使用できます。共有メモリー・セグメントを使用すると、パフォーマンスは向上しますが、消費されるメモリーがわずかに増大します。UNIXドメイン・ソケットを使用すると、共有メモリー・セグメントの接続より少ないメモリーの消費でTCP/IPのパフォーマンスを向上させることができます。ドメイン・ソケットを使用するには、論理サーバーのネットワーク・アドレスとしてttLocalHostを定義する必要があります。詳細は、「論理サーバー名の定義」を参照してください。

TimesTen ClientおよびTimesTen Serverの構成

注意:
TimesTen ClientおよびTimesTen Serverを構成する前に、「ODBCおよびJDBCドライバを使用したTimesTenへの接続」および「TimesTenデータベース識別のためのデータソース名の指定」を参照してください。

次の各項では、TimesTen ClientおよびTimesTen Serverを使用してアプリケーションからTimesTenデータベースに接続する方法について説明します。

- TimesTen Client/Server構成の概要

- クライアント/サーバー接続用のインストールおよび構成

- TimesTen ServerシステムでのサーバーDSNの定義

- 論理サーバー名の定義

- TimesTen ClientシステムでのクライアントDSNの作成

- 自動クライアント・フェイルオーバーの使用

TimesTen Client/TimesTen Serverの概要

クライアント・アプリケーションをTimesTenデータベースに接続するには、「図2-2」に示すように、クライアントDSN(オプションとして論理サーバー名)およびサーバーDSNを構成して、目的のTimesTenデータベースを一意に識別する必要があります。

図2-2 クライアント/サーバー接続の構成

クライアント・アプリケーションは、接続の開始時にクライアントDSNを参照します。次の詳細情報により、接続リクエストが解決され、目的のTimesTenデータベースへの接続が可能になります。

- クライアントDSNは、サーバー・ホスト名、論理サーバー名または実際のサーバー・システム名、およびサーバー上のTimesTenデータベースを識別するサーバーDSNを使用して、ユーザー・ファイルまたはシステム・ファイルのodbc.iniで構成されます。

- 論理サーバー名は、クライアントでのオプションの構成です。使用すると、TimesTenデータベースがインストールされているサーバー・ホスト名が指定されます。サーバー・ホスト名を隠したり、簡略化する場合に使用します。論理サーバー名は、共有メモリーIPCまたはUNIXドメイン・ソケットを使用する場合に必ず使用します。

- サーバーDSNは、TimesTenデータベース名およびその接続属性を使用して、システム・ファイルのodbc.iniで構成されます。接続属性では、TimesTenデータベースのロードおよび構成方法と、TimesTenデータベースへの接続の制御または管理方法が指定されます。

したがって、これらの情報が正しく構成されると、クライアント・アプリケーションでは、クライアントDSNを使用してTimesTenデータベースを特定し、接続することが可能になります。クライアントDSNによって、サーバー・システムおよびサーバーDSNが定義されます。サーバーDSNでは、サーバー上のTimesTenデータベース、そのロード方法および接続の管理方法が指定されます。

クライアント/サーバー接続のインストールおよび構成

次の項では、クライアント/サーバー接続のためにどのノードに何をインストールする必要があるかについて説明します。

- 同一リリースのTimesTen ClientおよびTimesTen Serverの構成方法

- リリースが異なるTimesTen ClientおよびTimesTen Serverの構成

同一リリースのTimesTen ClientおよびTimesTen Serverの構成方法

次の項では、TimesTen ClientとTimesTen Serverが同じリリースのTimesTenの場合のTimesTenのインストールおよび構成方法について説明します。

- TimesTen Serverのインストールおよび構成

- TimesTen Clientのインストールおよび構成

TimesTen Serverのインストールおよび構成

TimesTenデータベースが格納されているシステムで、次のタスクを実行します。このシステムを、サーバー・システムと呼びます。

1. TimesTen Serverをインストールします。TimesTen Serverのインストール方法については、『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』を参照してください。

2. TimesTenデータベースに対応するサーバーDSNを作成および構成します。「TimesTen ServerシステムでのサーバーDSNの定義」を参照してください。サーバーDSNでTimesTen接続属性を設定します。『Oracle TimesTen In-Memory Databaseリファレンス』の接続属性に関する説明を参照してください。

TimesTen Clientのインストールおよび構成

クライアント・アプリケーションが格納されているシステムで、次のタスクを実行します。このシステムを、クライアント・システムと呼びます。

1. TimesTen Clientをインストールします。TimesTen Clientのインストール方法については、『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』を参照してください。

2. データベースとの接続にJDBCを使用している場合は、Java Development Kit (JDK)をインストールした後、CLASSPATHや共有ライブラリ検索パスなどの環境変数を設定します。詳細は、『Oracle TimesTen In-Memory Database Java開発者ガイド』のJava環境変数の設定に関する説明を参照してください。

3. サーバーDSNに対応するクライアントDSNを作成および構成します。詳細は、「UNIXでのクライアントDSNの作成および構成」および「WindowsでのクライアントDSNの作成および構成」を参照してください。

4. OCIおよびPro*C/C++クライアント/サーバー接続の場合は、『Oracle TimesTen In-Memory Database C開発者ガイド』のOCIからのTimesTenデータベースへの接続に関する説明に従って、tnsnames.oraまたは簡易接続を使用するようにアプリケーションを構成します。

5. クライアント/サーバー・アプリケーションをリンクするには、次の手順を実行します。

- 『Oracle TimesTen In-Memory Database C開発者ガイド』のオプションのリンクに関する説明に従って、CおよびC++クライアント/サーバー・アプリケーションをリンクします。

- OCIまたはPro*C/C++直接接続アプリケーションの場合と同じ方法で、OCIまたはPro*C/C++アプリケーションをリンクします。リンク方法の詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』の「TimesTenでのOCIのサポート」および『TimesTenでのPro*C/C++のサポート」に関する説明を参照してください。

リリースが異なるTimesTen ClientおよびTimesTen Serverの構成

TimesTen Clientは、リリースやビット・レベルの異なるTimesTen Serverに接続できます。TimesTen Client 7.0以上のリリースは、任意のビット・レベルのTimesTen Server 7.0以上のリリースに接続できます。リリースの異なるTimesTen Client/TimesTen Server接続を構成する場合は、「同一リリースのTimesTen ClientおよびTimesTen Serverの構成方法」の説明に従って、インストールおよび構成します。

TimesTen ClientアプリケーションがTimesTenデータベースに接続されると、TimesTen Serverは自身のリリースおよびビット・レベルのドライバおよびTimesTenデータベースをロードします。TimesTen Data Managerが、TimesTen Serverシステムに自動的にインストールされます。

- ttLocalHost経由のUNIXドメイン・ソケットを使用したローカル・クライアント/サーバー接続を使用している場合は、クライアントおよびサーバーのプラットフォームがUNIXである必要があります。クライアント・ホストおよびサーバー・ホストのビット・レベルとリリース・レベルが同じである必要があります。

- ttShmHostを使用した共有メモリーIPC経由のローカル・クライアント/サーバー接続を使用している場合は、クライアントおよびサーバーのプラットフォームはWindowsとUNIXのいずれでもかまいません。ビット・レベルは、クライアント・ホストとサーバー・ホストで異なっている可能性があります。

TimesTen ServerシステムでのサーバーDSNの定義

サーバーDSNにより、クライアント/サーバー接続でアクセスするTimesTenデータベースが識別されます。サーバーDSNは、TimesTen Data Manager DSNと同じ構成形式および属性を持ち、システムDSNとして定義する必要があります。DSNおよびその作成方法については、「WindowsでのData Manager DSNの作成」または「UNIXでのData Manager DSN DSNの作成」を参照してください。

注意:
TimesTen Serverの稼働中に、サーバーDSNの追加および構成を実行できます。

サーバーDSNはTimesTen Serverからアクセスされるデータベースを識別するため、Data Manager DSNと同じ接続属性を使用して構成することができます。さらに、サーバーDSNの指定でのみ許可される接続属性もあります。それらの属性を使用すると、単一のサーバーに対して複数のクライアント/サーバー接続を指定することが可能になります。

注意:
接続属性の中には、次の項で説明するものも含めて、TimesTenデーモン・オプション・ファイル(ttendaemon.options)で構成できるものがあります。サーバーDSNとデーモン・オプション・ファイルの両方で同じ接続属性が指定されている場合は、サーバーDSNの接続属性の値が優先されます。
TimesTenデーモン・オプションの詳細は、「TimesTen Client/Serverのオプションの管理」を参照してください。

次の項では、odbc.iniファイルまたはODBCデータソース・アドミニストレータのコンテキストにおけるサーバーDSN属性について説明します。

注意:
TimesTen Server接続属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の接続属性に関する説明を参照してください。

- odbc.iniファイルで定義されたサーバーDSN接続属性

- ODBCデータソース・アドミニストレータで定義されたサーバーDSN接続属性

odbc.iniファイルで定義されたサーバーDSN接続属性

デフォルトでは、TimesTenは、1つのサーバーへの接続は1つの子プロセスにつき1つのみ作成されます。ただし、次のTimesTen Server接続属性を使用すると、単一のTimesTen Serverに対して複数のクライアント/サーバー接続を指定できます。

注意:
次の属性は、初期接続で読み込まれます。TimesTen Serverを再起動するまで、TimesTen Serverの設定変更は有効になりません。サーバーを再起動するには、次のコマンドを使用します。

ttDaemonAdmin -restartserver

- MaxConnsPerServer: 単一のサーバー・プロセスによって処理される最大クライアント接続数を設定します。サーバーは、サーバーDSNによって参照されます。サーバーには複数のサーバー・プロセスが存在できますが、その場合、この属性によって指定された接続数が各プロセスに許可される最大接続数になります。

- ServersPerDSN: サーバー上の複数の着信接続に対応する複数のサーバー・プロセスを設定できます。ServersPerDSN属性は、サーバーで最初に生成されるサーバー・プロセスの数を指定します。新しい着信接続ごとに、ServersPerDSNを上限として、新しいサーバー・プロセスが生成されます。ServersPerDSNに指定した数に到達すると、MaxConnsPerServerに指定された接続数を上限として、既存のサーバー・プロセスが複数の接続を処理します。

- ServerStackSize: 接続ごとに、サーバー上のスタック・サイズを設定します。

MaxConnsPerServer属性とServersPerDSN属性は関連しています。これらの属性では、指定したDSNのクライアント接続数は制限されません。かわりに、接続がサーバー・プロセスに対してどのように分散されるかが制御されます。たとえば、MaxConnsPerServerを2に、ServersPerDSNを5に設定すると、次のように処理が実行されます。

- 接続1がサーバーに接続され、その接続用に1つ目のサーバー・プロセスが起動されます。接続2から接続5までがサーバーに接続され、サーバー・プロセス2からサーバー・プロセス5が起動され、各サーバー・プロセスが1つの接続に対応します。

- 接続6がサーバーに接続されます。ServersPerDSNには達しましたが、MaxConnsPerServerには到達していないため、接続6には1つ目のサーバー・プロセスが割り当てられます。着信接続7から着信接続10までは、それぞれ、2つ目の接続としてサーバー・プロセス2からサーバー・プロセス5が割り当てられます。

- 接続11がサーバーに接続されます。ServersPerDSNとMaxConnsPerServerの両方の値に到達したため、接続11を処理するためにサーバー・プロセス6が起動されます。

ODBCデータソース・アドミニストレータで定義されたサーバーDSN接続属性

サーバーDSNを使用して接続を複数作成する場合は、必要に応じてサーバーDSN属性に適切な値を指定します。WindowsのODBCデータソース・アドミニストレータの場合は、「Server」タブで指定します。

図2-3 TimesTen ODBCアドミニストレータの「Server」タブ

論理サーバー名の定義

論理サーバー名は、TimesTen Client上のサーバー・システムに対する定義です。ローカル・クライアント/サーバーに対して、TCP/IP以外の通信プロトコルを使用したり、TimesTen Serverプロセスが、デフォルトのTCP/IPポートをリスニングしないなどの場合は、クライアント・システムで論理サーバー名を定義する必要があります。このような場合、クライアントDSNは、論理サーバー名を参照する必要があります。ただし、使用されている通信プロトコルがTCP/IPである場合、クライアントDSNが、サーバー・ホスト名を直接参照でき、論理サーバー名を定義する必要がないのが一般的です。

次の項では、WindowsプラットフォームまたはUNIXプラットフォームでの論理サーバー名の定義方法の例を示します。

- Windowsでの論理サーバー名の作成および構成

- UNIXでの論理サーバー名の作成および構成

Windowsでの論理サーバー名の作成および構成

論理サーバー名の作成および構成を行うには、次の手順を実行します。

1. Windowsデスクトップで、「スタート」→「設定」→「コントロール パネル」→「管理ツール」→「データ ソース (ODBC)」を選択します。
「ODBC データソース アドミニストレータ」が開きます。

2. 「ユーザー DSN」または「システム DSN」をクリックします。

3. 「TimesTen Client DSN」を選択して「構成」をクリックします。クライアントDSNが存在しない場合は「追加」をクリックし、「TimesTen Client 11.2.2」を選択して「完了」をクリックします。「TimesTen Client DSN Setup」ダイアログ・ボックスが開きます。

4. 「Servers」をクリックします。「TimesTen Logical Server List」ダイアログ・ボックスが開きます。

5. 「追加」をクリックします。「TimesTen Logical Server Name Setup」ダイアログ・ボックスが開きます。

6. 「Server Name」フィールドに、論理サーバー名を入力します。

7. 必要に応じて、「Description」フィールドにサーバーの説明を入力します。

8. 「Network Address」フィールドに、サーバー・システムのホスト名またはIPアドレスを入力します。ネットワーク・アドレスは、次のいずれかである必要があります。

接続のタイプ

ネットワーク・アドレス

リモートのクライアント/サーバー接続

TimesTen Serverが稼働しているシステムの名前。たとえば、server.mycompany.comなどです。

プロセス間通信(IPC)に共有メモリーを使用する、ローカルのクライアント/サーバー接続

ttShmHost
共有メモリーをIPCとして使用するには、システムが正しく構成されていることを検証します。「共有メモリー通信」を参照してください。

9. 「Network Port」フィールドには、TimesTen Logical Serverがデフォルトでリスニングを行うポート番号が表示されます。TimesTen Serverが別のポートでリスニングしている場合は、「Network Port」フィールドにそのポート番号を入力します。
次に例を示します。

10. 「OK」をクリックした後、「TimesTen Logical Server List」ダイアログ・ボックスの「Close」をクリックして、論理サーバー名の作成を終了します。

サーバー名を削除するには、次の手順を実行します。

1. クライアント・システムのWindowsデスクトップで、「スタート」→「設定」→「コントロール パネル」を選択します。

2. 「ODBC」をダブルクリックします。「ODBC データソース アドミニストレータ」が開きます。

3. 「ユーザー DSN」または「システム DSN」のいずれかをクリックします。

4. 「TimesTen Client DSN」を選択して「構成」をクリックします。「TimesTen Client DSN Setup」ダイアログ・ボックスが開きます。

5. 「Servers」をクリックします。「TimesTen Logical Server List」ダイアログ・ボックスが開きます。

6. 「TimesTen Servers」リストからサーバー名を削除します。

7. 「Delete」をクリックします。

UNIXでの論理サーバー名の作成および構成

論理サーバー名を、SYSTTCONNECTINI環境変数で指定されているファイルに定義します。このファイルは、ttconnect.iniファイルと呼ばれます。このファイルには、説明、ネットワーク・アドレスおよびポート番号が含まれています。

TimesTenは、論理サーバーを次の順序で検索します。

1. SYSTTCONNECTINI環境変数によって指定されたファイル内(設定されている場合)

2. install_dir/info/sys.ttconnect.iniファイル内

ttconnect.iniファイルの使用

TimesTenでは、ttconnect.iniファイルを使用して、サーバーの名前と属性、および論理サーバー名とそれらのネットワーク・アドレスとの間のマッピングを定義します。この情報は、TimesTen Clientがインストールされているシステムに格納されます。デフォルトでは、ttconnect.iniファイルは、install_dir/info/sys.ttconnect.iniです。

実行時にこのファイルの名前および場所を上書きするには、TimesTenアプリケーションを起動する前に、SYSTTCONNECTINI環境変数にttconnect.iniファイルの名前および場所を設定します。

UNIXでは、ttconnect.iniファイルにTimesTen Serverの短縮名を定義できます。表2-1に、ttconnect.iniファイルでのTimesTen Server指定の形式を示します。

表2-1 ttconnect.iniファイルでのTimesTen Serverの形式

コンポーネント

説明

[ServerName]

TimesTen Serverシステムの論理サーバー名

Description=description

TimesTen Serverの説明。

Network_Address=network-address

TimesTen Serverが実行されているシステムのDNS名、ホスト名またはIPアドレス。

TCP_Port=port-number

TimesTen Serverが実行されているTCP/IPポート番号。TimesTenリリース11.2.2のデフォルトは、53393(32ビットのプラットフォーム用)および53397(64ビットのプラットフォーム用)です。

ネットワーク・アドレスは、次のいずれかである必要があります。

接続のタイプ

ネットワーク・アドレス

リモートのクライアント/サーバー接続

TimesTen Serverが稼働しているシステムの名前。たとえば、server.mycompany.comなどです。

UNIXドメイン・ソケットを使用する、ローカルのクライアント/サーバー接続

ttLocalHost

プロセス間通信に共有メモリーを使用する、ローカルのクライアント/サーバー接続

ttShmHost

例2-1 論理サーバー名の定義

この例はttconnect.iniファイルの一部を示しており、システムserver.mycompany.comで稼働し、ポート53397をリスニングするTimesTen Serverの論理サーバー名LogicalServer_1122を定義しています。TimesTenインストールのインスタンス名はtt1122_64です。

[LogicalServer_1122]
Description=TimesTen Server 11.2.2
Network_Address=server.mycompany.com
TCP_Port=53397

例2-2 通信におけるUNIXドメイン・ソケットの使用

クライアントとサーバーが同じUNIXシステム上にある場合、TimesTen Client ODBCドライバを使用するアプリケーションで、通信にUNIXドメイン・ソケットを使用すると、パフォーマンスが向上する場合があります。

また、同じバージョンのTimesTen Serverの複数のインスタンスを同じシステム上で実行できるように、TimesTen Serverがリスニングを行うポート番号を論理サーバー名に定義する必要もあります。これには、ttconnect.iniファイルで論理サーバー名を次のように定義します。

[LocalHost_1122]
Description=Local TimesTen Server 11.2.2 through domain sockets
Network_Address=ttLocalHost
TCP_Port=53397

例2-3 プロセス間通信用の共有メモリーの構成

クライアントとサーバーが同じシステム上にある場合、アプリケーションでプロセス間通信に共有メモリーを使用できます。これによって、パフォーマンスが向上する場合があります。

また、TimesTen Serverが初期接続を行うためにリスニングを行っているポート番号を論理サーバー名に定義する必要もあります。これには、ttconnect.iniファイルで論理サーバー名を次のように定義します。

[ShmHost_1122]
Description= Local TimesTen Server 11.2.2 through shared memory
Network_Address=ttShmHost
TCP_Port=53397

TimesTen ClientシステムでのクライアントDSNの作成

クライアントDSNは、リモート・データベースを指定し、TimesTen Clientを使用します。クライアントDSNは、ユーザーDSNとしても、システムDSNとしても定義できます。クライアントDSNは、hostname、DSN(hostnameはTimesTenサーバーが実行しているサーバー・システムを表し、DSNはそのホスト上で定義されているサーバーDSNを表します)のペアを指定して間接的にTimesTenデータベースを参照します。これらは、クライアントDSN接続属性内で構成します。

注意:
TimesTen Client接続属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の接続属性に関する説明を参照してください。

また、実行時に接続属性を、ODBCのSQLDriverConnect関数に渡される接続文字列として構成したり、JDBCのDriverManager.getConnection()メソッドに渡されるURL文字列として構成することもできます。たとえば、サーバー上でクライアントが使用するDSNを指定するには、クライアントの接続文字列またはクライアントDSNでTTC_Server_DSN属性を使用できます。

注意:
クライアントDSNの定義内で構成されたサーバーDSNデータ・ストアまたは最初の接続属性はいずれも無視されます。ただし、TimesTen Clientでは、接続文字列またはURL文字列の一部として、ほとんどのサーバーDSN属性(DataStore接続属性を除く)を渡すことができます。それらは、サーバーに透過的に渡され、サーバーDSNの構成が上書きされます。

次の項では、WindowsプラットフォームまたはUNIXプラットフォームでのクライアントDSNとその属性の作成方法については説明します。

- WindowsでのクライアントDSNの作成および構成

- UNIXでのクライアントDSNの作成および構成

WindowsでのクライアントDSNの作成および構成

Windowsの場合、ODBCデータソース・アドミニストレータを使用して、論理サーバー名の構成およびクライアントDSNの定義を行います。

この項の内容は次のとおりです。

- WindowsでのクライアントDSNの作成

- タイムアウト時間および認証の設定

- Windowsでのリモート・データベースへのアクセス

- 接続のテスト

WindowsでのクライアントDSNの作成

TimesTen Client DSNを定義するには、次の手順を実行します。

1. Windowsデスクトップで、「スタート」→「設定」→「コントロール パネル」→「管理ツール」→「データ ソース (ODBC)」を選択します。「ODBC データソース アドミニストレータ」が開きます。

2. 「ユーザー DSN」または「システム DSN」をクリックします。ユーザーDSNおよびシステムDSNについては、「TimesTenデータベースを識別するためのデータソース名の指定」を参照してください。

3. 「追加」をクリックします。「データソースの新規作成」ダイアログ・ボックスが開きます。

4. 「TimesTen Client 11.2.2」を選択します。「完了」をクリックします。「Oracle TimesTen Client DSN Setup」ダイアログ・ボックスが開きます。

5. 「Client DSN」フィールドに、クライアントDSNの名前を入力します。
クライアント・アプリケーションがインストールされているシステム上の定義したDSNの現行のリストで、この名前は最大32文字で一意である必要があります。論理サーバー名とサーバーDSNの名前を組み合せた一貫したネーミング規則を使用すると、名前の競合を回避できます。たとえば、ある企業に、BostonおよびChicagoという名前の論理サーバーと、AccountsというサーバーDSNがある場合、クライアントDSNの名前はBoston_AccountsおよびChicago_Accountsにできます。

6. 必要に応じて、「Description」フィールドにクライアントDSNの説明を入力します。

7. 「Server Name or Network Address」フィールドで、サーバー・システムの論理サーバー名またはネットワーク・アドレスを指定します。

- この名前には、ホスト名、IPアドレスまたは論理サーバー名を指定できます。クライアント・システムで定義した論理サーバー名は、ドロップダウン・リストに表示されます。論理サーバー名を定義するには、「Servers」をクリックします。

- このフィールドに論理サーバー名を指定しない場合、TimesTen Clientは、TimesTen ServerがデフォルトのTCP/IPポート番号で稼働していると想定します。このため、デフォルトのポート以外でサーバーが稼働しているときにこのフィールドに論理サーバー名を指定しない場合は、TCP_Port属性を使用してODBC接続文字列にポート番号を指定する必要があります。
論理サーバー名の定義の詳細は、「Windowsでの論理サーバー名の作成および構成」を参照してください。

8. 「Server DSN」フィールドに、クライアント・アプリケーションがアクセスするデータベースに対応するサーバーDSNを入力します。

- サーバーDSNの名前がわからない場合は、「Refresh」をクリックして、「Server Name or Network Address」フィールドに指定したシステムで定義されているサーバーDSNのリストを取得します。ドロップダウン・リストから「Server DSN」を選択します。

- TimesTen Serverが稼働しているシステムへのネットワーク・接続が必要です。

このリストに表示するサーバーDSNのカスタマイズ方法については、「ODBCデータソース」を参照してください。

9. 「Connection Character Set」フィールドで、ターミナル設定またはデータソースと一致しているキャラクタ・セットを選択します。デフォルトの接続キャラクタ・セットはUS7ASCIIです。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のConnectionCharacterSetに関する説明を参照してください。

10. 自動クライアント・フェイルオーバーを使用する場合は、「Failover Server Name」、「Failover Port Range」および「Failover DSN」を構成します。詳細は、「自動クライアント・フェイルオーバーの構成」を参照してください。

タイムアウト時間および認証の設定

クライアント/サーバー接続のユーザー名、パスワードおよびタイムアウト時間は、UID、PWDおよびTimeoutの各属性を使用して、クライアントDSNで定義できます。ただし、接続時にユーザー名およびパスワードを指定できるため、クライアントDSNでの認証の構成はオプションです。パスワードは暗号化されずにクライアントに格納されるため、クライアントDSNでパスワード指定することは絶対に避けてください。

UID、PWDおよびTimeoutの各属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の接続属性に関する説明を参照してください。

タイムアウト時間および認証を設定するには、次の手順を実行します。

1. Oracle TimesTenクライアントの「DSN Setup」ダイアログの「User ID」フィールドに、サーバー・システムで定義されているユーザー名を入力します。

2. 「Password」フィールドには、ユーザーIDに対応するパスワードを入力します。「PwdCrypt」フィールドに、暗号化されたパスワードを入力することもできます。

3. 「Timeout Interval」フィールドに、間隔を秒単位で入力します。負の整数以外を入力できます。0を指定すると、クライアント/サーバー処理でタイムアウトは設定されません。デフォルトは60秒です。最大値は99,999秒です。

4. 「OK」をクリックして、設定を保存します。

Windowsでのリモート・データベースへのアクセス

この例で、TimesTen Clientシステムはclient.mycompany.comです。クライアント・アプリケーションは、リモート・サーバー・システムserver.mycompany.com.上のサーバーDSNにアクセスしています。論理サーバー名はLogicalServer_1122です。

注意:
これらの例は、TimesTenのフレッシュ・インストールで事前定義されるサンプルDSNを参照します。

1. サーバー・システムserver.mycompany.comでは、TimesTen Serverが稼働していること、およびTimesTen Serverによってリスニングが行われているポート番号について、ttStatusユーティリティを使用して確認します。

2. 「TimesTen ServerシステムでのサーバーDSNの定義」の手順に従って、サーバーDSNのsampledb_1122が、server.mycompany.com上でシステムDSNとして定義されていることを確認します。

3. クライアント・システムclient.mycompany.comで、リモートTimesTen Server用に論理サーバー名のエントリを作成します。「TimesTen Logical Server Name Setup」ダイアログ・ボックスで、次のように指定します。

- 「Server Name」フィールドに、LogicalServer_1122と入力します。

- 「Network Address」フィールドに、server.mycompany.comと入力します。

- 「Network Port」フィールドに、53397と入力します。これは、TimesTenリリース11.2.2の場合の64ビット・プラットフォームでのTimesTen Serverのデフォルト・ポート番号です。この値は、手順1でttStatusによって表示された値に対応している必要があります。

「TimesTen Server Name」ダイアログ・ボックスを開く手順および詳細は、「Windowsでの論理サーバー名の作成および構成」を参照してください。

4. クライアント・システムclient.mycompany.comで、リモートのサーバーDSNであるsampledbCS_1122に対応するクライアントDSNを作成します。「TimesTen Client DSN Setup」ダイアログ・ボックスで、次の値を入力します。

- 「Client DSN」フィールドに、sampledbCS_1122と入力します。

- 「Server Name or Network Address」フィールドに、LogicalServer_1122と入力します。

- 「Description」フィールドにサーバーの説明を入力します。このフィールドにデータを入力するかどうかはオプションです。

- 「Server DSN」フィールドに、sampledb_1122と入力します。

5. クライアントDSNのsampledbCS_1122を使用して、システムclient.mycompany.comからクライアント・アプリケーションを実行します。次の例では、TimesTen ClientとともにインストールしたttIsqlプログラムを使用します。

ttIsql -connStr "DSN=sampledbCS_1122"

次の例では、デフォルトのポート番号以外を使用するTimesTen Serverにアクセスする方法について説明します。

TimesTen Serverのネットワーク・アドレスがserver.mycompany.comで、TimesTen Serverがポート53397をリスニングしているとします。この場合は、次の方法を使用してサーバーDSNに接続できます。

1. ネットワーク・アドレスにserver.mycompany.com、ネットワーク・ポートに53397を指定して論理サーバー名LogicalServer_1122を定義します。LogicalServer_1122をサーバー名、Server_DSNをサーバーDSNとして、Client_DSNをクライアントDSNとして定義します。次に、コマンドを実行します。

ttIsql -connStr "DSN=Client_DSN"

2. または、ネットワーク・アドレスにserver.mycompany.com、ネットワーク・ポートにデフォルトのポート番号を指定して論理サーバー名LogicalServer_tt1122を定義します。LogicalServer_1122をサーバー名、Server_DSNをサーバーDSNとして、Client_DSNをクライアントDSNとして定義します。コマンドのポート番号を上書きします。

ttIsql -connStr "DSN=Client_DSN;TCP_Port=53397"

接続のテスト

TimesTenデータベースへのクライアント・アプリケーションの接続をテストするには、次の手順を実行します。

1. Windowsデスクトップで、「スタート」→「設定」→「コントロール パネル」を選択します。

2. 「ODBC」をダブルクリックします。「ODBC データソース アドミニストレータ」が開きます。

3. 「ユーザー DSN」または「システム DSN」をクリックします。

4. 接続をテストするTimesTen Client DSNを選択し、「構成」をクリックします。「TimesTen Client DSN Setup」ダイアログ・ボックスが開きます。

5. 「Test Oracle TimesTen Server Connection」をクリックして、TimesTen Serverへの接続をテストします。
ODBCデータソース・アドミニストレータでTimesTen Serverへの接続が試行され、接続が成功したかどうかを示すメッセージが表示されます。このテスト中、TimesTen Clientによって次のことが検証されます。

- クライアント・システムにODBC、WindowsソケットおよびTimesTen Clientがインストールされているかどうか。

- 「TimesTen Client DSN Setup」ダイアログ・ボックスの「Server Name or Network Address」フィールドで指定したサーバーが定義されていて、対応するシステムが存在しているかどうか。

- TimesTen Serverはサーバー・システムで稼働しています。

6. 「Test Data Source Connection」をクリックして、サーバーDSNへの接続をテストします。ODBCデータソース・アドミニストレータでサーバーDSNへの接続が試行され、接続が成功したかどうかを示すメッセージが表示されます。
このテスト中、TimesTen Clientによって次のことが検証されます。

- 「Server DSN」フィールドで指定したサーバーDSNがサーバー・システムで定義されているかどうか。

- クライアント・アプリケーションでサーバーDSNに接続できるかどうか。

UNIXでのクライアントDSNの作成および構成

UNIXでは、ttconnect.iniファイルを編集して論理サーバー名を定義し、クライアントDSNは、ユーザーodbc.iniファイル(ユーザーDSN用)またはシステムodbc.iniファイル(システムDSN用)を編集して定義します。ユーザーDSNおよびシステムDSNについては、「TimesTenデータベースを識別するためのデータソース名の指定」を参照してください。

注意:
odbc.iniファイルでクライアントDSNを定義する場合の構文については、「odbc.iniファイル・エントリの説明」を参照してください。

odbc.iniファイルのODBC Data Sourcesセクションに、クライアントDSNのエントリを追加します。クライアントDSNでは、次の属性を使用して、TimesTenデータベースの場所を指定します。

- 接続に使用するODBCクライアント・ドライバ。

- データベースが存在するサーバー・システムは、TTC_Server属性で指定します。

- 目的のデータベースを指定するサーバーDSNは、TTC_Server_DSN属性で指定します。

注意:
サーバーDSNは、データベースが存在するサーバー・システム上で定義します。

クライアントが接続されるTimesTenデータベースごとに、次の2つのエントリが必要です。

- ODBC Data Sourcesセクションに、クライアントDSN名を定義し、使用するODBCクライアント・ドライバの名前を指定します。

注意:
使用可能なすべてのODBCクライアント・ドライバについては、「TimesTen ODBCドライバを使用する接続」を参照してください。

- ODBC Data Sourcesセクションで定義済のクライアントDSNを使用してエントリを作成します。このセクションで、サーバー・システムおよびサーバーDSNを指定します。

使用するクライアントDSN名およびODBCクライアント・ドライバを指定する構文を次に示します。

[ODBC Data Sources]
Client_DSN=Name-of-ODBC-driver

たとえば、クライアントDSNとしてsampbledbCS_1122を定義し、TimesTen Client ODBCドライバに関連付けるには、odbc.iniファイルのODBC Data Sourcesセクションに次のように入力します。

[ODBC Data Sources]
sampledbCS_1122=TimesTen Client 11.2.2

ODBC Data Sourcesセクションの後に、定義した各データソースに対するサーバー・システムおよびサーバーDSNを指定するエントリを追加します。odbc.iniファイルのODBC Data Sourcesセクションに示されるクライアントDSNごとに指定セクションが必要です。

論理サーバー名LogicalServer_1122を使用してTimesTen Serverを構成し、サーバーDSNがsampledb_1122であるTimesTenクライアントDSN sampledbCS_1122を指定する例を次に示します。

[sampledbCS_1122]
TTC_Server=LogicalServer_1122
TTC_Server_DSN=sampledb_1122

TTC_Server*属性が、クライアントDSN定義の主要属性です。クライアント接続属性の数はわずかですが、それぞれがサーバーDSNを識別します。クライアント定義に指定されたサーバー接続属性は無視されます。クライアント定義では、一般的な接続属性を指定できます。odbc.iniファイルで使用できるすべてのクライアントと、一般的な接続属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の接続属性に関する項を参照してください。

自動クライアント・フェイルオーバーの使用

自動クライアント・フェイルオーバーは、TimesTenアクティブ・スタンバイ・ペア・レプリケーション構成での高可用性シナリオで使用されます。アクティブTimesTenノードの障害によって元のスタンバイ・ノードが新しいアクティブ・ノードになるというシナリオを検討します。自動クライアント・フェイルオーバー機能を使用すると、新しいアクティブ(元のスタンバイ)・ノードへのフェイルオーバー(転送)が発生し、アプリケーションは新しいアクティブ・ノードに自動的に再接続されます。TimesTenは自動クライアント・フェイルオーバーが発生したときに、アプリケーションに警告を渡す機能を提供しているため、アプリケーションは適切な処理を行うことができます。

注意:
自動クライアント・フェイルオーバーは、Oracle Clusterwareが使用されている場合のOracle Clusterwareに対する補完機能ですが、この2つの機能は互いに依存しません。Oracle Clusterwareの詳細は、『Oracle TimesTen In-Memory Database開発者および管理者ガイド』の「Oracle Clusterwareを使用したアクティブ・スタンバイ・ペアの管理」に関する説明を参照してください。

次の項では、自動クライアント・フェイルオーバーを使用および有効化する方法について説明します。

- 自動クライアント・フェイルオーバーの機能

- 自動クライアント・フェイルオーバーの構成

自動クライアント・フェイルオーバーの機能

アプリケーションがアクティブ・ノードに接続すると、接続が登録され、この登録はスタンバイ・ノードにレプリケートされます。アクティブ・ノードに障害が発生すると、スタンバイ・ノードがアクティブ・ノードになり、クライアントにフェイルオーバーのことが通知されます。この時点で、クライアントは新しいアクティブ・ノードに新しく接続します。接続ハンドル以外の状態は保持されません。元の接続からのすべてのクライアント文ハンドルは、無効とマークされます。

フェイルオーバーが完了すると、TimesTenは登録されているユーザー定義関数に対してコールバックを行います。この関数は、フェイルオーバーが発生している状況で実行する必要があるカスタム処理を行います。

注意:
C開発者の場合、コールバックの作成方法および自動クライアント・フェイルオーバーの促進方法についての詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』の「アプリケーションでの自動クライアント・フェイルオーバーの使用」に関する説明を参照してください。
Java開発者の場合、詳細は、『Oracle TimesTen In-Memory Database Java開発者ガイド』の「自動クライアント・フェイルオーバー用のJDBCのサポート」に関する説明を参照してください。

次の項目は、特定の障害シナリオにおける自動クライアント・フェイルオーバーの動作を示しています。

- クライアント・ライブラリがアクティブ・ノードとの接続を失った場合、フェイルオーバーを実行してスタンバイ・ノードへの切換えを試行します。

- なんらかの理由でアクティブ・ノードがない場合(サーバー側でフェイルオーバーが発生せず、両方のサーバーがスタンバイかアイドル状態)は、アプリケーションは接続できません。ただし、自動クライアント・フェイルオーバーは、アクティブ・ノードを見つけるか、タイムアウトになるまで、両方のサーバーの切替えを継続します。

- フェイルオーバーがすでに発生し、クライアントがすでに新しいアクティブ・ノードに接続されている場合、次のフェイルオーバー・リクエストでは、元のアクティブ・ノードへの再接続が試みられます。これが失敗すると、タイムアウトになるまで、2つのサーバーに接続するために切替え試行が行われます。

注意:
自動クライアント・フェイルオーバーを使用している場合にTimesTenが障害からリカバリしようとするとき、タイムアウトは、フェイルオーバーのリカバリにおけるすべての試行の期間を指定します。フェイルオーバーが試行されている間は、接続はブロックされることがあります。
このタイムアウトはデフォルトが60秒で、TTC_Timeout接続属性の値を使用して設定できます。TTC_Timeoutの設定にかかわらず、最小タイムアウトは60秒です。この属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の「TTC_Timeout」を参照してください。

- クライアント登録がスタンバイ・ノードへのレプリケーションによって正常に伝播される前にアクティブ・ノードで障害が発生した場合、クライアントはフェイルオーバー・メッセージを受信せず、接続登録は失われます。ただし、最終的に、クライアント・ライブラリによって、元のアクティブ・ノードへの接続が失われたためにフェイルオーバーの試行を開始することが(TCPを介して)通知されます。

注意:

- これらの機能は、クライアント/サーバー接続のみに適用されます。直接接続には適用されません。

- フェイルオーバー接続は、事前に作成されるのではなく、必要に応じてのみ作成されます。

- 自動クライアント・フェイルオーバーを使用すると、サーバー・プロセスごとに1つのデータベース接続が追加されるため、TimesTenのConnections属性(データベースへの同時接続数の上限)の設定を選択することを考慮する必要があります。サーバー・プロセスの数は、MaxConnsPerServer属性(子サーバー・プロセスによって処理可能な同時接続の最大数)の設定にも影響を受けます。たとえば、接続が12個あり、MaxConnsPerServer=3の場合、サーバー・プロセスは4個になります。したがって、いくつかの接続で自動クライアント・フェイルオーバーを使用する場合、追加の接続は4個になります。

自動クライアント・フェイルオーバーの構成

アクティブ・スタンバイ・ペアのレプリケーション・スキームを使用するデータベースに対して、自動クライアント・フェイルオーバーのみを構成できます。これにより、クライアントは、スタンバイ・データベースが存在するサーバーに自動的にフェイルオーバーできるようになります。

注意:
フェイルオーバー後の接続オプションの永続性の詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』の「アプリケーションでの自動クライアント・フェイルオーバーの使用」に関する説明を参照してください。

Windowsでの自動クライアント・フェイルオーバーの構成

Oracle TimesTenの「Client DSN Setup」ダイアログで、「WindowsでのクライアントDSNの作成および構成」の説明のとおり、残りのクライアントDSN情報を構成した後で、次のフィールドに入力します。

1. 「Failover Server Name or Network Address」フィールドで、サーバー・システムの論理サーバー名またはネットワーク・アドレスを指定します。

- この名前には、ホスト名、IPアドレスまたは論理サーバーを指定できます。クライアント・システムで定義した論理サーバー名は、ドロップダウン・リストに表示されます。論理サーバー名を定義するには、「Servers」をクリックします。

- このフィールドに論理サーバー名を指定しない場合、TimesTen Clientは、TimesTen ServerがデフォルトのTCP/IPポート番号で稼働していると想定します。このため、デフォルトのポート以外でサーバーが稼働しているときにこのフィールドに論理サーバー名を指定しない場合は、TCP_Port属性を使用してODBC接続文字列にポート番号を指定する必要があります。
論理サーバー名の定義の詳細は、「Windowsでの論理サーバー名の作成および構成」を参照してください。

2. 「Failover Server DSN」フィールドに、スタンバイ・データベースに対応するサーバーDSNを入力します。

- サーバーDSNの名前がわからない場合は、「Refresh」をクリックして、「Failover Server Name or Network Address」フィールドに指定したシステムで定義されているサーバーDSNのリストを取得します。ドロップダウン・リストから「Server DSN」を選択します。

- TimesTen Serverが稼働しているシステムへのネットワーク・接続が必要です。

3. オプションで、TimesTenがフェイルオーバー通知をリスニングするポートまたはポート範囲に対応した「Failover Port Range」を指定します。サーバー・ホストとクライアント・ホスト間にファイアウォールの問題がある場合、この接続属性は単一ポート番号として指定する必要があります。TimesTenでは、デフォルトで、オペレーティング・システムによって選択されたポートが使用されます。フェイルオーバー通知がサーバー・ホストからクライアント・ホストに発行されます。ポート範囲は、最小値と最大値をハイフンで区切って設定します。
次の2つの条件が一致する場合は、ポート範囲のみを指定する必要があります。

- サーバー・ホストとクライアント・ホスト間にファイアウォールの問題がある。

- 1つのクライアント・ホスト上で複数のクライアント・アプリケーションを使用して自動クライアント・フェイルオーバーを構成している。

クライアント・ホスト上で自動クライアント・フェイルオーバーを構成している各クライアント・アプリケーションは、フェイルオーバー通知用の個別ポートでリスニングする必要があります。

UNIXでの自動クライアント・フェイルオーバーの構成

クライアントでは、次のように構成します。

1. クライアントのodbc.iniファイルで、スタンバイ・データベースがあるサーバーに対してTTC_Server2を構成することで、スタンバイ・ノードのクライアントDSNを定義します。TTC_Server_DSN2をスタンバイ・データベースの名前に設定します。
次に例を示します。

[MyDSN]
TTC_Server=LogicalServer_1122
TTC_Server_DSN=MyDSN
TTC_Timeout=60
TTC_Server2=LogicalServer2_1122
TTC_Server_DSN2=MyDSN_Standby

2. クライアント上のttconnect.iniファイルで、スタンバイ・データベースがあるサーバーに対してNetwork_AddressとTCP_Portを構成することによって、スタンバイ・ノードの論理サーバーを定義します。

[LogicalServer_1122]
Description=TimesTen Server 11.2.2
Network_Address=server.mycompany.com
TCP_Port=53397

[LogicalServer2_1122]
Description=TimesTen Server 11.2.2
Network_Address=server2.mycompany.com
TCP_Port=53397

TTC_Server2、TTC_Server_DSN2またはTCP_Port2のいずれかを設定することは、暗黙的に次のことを意味します。

- ユーザーは、自動クライアント・フェイルオーバーを使用するつもりである。

- ユーザーは、フェイルオーバー・メカニズムをサポートするためにアプリケーションに新しいスレッドが作成されることを理解している。

3. オプションで、TTC_FailoverPortRange属性を構成して、フェイルオーバー・スレッドがフェイルオーバー通知をリスニングするポートまたはポート範囲を指定します。サーバー・ホストとクライアント・ホスト間にファイアウォールの問題がある場合、この接続属性は単一ポート番号として指定する必要があります。デフォルトでは、オペレーティング・システムで選択されたポートが使用されます。フェイルオーバー通知がサーバー・ホストからクライアント・ホストに発行されます。ポート範囲は、最小値と最大値をハイフンで区切って設定します。
次の2つの条件が一致する場合は、ポート範囲のみを指定する必要があります。

- サーバー・ホストとクライアント・ホスト間にファイアウォールの問題がある。

- 1つのクライアント・ホスト上で複数のクライアント・アプリケーションを使用して自動クライアント・フェイルオーバーを構成している。

クライアント・ホスト上で自動クライアント・フェイルオーバーを構成している各クライアント・アプリケーションは、フェイルオーバー通知用の個別ポートでリスニングする必要があります。

注意:

- 他の接続属性と同様に、TTC_Server2、TTC_Server_DSN2およびTCP_Port2は接続文字列で指定でき、この指定はDSNのすべての設定より優先されます。

- TTC_Server2を指定して、TTC_Server_DSN2およびTCP_Port2を指定しなかった場合、TTC_Server_DSN2はTTC_Server_DSNの値に設定され、TCP_Port2はTCP_Portの値に設定されます。

- クライアント・ライブラリがTTC_Server_DSNに接続できない場合、スタンバイであるTTC_Server_DSN2に接続を試みます。

- 仮想IPアドレスの場合、TTC_ServerとTTC_Server2で同じ設定を使用できます。

TimesTen Serverの起動

TimesTen Serverとは、TimesTenデーモンの子プロセスのことです。TimesTen Serverがインストールされていて、TimesTenデーモンまたはData Managerサービスが起動または停止されると、このプロセスは自動的に起動および停止されます。このデーモンまたはサービスは、ttDaemonAdminユーティリティを使用して明示的に起動または停止できます。

TimesTen Serverは、TimesTen Clientドライバとリンクされたアプリケーションからのリクエストを処理します。

TimesTenデーモンおよびTimesTen Serverのデフォルト・ポートの詳細は、『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』の「TimesTenのインストール」に関する説明の章を参照してください。システム管理者は、競合の回避またはセキュリティ上の理由から、インストール時にポート番号を変更できます。ポートの範囲は1から65535です。TimesTen Serverに接続するには、クライアントDSNで、論理サーバー名の定義の一部としてポート番号を指定するか、接続文字列にポート番号を指定する必要があります。

Windowsの場合、TimesTenサービスはSYSTEMユーザーとして実行されます。UNIXの場合、TimesTen Serverはインスタンス管理者として実行されます。

TimesTen Serverオプションの変更方法については、「TimesTen Serverオプションの変更」を参照してください。

サーバー情報メッセージ

TimesTen Serverは、接続、切断、様々な警告、エラーおよび情報エントリをログ・ファイルに記録します。

Windowsの場合、これらのアプリケーション・メッセージはイベント・ビューアで表示できます。

UNIXシステムの場合、TimesTen Serverはデフォルトでinstall_dir/info/ttmesg.logファイルとinstall_dir/info/tterrors.logファイルにメッセージを記録します。オプションで、syslog機能にメッセージを記録するようTimesTenを構成することもできます。

「情報メッセージの変更」を参照してください。

UNIXでのリモート・データベースへのアクセス

この例では、TimesTen Clientアプリケーション・システムは64ビットSolarisシステム、client.mycompany.comです。クライアント・アプリケーションは、リモート・サーバー・システムである、もう1つの64ビットSolarisシステム、server.mycompany.com上のサーバーDSNsampledb_1122にアクセスしています。論理サーバー名はLogicalServer_1122です。TimesTenインストールのインスタンス名はtt1122_64です。

1. サーバー・システムserver.mycompany.comでは、TimesTen Serverが稼働していること、およびTimesTen Serverによってリスニングが行われているポート番号について、ttStatusユーティリティを使用して確認します。

2. server.mycompany.com上のシステムodbc.iniファイルに、サーバーDSNであるsampledb_1122が指定されていることを確認します。
これらは、odbc.iniファイルで次のように指定されている必要があります。

[sampledb_1122]
Driver=install_dir/lib/libtten.so
DataStore=install_dir/server/sampledb_1122

3. client.mycompany.com上のttconnect.iniファイルで、リモートTimesTen Server用に論理サーバー名のエントリを作成します。

[LogicalServer_1122]
Network_Address=server.mycompany.com
TCP_Port=53397

ttconnect.iniファイルの作成方法は、「UNIXでのクライアントDSNの作成および構成」を参照してください。

4. クライアント・システムclient.mycompany.comで、リモートのサーバーDSNであるsampledb_1122に対応するクライアントDSNを作成します。
これらは、odbc.iniファイルで次のように指定されている必要があります。

[sampledbCS_1122]
TTC_Server=LogicalServer_1122
TTC_Server_DSN=sampledb_1122

適切なodbc.iniファイルの場所は、「ユーザーDSNおよびシステムDSNの概要」を参照してください。

5. クライアントDSNのsampledbCS_1122を使用して、システムclient.mycompany.comからクライアント・アプリケーションを実行します。次の例では、TimesTen ClientとともにインストールしたttIsqlプログラムを使用します。

ttIsqlCS -connStr "DSN=sampledbCS_1122"

次の例では、デフォルトのポート番号以外を使用するTimesTen Serverにアクセスする方法について説明します。

TimesTen Serverのネットワーク・アドレスがserver.mycompany.comであり、TimesTen Serverがポート53397をリスニングしているとします。この場合は、次の方法を使用してサーバーDSNに接続できます。

1. ネットワーク・アドレスにserver.mycompany.com、ネットワーク・ポートに53397を指定して論理サーバー名LogicalServer_1122を定義します。LogicalServer_1122をサーバー名、Server_DSNをサーバーDSNとして、Client_DSNをクライアントDSNとして定義します。次のコマンドを実行します。

ttIsqlCS -connStr "DSN=Client_DSN"

2. または、ネットワーク・アドレスにserver.mycompany.com、ネットワーク・ポートにデフォルトのポート番号を指定して論理サーバー名logical_serverを定義します。サーバー名にLogicalServer_1122、サーバーDSNにServer_DSNを指定してクライアントDSNを定義します。コマンドのポート番号を上書きします。

ttIsqlCS -connStr "DSN=Client_DSN;TCP_Port=53397"

3. あるいは、接続文字列にサーバーを定義します。この場合、クライアントDSNや論理サーバー名を定義する必要はありません。

ttIsqlCS -connStr "TTC_Server=server.mycompany.com;TTC_Server_DSN=Server_DSN;TCP_Port=53397"

接続のテスト

TimesTenデータベースへのクライアント・アプリケーションの接続をテストするには、次の手順を実行します。

1. クライアント・システムがサーバー・システムにアクセスできることを確認します。

2. サーバー・システムから応答があるかどうかを確認するために、クライアント・システムからpingを実行します。

3. TimesTen Serverがサーバー・システムで稼働していることを確認します。

- TimesTen Serverがリスニングを行っているポートにtelnetで接続します。次に例を示します。

telnet server.mycompany.com 53397

- TimesTen Serverへの接続に成功すると、次のようなメッセージが表示されます。

Connected to server.mycompany.com

- サーバー・システムはコマンドに応答するが、TimesTen Serverが応答しない場合は、TimesTen Serverが稼働していない可能性があります。接続に失敗した場合、次のようなメッセージが表示されます。

telnet: Unable to connect to remote host: Connection refused

- サーバー・システム上のttStatusユーティリティを使用して、TimesTen Serverのステータスおよびポート番号を確認します。通常、TimesTen Serverはインストール時に起動されます。TimesTen Serverが稼働していない場合は、起動する必要があります。TimesTen Serverの起動方法は、「TimesTen Serverオプションの変更」を参照してください。

4. クライアント・アプリケーションがデータベースに接続可能であることを確認します。データベースへの接続を確立できない場合は、ttconnect.iniファイルに正しい情報が指定されていることを確認します。

5. ttconnect.iniファイルの情報が正しい場合は、データベースが存在し、TimesTen Serverが稼働しているシステムで、データベースに対応するサーバーDSNがシステムのodbc.iniファイルで適切に設定されていることを確認します。

3 TimesTen Data Managerデーモンでの処理

TimesTen Data Managerデーモン(Windows上のOracle TimesTen Data Managerサービス)は、TimesTenをインストールすると起動されます。デーモンは、バックグラウンドで常時稼働しています。

TimesTenデーモンは次の機能を実行します。

- 共有メモリーのアクセスの管理

- プロセス・リカバリの調整

- 存在するデータベース、使用中のデータベースおよびいずれのアプリケーション・プロセスがいずれのデータベースに接続されているかに関する管理用統計の保持

- RAMポリシーの管理

- レプリケーション・プロセス、TimesTen Serverおよびキャッシュ・エージェントの起動。

アプリケーション開発者は、デーモンと直接対話しません。デーモンでアプリケーション・コードは実行されないため、通常、アプリケーション開発者がデーモンについて考慮する必要はありません。TimesTenデータベースにアクセスするアプリケーション・プログラムは、TimesTen内部ルーチンを透過的に使用してデーモンと通信します。

次の項では、様々なプラットフォームでTimesTenデーモンと対話する方法について説明します。

- TimesTenデーモンの起動および停止

- TimesTenアプリケーションの停止

- TimesTenデーモン・オプションの管理

- TimesTen Client/Serverのオプションの管理

TimesTenデーモンの起動および停止

次の項では、様々なプラットフォームでTimesTenデーモンを起動および停止する方法について説明します。

- WindowsでのOracle TimesTen Data Managerサービスの起動および停止

- UNIXでのデーモンの起動および停止

注意:
デーモンは、デーモンが起動されたディレクトリにtimestend.pidファイルを書き込みます。デフォルトでは、デーモンのホーム・ディレクトリは、UNIXの場合はinstall_dir/info、Windowsの場合はinstall_dir\srv\infoです。このファイルには、デーモンのプロセスIDが含まれています。プロセスが停止すると、timestend.pidは削除されます。

WindowsでのOracle TimesTen Data Managerサービスの起動および停止

Oracle TimesTen Data Managerサービスは、Oracle TimesTen Data ManagerをWindowsシステムにインストールすると自動的に起動されます。Oracle TimesTen Data Managerサービスを手動で起動および停止するには、-startまたは-stopオプションを指定してttDaemonAdminユーティリティを使用するか、またはWindowsの管理ツールを次のように使用します。

1. Windowsの「管理ツール」を開きます。

2. 「サービス」をダブルクリックします。現在使用可能なすべてのサービスが表示されます。

3. 「TimesTen Data Manager 11.2.2」を選択し、該当するボタンをクリックしてサービスを停止または起動します。

注意:
TimesTenサービスを起動および停止するには、管理権限が必要です。

スタートアップ・モードの変更

TimesTen Data Managerをインストールすると、システムを再起動するたびにTimesTen Data Managerサービスが自動的に起動します。また、TimesTen Serverをインストールしている場合、TimesTen Data Managerのサービスを開始すると、TimesTen Serverが自動的に起動されます。TimesTen Data Managerのスタートアップ・モードを手動に変更することもできます。

スタートアップ・モードを変更するには、次の手順を実行します。

1. Windowsの「管理ツール」を開きます。

2. 「サービス」をダブルクリックします。現在使用可能なすべてのサービスが表示されます。

3. 「TimesTen Data Manager 11.2.2」サービスをダブルクリックして、その「プロパティ」ダイアログを調べます。

4. プロパティ・ダイアログで、「スタートアップの種類」リストに「自動」(デフォルト)が示されます。オプションで、「手動」に変更できます。いずれの場合も、プロパティ・ダイアログで「停止」または「開始」(の適切な方)をクリックして、サービスを停止または起動できます。通常の使用方法では、スタートアップの種類をデフォルトに戻し、一通り確認して「OK」をクリックします。

UNIXでのデーモンの起動および停止

TimesTenデーモンを起動および停止するには、インスタンス管理者である必要があります。

setuprootスクリプトを実行していないかぎり、システムをリブートするたびにインスタンス管理者が手動でデーモンを起動および停止する必要があります。TimesTenメイン・デーモンを手動で起動および停止するには、-startまたは-stopオプションを指定してttDaemonAdminユーティリティを使用します。

rootユーザーは、デーモン起動スクリプトを実行してデーモンを起動できます。次の表に、デーモン起動スクリプトの場所をプラットフォームごとに示します。

環境

デーモン起動スクリプトの場所

Linux

/etc/init.d/tt_instance_name

Solaris

/etc/init.d/tt_instance_name

AIX

/etc/init.d/tt_instance_name

setuprootスクリプトの実行

システムを再起動するたびにTimesTenインスタンスを起動する場合、rootとしてsetuprootスクリプトを実行します。setuprootスクリプトはinstall_dir/binディレクトリにあります。

# cd install_dir/bin
# setuproot -install

TimesTenアプリケーションの停止

TimesTenアプリケーションは、共有メモリーに割り当てられたデータベース、ユーザー接続、場合によっては他のTimesTenデータベースまたはOracle Databasesと通信するためのレプリケーション・エージェントやキャッシュ・エージェントで構成されています。

TimesTenアプリケーションを停止するには、次の手順を実行します。

1. すべてのユーザー接続を正常に切断します。

2. すべてのレプリケーション・エージェントおよびキャッシュ・エージェントを停止します。

3. データベースが手動でロードされた場合は、共有メモリーからデータベースをアンロードします。

4. TimesTenデーモンを停止します。

TimesTenデーモン・オプションの管理

TimesTenデーモン・オプションは、ttendaemon.optionsファイルに格納されています。これらのオプションの一部は、インストール時に、インストール・プロンプトに対するユーザーの応答に応じてインストーラによって設定されます。

Windowsの場合、ttendaemon.optionsファイルは、次のデーモンのホーム・ディレクトリにあります。

install_dir\srv\info

UNIXの場合、ttendaemon.optionsファイルは、次のデーモンのホーム・ディレクトリにあります。

install_dir/info

ttendaemon.optionsファイルで管理される内容は次のとおりです。

- デーモンがリスニングを行うネットワーク・インタフェース

- TimesTenインスタンスに存在可能なTimesTenサブデーモンの最小数および最大数

- TimesTen Serverが起動されるかどうか

- クライアント/サーバーのプロセス間通信用に共有メモリー・セグメントを使用するかどうか

- システムで事前に生成されるサーバー・プロセスの数

- サポート・ログおよびユーザー・ログの場所とサイズ

- 下位互換性

- TimesTenインスタンスの最大ユーザー数

- NFSマウントされたシステム間のデータ・アクセス。Linuxの場合のみです。

- Oracle Database用のTNS_ADMIN値。このオプションは、このファイルでは変更できません。

- 致命的エラーの後のデフォルトのデータベース・リカバリの変更

ttmodinstallユーティリティを使用すると、ttendaemon.optionsファイルの最もよく変更されるオプションを変更できます。『Oracle TimesTen In-Memory Databaseリファレンス』のttmodinstallに関する説明を参照してください。あるオプションをttmodinstallで変更できず、ttendaemon.optionsファイルを直接変更する必要がある場合は、TimesTenデーモンを停止してからファイルを変更してください。ファイルの変更が完了したら、TimesTenデーモンを再起動します。TimesTenサーバー・オプションを変更する場合、停止する必要があるのはサーバーのみです。TimesTenデーモンを停止する必要はありません。

この項の後半の内容は次のとおりです。

- アドレスをリスニングするデーモンの決定

- 情報メッセージの変更

- サブデーモンの生成可能な数の変更

- NFSマウントされたシステムを介したデータベース・アクセスの許可

- Linuxラージ・ページのサポートの有効化

- 致命的なエラー後の自動データベース・リカバリのデフォルトを変更する

- 範囲を共有メモリー・キー向けに構成する

アドレスをリスニングするデーモンの決定

デフォルトでは、TimesTenのメイン・デーモン、すべてのサブデーモンおよびエージェントは、使用可能な任意のアドレスを使用してリクエスト用のソケットでリスニングします。すべてのTimesTenユーティリティおよびエージェントは、ループバック・アドレスを使用してメイン・デーモンと通信し、メイン・デーモンはループバック・アドレスを使用しエージェントと通信します。

ttendaemon.optionsファイルに個別の行で指定する-listenaddrエントリは、指定した値で示される特定のアドレスでリスニングするようにTimesTenデーモンに指示します。このオプションが指定されたアドレスには、ホスト名または数値のIPアドレスのいずれかを指定できます。

-listenaddrパラメータは、単一のサーバーに複数のネットワーク・アドレスおよびネットワーク・カードが含まれている場合に存在します。この場合、TimesTenデーモンによってリスニングされるネットワーク・アドレスを、サーバーのネットワーク・アドレスのサブセットに制限できます。これは、デーモンがリスニングする対象となるアドレスを入力することによって行います。次の状態が発生する可能性があります。

- ローカル・ネットワーク内部と外部の両方でアクセス可能なパブリック・ネットワーク・アドレス、およびローカル・ネットワーク内部でのみアクセス可能なプライベート・アドレスがサーバーに含まれている場合、プライベート・アドレスのみを含む-listenaddrエントリを追加すると、パブリック・アドレスで受信されるTimesTenへのすべての通信がブロックされます。

- ローカル・ホストのみを指定することによって、TimesTenメイン・デーモンをサーバー外部からのすべての通信から切り離し、TimesTenメイン・デーモンでローカルのクライアントおよびサブデーモンのみと通信できます。

TimesTenレプリケーションと-listenaddrパラメータ間に関連はなく、レプリケーションを有効にした場合に-listenaddrパラメータを有効にする必要はありません。-listenaddrが有効になっている環境でレプリケーションを使用する場合は、使用可能なネットワーク・アドレスがレプリケーション・ノードで認識される必要があります。ただし、有効になっている-listenaddrパラメータが存在しない場合でも、レプリケーションは機能します。

ttendaemon.optionsファイルの個別の行に対してデーモンがリスニングを行うアドレスを明示的に指定するには、次のように入力します。

-listenaddr address

たとえば、ループバック・アドレスに対してのみリスニングを行うようにデーモンを制限する場合は、次のように入力します。

-listenaddr 127.0.0.1

または

-listenaddr localhost

これは、ローカル・システム上のプロセスのみがデーモンと通信できることを意味します。他のシステムからのプロセスは除外されるため、他のシステムとの間でレプリケーションを行ったり、他のシステムからクライアント・アクセス権を付与することはできません。

異なるサブネットに複数のイーサネット・カードがある場合は、-listenaddrエントリを指定してデーモンに接続できるシステムを制御できます。

ttendaemon.optionsファイル内の最大4行の個別の行にオプションおよび値を指定して、リスニングを行う最大4つのアドレスを入力できます。指定したアドレスに加えて、ループバック・アドレスでも常にTimesTenによるリスニングが行われています。

IPv6のリスニング

デフォルトでは、TimesTenはIPv4プロトコルを使用します。デーモンによるIPv6のリスニングを有効にするには、ttendaemon.optionsファイルに次の行を個別の行に入力する必要があります。

-enableIPv6

および

-listenaddr6 address

- IPv6アドレスを指定するには、IPv6を有効にする-listenaddr6オプションを指定します。

- -enableIPv6オプションと1つ以上の-listenaddrオプションまたは-listenaddr6オプションを指定すると、IPv6ループバック・インタフェースがリストに追加されます。

- -enableIPv6オプションを指定し、-listenaddrまたは-listenaddr6オプションでアドレスを何も指定しなかった場合、デーモンはすべてのIPv6インタフェースおよびすべてのIPv4インタフェースでリスニングを行います。

このオプションが指定されたアドレスには、ホスト名または数値のIPアドレスのいずれかを指定できます。-listenaddrオプションの詳細は、「アドレスをリスニングするデーモンの決定」を参照してください。

1つ以上の-listenaddrオプションが指定されると、デーモンは指定されたIPv4インタフェースに対するリスニングを行い、IPv4ループバック・アドレスがリストに追加されます(ループバック・アドレスが指定されていない場合)。-enableIPv6のみが指定されている場合は、IPv4およびIPv6のすべてのインタフェースに対するリスニングを行います。

-listenaddrオプションと-listenaddr6オプションの両方を指定できます。1つ以上の-listenaddr6オプションが指定されると、デーモンは指定されたIPv4またはIPv6インタフェースに対するリスニングを行い、IPv4とIPv6の両方のループバック・インタフェースが追加されます(ループバック・インタフェースが指定されていない場合)。ネーム・リゾルバが1つの名前に対して複数のIPv4またはIPv6(あるいはその両方)のアドレスを返した場合、デーモンはすべての名前に対するリスニングを行います。

情報メッセージの変更

デーモンは、動作時に、エラー、警告および情報メッセージを生成します。これらのメッセージは、Timestenのシステム管理およびアプリケーションのデバッグに有効です。

デフォルトでは、次の場所に情報メッセージが格納されます。

- ユーザーが確認する必要がある可能性がある情報が格納されるユーザー・エラー・ログ。通常、これらのメッセージには、実行する必要がある可能性がある処理が含まれています。

- ユーザー・エラー・ログ内のすべての情報およびTimesTenカスタマ・サポートで使用される情報が格納されるサポート・ログ。

ttDaemonLogユーティリティを使用すると、TimesTenユーザー・ログおよびエラー・ログに対して書込みおよびフェッチを行うイベントのタイプを制御できます。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttDaemonLogに関する説明を参照してください。

ttendaemon.optionsファイルにある次のオプションでは、サポート・ログおよびユーザー・ログの場所とサイズ、およびシステム上に保存されるファイルの数を指定します。

オプション

説明

-supportlog path -f path

サポート・ログ・ファイルの場所を指定します。デフォルトのファイルはdaemon_home/ttmesg.logです。

-maxsupportlogfiles num

TimesTenメイン・デーモンは、指定されたサイズに達すると自動的にファイルを入れ替えます。このオプションでは、保存するサポート・ログ・ファイルの数を指定します。デフォルトは10です。

-maxsupportlogsize nBytes

サポート・ログ・ファイルの最大サイズを指定します。デフォルトは100MBです。

-userlog logfile
または

-userlog [syslog]

logfile: ユーザー指定のlogfileには、使用するログ・ファイルの場所および名前を指定します。デフォルトのファイルはdaemon_home/tterrors.logです。
syslog: 出力が次のオペレーティング・システム・ファイルのいずれかに送信されるように-userlog [syslog]を指定します。

- UNIX syslog

- Windowsイベント・ログ

-maxuserlogfiles num

TimesTenメイン・デーモンは、指定されたサイズに達すると自動的にファイルを入れ替えます。このオプションでは、保存するユーザー・ログ・ファイルの数を指定します。デフォルトは10です。

-maxuserlogsize nBytes

ユーザー・ログの最大サイズを指定します。デフォルトは10MBです。

-showdate

UNIXシステムでのみ、すべてのメッセージの先頭に日付が追加されることを示します。

ログ・メッセージの出力場所としてイベント・ログを指定した場合、それらのログを表示するには、次の手順を実行します。

1. 「イベント ビューア」ウィンドウを開きます。「スタート」→「コントロール パネル」→「管理ツール」→「イベント ビューア」を選択します。

2. 「イベント ビューア」リストで、「Applications and Services Logs」を選択します。
ウィンドウには、アプリケーションで生成されるログ・メッセージが表示されます。「ソース」列に「TimesTen」と記載されているメッセージは、Oracle TimesTen Data Managerサービスによって生成されたものです。

3. TimesTenメッセージを表示するには、メッセージ・サマリーをダブルクリックします。
メッセージ・ウィンドウが表示されます。「次へ」または「前へ」をクリックするか、あるいは上矢印または下矢印をクリックして、追加のメッセージを表示できます(表示方法は、Windowsのバージョンによって異なります)。

注意:
ttDaemonLogユーティリティを使用してメッセージを表示することもできます。

TimesTenデーモンおよびサブデーモンのメッセージを記録するために使用するsyslog機能をUNIXで指定するには、ttendaemon.optionsファイルの個別の行に次のオプションを追加します。

-facility name

指定できる名前値は、auth、cron、daemon、local0-local7、lpr、mail、news、userまたはuucpです。

詳細なログ・メッセージを無効にするには、ttendaemon.optionsファイルの-verboseの前に#を追加します。

サブデーモンの生成可能な数の変更

TimesTenでは、サブデーモンを使用して次のことを行います。

- データベースの管理。

- ディスクへのトランザクション・ログ・バッファのフラッシュ。

- 定期的なチェックポイントの実行。

- 様々な表のエージング・ポリシーの実装。

- デッドロックの検出および解消。

- 直接モード・アプリケーションが異常終了した場合のトランザクションのロールバック。

- データベースに対して必要なバックグラウンド処理の実行。

TimesTenメイン・デーモンは、必要に応じてサブデーモンを動的に生成します。最大数および最小数を指定して、デーモンが生成できるサブデーモンの範囲を手動で指定できます。

任意の時点で、リカバリ中の失敗した各アプリケーション・プロセスに対するTimesTenプロセス・リカバリに、1つのサブデーモンが必要な場合があります。

デフォルトでは、TimesTenは最小で4つのサブデーモンを生成します。サブデーモンのデフォルトの最大数は50です。ただし、ttendaemon.optionsファイルの-minsubsおよび-maxsubsオプションに新しい値を指定して、これらの設定を変更できます。

NFSマウントされたシステムを介したデータベース・アクセスの許可

デフォルトでは、TimesTenシステムは、NFSマウントされたシステムを介してデータにアクセスすることはできません。Linux x86 64ビット・システムの場合は、NFSマウントされたシステム上のチェックポイントおよびトランザクション・ログ・ファイルにアクセスできます。

NFSマウントされたシステムでデータ・アクセスを有効にするには、ttendaemon.optionsファイルに次の個別の行を追加します。

-allowNetworkFiles

Linuxラージ・ページのサポートの有効化

TimesTenでLinuxラージ・ページのサポートを有効にするには、ttendaemon.optionsファイルに次の個別の行を追加します。

-linuxLargePageAlignment Size_in_MB

Size_in_MBは、/proc/meminfoのHugepagesizeの値をKB単位ではなくMB単位にしたものです。

オペレーティング・システム・レベルでのHugePagesの詳細は、『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』のLinuxの前提条件に関する説明を参照してください。

致命的なエラー後の自動データベース・リカバリのデフォルトを変更する

TimesTenデーモンを開始する前に、ttendaemon.optionsファイルの-enablePolicyInactiveオプションを設定して、データベースのリカバリ動作を変更できます。このオプションの詳細については、「自動リカバリ失敗後のRAMポリシーへの変更」を参照してください。

範囲を共有メモリー・キー向けに構成する

TimesTenで-shmkeyrangeデーモン・オプションを使用して、範囲をすべての共有メモリー・キー向けに構成できます。共有メモリーの衝突を防ぐため、共有メモリー・キーを特定の範囲内に制限できます。ただしこのオプションを使用する場合、特定の範囲内の共有メモリー・キーが他の共有メモリー・セグメントによって使用されていないことを確認するのはユーザーの責任になります。

注意:
このオプションはUNIXまたはLinuxプラットフォームでのみ使用できます。このオプションはWindowsプラットフォームには使用できません。

構文は次のとおりです。

-shmkeyrange low-high

次に例を示します。

-shmkeyrange 0x4000000-0x40FFFFFF

low-high句にスペースを含めることはできません。先頭と末尾も範囲に含まれます。したがって前述の例では、0x40000000と0x40FFFFFFはどちらも有効なキーです。また、範囲の最小サイズは16です。

このオプションを使用すると共有メモリー・キーが枯渇することがあります。特に複数の無効化が存在する場合や、当初の想定より多くのTimesTenデータベースが存在する場合に、これが発生することがあります。

共有メモリー・キーに対して次の無効なオプションのいずれかを入力すると、TimesTenデーモンによる起動プロセスは中止されます。

- 無効な数値文字列

- 範囲に数字を1つだけ指定

- 範囲指定で最初の数が2番目の数より大きい

- 範囲のサイズが16未満。

- 範囲指定が正しくない。

TimesTen Client/Serverのオプションの管理

この項の内容は次のとおりです。

- TimesTen Serverのオプションの変更

- TimesTen Serverの制御

- TimesTen Serverプロセスの事前生成

- TimesTen Serverに対する複数の接続の指定

- クライアント/サーバーIPCでの共有メモリーの使用方法

- TimesTen Serverログ・メッセージの制御

TimesTen Serverのオプションの変更

TimesTen Serverは、バックグラウンドで常時稼働しているTimesTenデーモンの子プロセスです。TimesTen Serverオプションを変更するには、次の手順を実行する必要があります。

1. TimesTen Serverを停止します。

2. 次の項の説明に従って、ttendaemon.optionsファイル内のオプションを変更します。

3. TimesTen Serverを再起動します。

TimesTen Serverの制御

ttendaemon.optionsファイルの個別の行に指定する-server portnoエントリは、TimesTen Serverを起動するようにTimesTenデーモンに指示するとともに、使用するポートも指示します。portnoは、サーバーでリスニングされるポート番号です。

TimesTen Serverがインストールされている場合は、次の方法でTimesTen Serverを有効または無効にできます。

- TimesTen Serverを有効にするには、-server portnoエントリの前のコメント記号#を削除します。

- TimesTen Serverを無効にするには、-server portnoエントリの前にコメント記号#を追加します。

TimesTen Serverプロセスの事前生成

各TimesTen Client接続に、1つのサーバー・プロセスが必要です。デフォルトでは、クライアントが接続をリクエストするとサーバー・プロセスが生成されます。

予約サーバー・プロセスのプールを事前に生成して、クライアント接続ですぐに使用することができます。これによって、クライアント/サーバー接続のパフォーマンスが向上します。

ttendaemon.optionsファイルの個別の行に指定する-serverpool numberエントリは、TimesTen Serverでnumber個のプロセスを作成するようにサーバー・システムに指示します。このオプションを指定しない場合、プロセスは事前に生成されず、予約プールに保存されます。

新しい接続のリクエスト時に、サーバー・プールにプロセスが存在しない場合は、オペレーティング・システムの制限に達していないかぎり、新しいプロセスが起動されます。

オペレーティング・システムで処理可能な数を超えるプロセスをリクエストすると、警告が戻されます。リクエストしたプロセスの数に関係なく、予約プールにプロセスが残っていなくても、システムで使用可能なプロセスが存在しない場合にクライアントが接続をリクエストしないかぎり、エラーは発生しません。

TimesTen Serverに対する変更は、TimesTen Serverが再起動されると有効になります。

TimesTen Serverに対する複数の接続の指定

デフォルトでは、TimesTenは、1つのサーバーへの接続は1つの子プロセスにつき1つのみ作成されます。『Oracle TimesTen In-Memory Databaseリファレンス』のサーバー接続属性に関する説明に記載されているサーバー接続属性を使用するか、この項で説明するTimesTenデーモン・オプションを設定することで、1つのTimesTen Serverに複数の接続を設定できます。これらのオプションでは、TimesTen Serverへの接続数、各DSNに対するサーバー数およびサーバーへのそれぞれの接続のサイズを設定できます。

TimesTen Serverを再起動するまで、TimesTen Serverの設定変更は有効になりません。サーバーを再起動するには、次のコマンドを使用します。

ttDaemonAdmin -restartserver

注意:
サーバー接続属性とこれらのデーモン・オプションの両方を設定した場合は、サーバー接続属性の値が優先されます。

子サーバー・プロセス当たりのクライアント接続の最大数の構成

1つのサーバー・プロセスでデータベースへの複数のクライアント接続に対応できるようにマルチスレッド・モードで子サーバー・プロセスを実行するには、次の行をttendaemon.optionsファイルに追加します。

-maxConnsPerServer NumberOfClientConnections

注意:
サーバーをマルチスレッド・モードで実行している場合にサーバー・プロセスが失敗すると、そのプロセスが処理するすべてのクライアント接続が終了します。サーバーをマルチスレッド・モードで構成する場合はこの点を考慮して、信頼性と可用性の要件に対してマルチスレッド・モードでのより効果的なリソース使用率のバランスを保つようなmaxConnsPerServer属性の値を選択してください。

NumberOfClientConnectionsには1から2047の値を指定できます。デフォルトの値は1で、これは子サーバー・プロセスがマルチプロセス・モードで実行され、したがって1つのクライアント接続にしかサービスを提供できないことを意味します。

サーバーDSNに生成された子サーバー・プロセス間に接続を分散する方法の構成

ラウンドロビン接続分散を使用する特定のサーバーDSN (-maxConnsPerServer >1の場合)に対して子サーバー・プロセスの数を指定するには、次の行をttendaemon.optionsファイルに追加します。

-serversPerDSN NumberOfChildServerProcesses

NumberOfChildServerProcessesには1から2047の値を指定できます。デフォルト値は1です。

デフォルトでは(value=1)、サーバーDSNへの最初のmaxConnsPerServerクライアント接続は1つの子サーバー・プロセスに割り当てられ、次のmaxConnsPerServer接続は2つ目の子サーバー・プロセスに割り当てられるといったようになります。

-serversPerDSNがN (N > 1)に設定された場合、サーバーDSNへの最初のN * maxConnsPerServerクライアント接続は、N個の子サーバー・プロセスにラウンドロビン方式で分散されます。N * maxConnsPerServerを超える追加のクライアント接続が同じサーバーDSNに対して開かれている場合、それらの接続は-serversPerDSN=1の場合のように新しい子サーバー・プロセスに順次割り当てられます。

子サーバー・プロセスのスレッド・スタック・サイズの構成

通常、ServerStackSize属性を設定する必要はありません。ただし、ttcserverプロセスでアクセス違反(Windows)またはコア・ダンプ(Unix)が繰返し発生する場合は、ServerStackSize属性を増やすことを考慮する必要があります。

クライアント接続ごとに子サーバー・プロセスのスレッド・スタック・サイズを設定するには、次の行をttendaemon.optionsファイルに追加します。

-ServerStackSize ThreadStackSize

ThreadStackSizeはKB単位で指定します。デフォルトは、32ビットのシステムでは128KB、64ビットのシステムでは256KBです。子サーバー・プロセス当たりのクライアント接続の最大数が1の場合、子サーバー・プロセスのメイン・スレッドは1つのクライアント接続にのみ対応するため、ServerStackSize属性は無視されます。SQLの複雑な問合せをクライアント接続で実行している場合は、ServerStackSize属性を1024KBに設定することを検討してください。

注意:
TimesTen Serverへのこれらの変更は、TimesTenデーモンを再起動するまでは有効になりません。

クライアント/サーバーIPCでの共有メモリーの使用方法

デフォルトでは、TimesTenは、TimesTen ClientドライバにリンクされたアプリケーションとTimesTen Server間でTCP/IP通信を使用します。

クライアント・アプリケーションがTimesTen Serverと同じシステム上にある場合は、プロセス間通信(IPC)に共有メモリーを使用することもできます。

これは、パフォーマンスの向上、または32ビットのクライアント・アプリケーションとサーバー上の64ビットのデータベースの通信を可能にする点で有効な場合があります。共有メモリーをIPCとして使用する前に、システムが正しく構成されていることを検証します。『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』のインストールの前提条件に関する説明を参照してください。

ttendaemon.optionsファイルの個別の行に指定する-serverShmIpcエントリは、IPCの共有メモリー・セグメントを使用するクライアント接続を受け入れるようにTimesTen Serverに指示します。

このエントリがない場合は、この行をttendaemon.optionsファイルに追加します。TimesTenデーモンを再起動すると、共有メモリーのIPC機能付きでTimesTen Serverが起動されます。

このエントリがある場合は、ttendaemon.optionsファイルの行の前に#記号を追加してコメント・アウトします。これで、TimesTenデーモンの起動時に、TimesTen Serverが共有メモリーのIPC機能付きで起動されなくなります。

注意:
TimesTenでは、共有メモリーのIPC対応サーバーの最大16の異なるインスタンスがサポートされています。アプリケーションで16を超えて異なる共有メモリー・セグメントに接続しようとすると、ODBCエラーが戻されます。

共有メモリー・セグメントのサイズの管理

ttendaemon.optionsファイルの個別の行に指定する-serverShmSize sizeエントリは、指定したサイズ(MB)の共有メモリー・セグメントを作成するようにTimesTen Serverに指示します。

このエントリがない場合、TimesTen Serverは64MBの共有メモリー・セグメントを作成します。

共有メモリー・セグメントの適切な値は、次の要因によって異なります。

- TimesTen Serverのインスタンスに属するすべてデータベースへの同時クライアント/サーバー接続の推定数。

- このような接続ごとに同時に割り当てられる文の数。

- 問合せに対して送信されるデータの量。

共有メモリー・セグメントのサイズを決定するためのガイドラインには、次の内容が含まれます。

- 許可される最大サイズは1GBです。

- TimesTenには、内部的に使用する1MBのメモリーが必要です。

- 接続ごとに、16KBの固定ブロックが必要です。

- 各文は、IPC用の16KBのブロックで始まります。ただし、このサイズは、問合せに対して送信されるデータのサイズに応じて増減されます。文のバッファ・サイズは、TimesTenによって2倍に増加されたり、半分に減少されます。

たとえば、ユーザー・アプリケーションで最大100の同時共有メモリー対応のクライアント/サーバー接続が想定される場合、および各接続に最大50の文があると想定され、最大の問合せによって128KBのデータが戻される場合は、次の計算式を使用してserverShmSizeを設定します。

serverShmSize = 1 MB + (100 * 16) KB + (100 * 50 * 128) KB
= 1 MB + 2 MB + 625 MB = 628 MB

これは、この例に必要な最大のメモリーです。100すべての接続のそれぞれに50文が含まれ、それらの各文に、結果行に128KBのデータを戻す問合せが含まれている場合にのみ、メモリー・セグメント全体が使用されます。

この例で、serverShmSizeを128MBに設定した場合、新しい共有メモリー対応クライアント/サーバー接続がTimesTen Serverによって拒否されるか、または共有メモリー・セグメント内のリソース不足が原因で問合せに失敗する場合があります。

共有メモリー・セグメントのサイズの変更

設定した共有メモリー・セグメントの値を変更するには、TimesTen Serverを停止する必要があります。サーバーを停止すると、TimesTen Serverのインスタンスに関連付けられているすべてのデータベースへの既存のクライアント/サーバー接続が切断されます。-serverShmSizeオプションの値を変更するには、次の手順を実行します。

1. ttendaemon.optionsファイルの-serverShmSizeの値を変更します。

2. ttDaemonAdminユーティリティを使用して、TimesTen Serverを再起動します。TimesTen Serverを再起動できるのは、インスタンス管理者のみです。

TimesTen Serverログ・メッセージの制御

ttendaemon.optionsファイルの個別の行に指定する-noserverlogエントリは、クライアント・アプリケーションとの間の接続および切断のロギングを無効にするようにTimesTenデーモンに指示します。

TimesTen Serverがインストールされている場合は、次の方法で接続および切断に関するメッセージのロギングを有効または無効にできます。

- ロギングを有効にするには、-noserverlogエントリの前にコメント記号#を追加します。

- ロギングを無効にするには、-noserverlogエントリの前のコメント記号#を削除します。

4 アクセス制御の管理

TimesTenアクセス制御では、各ユーザーの認証およびデータベース内のすべてのオブジェクトの認可が行われます。認証は、正しいユーザー・パスワードによって行われます。データベース内のすべてのオブジェクトの認可は、特定のユーザーに適切な権限を付与することで管理します。

次の項では、TimesTenの認証および認可について説明します。

- ユーザー管理による認証の制御

- 権限によるオブジェクトへの認可の付与

ユーザー管理による認証の制御

ユーザーがデータベース内のデータにアクセスしたり操作できるようにするには、ユーザーを作成し、適切なパスワードを付与する必要があります。ユーザーを作成する際には、データベースに接続するための適切な権限またはデータベース内のオブジェクトにアクセスするための適切な権限を付与する必要もあります。権限の付与の詳細は、「権限によるオブジェクトへの認可の付与」を参照してください。

次の項では、ユーザーの作成および管理方法について説明します。

- ユーザーの概要

- ユーザーの作成およびデータベースでのユーザーの識別

- 内部ユーザーのパスワードの変更

- データベースからのユーザーの破棄

ユーザーの概要

TimesTenデータベースのユーザーには、次の3つのタイプがあります。

- インスタンス管理者: インスタンス管理者は、TimesTenインスタンスをインストールしたユーザーです。このユーザーには、そのTimesTenインスタンス内のすべてに対する完全な権限があります。このユーザーの作成の詳細は、『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』のTimesTen のインストールに関する説明を参照してください。

注意:
TimesTenのインストール時には、インスタンス管理者のみでなく、4つのシステム・ユーザーが作成されます。TimesTenによって内部的に使用されるこれらのシステム・ユーザーは、内部的に使用するSYSTEM、システム・オブジェクト用のSYS、キャッシュ・グリッド・オブジェクト用のGRIDおよびレプリケーション・オブジェクト用のTTREPです。

- 内部ユーザー: 内部ユーザーは、TimesTenデータベース内で使用するためにTimesTen内に作成されます。内部ユーザーの認証には、このユーザーが定義されている特定のデータベース用のパスワードが使用されます。
TimesTenユーザー名はTT_CHAR型であり、大文字と小文字が区別され、30文字に制限されています。ユーザーのネーミング規則の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の「名前、ネームスペースおよびパラメータ」に関する説明を参照してください。

内部ユーザーはCREATE USER文を使用して作成でき、この文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE USERに関する説明を参照してください。

- 外部ユーザー: 外部ユーザーはオペレーティング・システム内に作成されます。外部ユーザーは、オペレーティング・システムへのログイン時に認証されていることが前提であるため、データベースにパスワードは格納されていません。TimesTenデータベースがインストールされているホストとは異なるホストから外部ユーザーとして接続することはできません。同じホストの場合、クライアントは、クライアントのオペレーティング・システム資格証明を使用して、特定の外部ユーザーとして接続できます。たとえば、外部ユーザーがUNIXシステムにログインした場合は、外部ユーザーはパスワードをログイン時にすでに提供しているため、適切な権限が付与されている場合は、TimesTenデータベースにパスワード指定なしで接続できます。外部ユーザーは、TimesTenユーザー・グループにも属し、そのグループに適切な権限が付与されていることも必要です(『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』のTimesTenインスタンス管理者およびTimesTenユーザー・グループに関する説明を参照してください)。
あるホスト上で定義されている外部ユーザーは、リモート・ホスト上のTimesTenデータソースに接続できません。外部ユーザーは、ローカル・オペレーティング・システムによって認証されるため、ローカルTimesTenデータソースへの接続にのみ使用できます。クライアント/サーバー接続を介して接続する場合、外部ユーザーはクライアントおよびサーバーと同じホスト上に定義する必要があります。したがって、外部ユーザーを使用する場合は、オペレーティング・システムでそのユーザーの認証が行われるため、クライアントとサーバーの両方が同一のホスト上に存在する必要があります。

外部ユーザーの作成はオペレーティング・システム内で行われますが、CREATE USER文のIDENTIFIED EXTERNALLY句を使用して、データベースでそのユーザーが外部ユーザーとして識別されるようにする必要があります。このSQL文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE USERに関する説明を参照してください。

UNIX外部ユーザー名では、大文字と小文字が区別されます。Windows外部ユーザー名では、大文字と小文字は区別されません。UNIXプラットフォームから接続する場合、TimesTenによって自動的に外部ユーザー名が大文字に変換され、大文字と小文字が区別されずに表示されます。

TimesTenへのログインにクリアテキストのパスワードを使用しない場合は、PWDCrypt属性を使用してパスワードのハッシュを作成します。この属性を使用するかどうかの唯一の判断材料は、そのパスワードがOracle Databaseなどの他のエンティティへのログインに使用されるかどうかです。PWDCryptバージョンのパスワードはTimesTenへの接続に常に使用可能ですが、Oracle Databaseに接続するために元のパスワードに復元することはできません。

注意:
インスタンス管理者およびすべての外部ユーザーは両方とも、インストール時に指定されたTimesTenユーザー・グループに属している必要があります。詳細は、『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』のTimesTenのインストール関する説明を参照してください。

ユーザーの作成およびデータベースでのユーザーの識別

内部ユーザーを作成したり、CREATE USER文を使用して外部ユーザーを識別できるのは、インスタンス管理者またはADMIN権限を持つユーザーのみです。セキュリティ上の理由から、CREATE USER文またはALTER USER 文で内部ユーザーを作成または変更するには、TimesTenデータベースへの直接接続のみを使用できます。したがって、CREATE USERまたはALTER USERをクライアント/サーバー・アプリケーションから実行したり、パススルー実行によって実行することはできません。ALTER USER文を使用して、内部ユーザーを外部ユーザーに変更したり、外部ユーザーを内部ユーザーに変更できます。CREATE USER文の構文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の「SQL文」の章を参照してください。

注意:
ADMIN権限を持つユーザーの詳細は、「管理者権限の付与」を参照してください。

内部ユーザーを作成するには、CREATE USER文でユーザー名とパスワードを指定します。次の例では、内部ユーザーTERRYにパスワードsecretを指定します。

CREATE USER TERRY IDENTIFIED BY "secret";
User created.

外部ユーザーを識別するには、CREATE USER IDENTIFIED EXTERNALLY文でユーザー名を指定します。次の例では、外部ユーザーPATをTimesTenデータベースで識別できるようにします。

CREATE USER PAT IDENTIFIED EXTERNALLY;
User created.

外部ユーザーPATを内部ユーザーに変更するには、次のALTER USER文を実行します。

ALTER USER PAT IDENTIFIED BY "secret";

内部ユーザーPATを外部ユーザーに変更するには、次のALTER USER文を実行します。

ALTER USER PAT IDENTIFIED EXTERNALLY;

次のシステム・ビューでSELECT文を実行すると、作成したユーザーを確認できます。

- SYS.ALL_USERSでは、現在のユーザーに目視確認できるデータベースのすべてのユーザーが表示されます。

- SYS.USER_USERSでは、データベースの現在のユーザーが示されます。

- SYS.DBA_USERSでは、データベースのすべてのユーザーが示されます。このビューでSELECT文を実行するには、適切な権限が付与されている必要があります。

たとえば、現在のユーザーを表示するには、次の文を実行します。

SELECT * FROM sys.user_users;
< PAT, 4, OPEN, <NULL>, <NULL>, USERS, TEMP, 2009-02-25 12:00:17.027100, <NULL>,
<NULL> >
1 row found.

これらのビューの詳細は、『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』のシステム表に関する説明を参照してください。

内部ユーザーのパスワードの変更

内部ユーザーのパスワードのみが、データベース内で変更可能です。ユーザーは、自分のパスワードを変更できます。ADMIN権限を持つユーザーは、すべてのユーザーのパスワードを変更できます。このようなユーザーは、ALTER USER文のIDENTIFIED BY句を使用してパスワードを変更できます。

たとえば、内部ユーザーTERRYのパスワードを現在の設定から12345に変更するには、次の文を実行します。

ALTER USER TERRY IDENTIFIED BY "12345";
User altered.

データベースからのユーザーの破棄

適切な権限が付与されていれば、データベースで作成されたユーザーをDROP USER文を使用して破棄できます。次のようなユーザーは破棄できません。

- インスタンス管理者は削除できません。

- ユーザーが所有するすべてのオブジェクトを削除してからでないと、そのユーザーを削除することはできません。

- 現在データベースに接続しているユーザーを削除することはできません。

次のDROP USER文によって、データベースからユーザーTERRYが破棄されます。

Command> drop user terry;
User dropped.

インスタンス管理者を破棄しようとすると、次のエラーが表示されます。

Command> drop user instadmin;
15103: System-defined users and roles cannot be dropped
The command failed.

必要なADMIN権限を持たないユーザーPatが、ユーザーTerryを破棄しようとすると、次のエラーが表示されます。

Command> drop user terry;
15100: User PAT lacks privilege ADMIN
The command failed.

注意:
現時点では、DROP USER CASCADEはサポートされていません。

権限によるオブジェクトへの認可の付与

複数のユーザーがデータベース・オブジェクトにアクセス可能な場合、これらのオブジェクトへの認可は権限を使用して制御できます。オブジェクトには必ず所有者が存在します。あるユーザーが他のユーザーによって所有されているオブジェクトを変更できるかどうかは、権限によって制御されます。権限の付与または取消しを実行できるのはインスタンス管理者、ADMIN権限を持つユーザー、または特定のオブジェクトに対する権限の場合は、そのオブジェクトの所有者です。

次の項では、権限の使用によるオブジェクトへの認可について説明します。

- 権限の概要

- システム権限の付与または取消し

- オブジェクト権限の付与または取消し

- 単一のSQL文による複数の権限の付与または取消し

- キャッシュ・グループの権限の付与または取消し

- ユーザー権限の表示

- ユーティリティ、組込みプロシージャおよび初期接続属性に必要な権限

- 親子表の権限チェック・ルール

権限の概要

TimesTenでは、データベース内のオブジェクトへの認可を、権限によってユーザーに付与します。ユーザーには、データベースのリソースやオブジェクトにアクセスするための権限が付与されている必要があります。これらの権限によって、各オブジェクトに対してユーザーが実行できる処理が制限されます。ユーザーは自分のスキーマに含まれるすべてのオブジェクトに対する権限をすべて持っており、これらを取り消すことはできません。他のユーザーのスキーマに含まれるオブジェクトの権限をユーザーに付与できます。

TimesTenでは、SQL文の実行時に各ユーザーの権限が評価されます。各SQL文は、任意のユーザーが実行できます。次に例を示します。

SELECT * from PAT.TABLE1;

この文をPatが実行する場合、Patはこのオブジェクトの所有者であるため、他に必要な権限はありません。一方、Terryなどの他のユーザーがこの文を実行する場合、TerryにはPAT.TABLE1に対するSELECT権限が必要です。

権限を使用すると次のことが可能になります。

- ユーザー、アプリケーションまたは関数がアクセスできるデータまたはそれらが実行できる処理を定義できます。

- ユーザーがシステム・パフォーマンスを低下させたり、システム・リソースを大量に消費することを防ぎます。たとえば、認可上の懸念からではなく、DMLパフォーマンスを低下させたり、ディスク領域を占有する可能性があるという理由から、索引作成を制限する権限を指定できます。

権限の一部の例には、次の処理を実行する権限が含まれます。

- データベースへの接続およびセッションの作成

- 表の作成

- 他のユーザーが所有する表からの行の選択

- キャッシュ・グループ処理の実行

また、次の処理を実行するには、ユーザーに特定の権限が必要になる場合があります。

- TimesTen組込みプロシージャの呼出し。

- TimesTenコマンドライン・ユーティリティの実行。

- 初期接続属性を使用した接続の開始。

- SQL文の実行。

組込みプロシージャ、ユーティリティおよび接続属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』を参照してください。SQL文については、『Oracle TimesTen In-Memory Database SQLリファレンス』を参照してください。

権限には、次の2つのレベルがあります。

- システム権限: この権限があると、すべてのオブジェクトへのアクセスなど、システム全体の機能を有効にできます。システム権限を付与されたユーザーは、標準的な管理者タスクを実行したり、他のユーザーのスキーマ内のオブジェクトにアクセスできます。この権限の適用範囲は、1つのオブジェクトに留まりません。この権限の付与は、信頼できるユーザーに制限してください。

- オブジェクト権限: オブジェクトには、タイプに応じて関連付けられている権限があります。

このような権限のサブセットは、作成時に、PUBLICロールを介して各ユーザーに自動的に付与されます。権限階層のルールは、ユーザーに付与されているすべての権限に適用されます。

権限は、ユーザーがその業務に必要なタスクを完了できるように付与します。どのユーザーに権限を付与するかを計画し、必要な処理を実行するために必要な権限のみを付与してください。

権限のチェックは、準備時と各SQL文の初回実行時に行われます。それ以降にその文を実行したときにさらに権限のチェックが必要になるのは、データベースで取消し処理が行われる場合のみです。

システム権限

ユーザーはシステム権限により、データベース内の複数のオブジェクトに対してシステムレベルの操作を実行できます。データベースで特定の処理を実行する権限または特定のタイプのオブジェクトに対する処理を実行する権限が付与されます。たとえば、データベースの他のユーザーのスキーマのオブジェクトを作成または変更できるようにするには、そのユーザーにシステム権限が付与されている必要があります。

ユーザーにシステム権限を付与できるのは、インスタンス管理者またはADMIN権限を持つユーザーのみです。インスタンス管理者は常にすべてのシステム権限とオブジェクト権限を持っており、これらの権限は取り消すことができません。

注意:
インスタンス管理者は、すべての処理を実行できます。そのため、インスタンス管理者は、ADMIN権限を持つユーザーが実行できるすべての処理を実行できます。

システム権限には、ADMIN、SELECT ANY TABLE、CREATE SESSION、CREATE ANY SEQUENCEなどがあります。システム権限の付与と取消しの詳細は、「システム権限の付与または取消し」を参照してください。

オブジェクト権限

オブジェクト権限を持つユーザーは、定義されている処理を特定のオブジェクトに対して実行できます。オブジェクト・タイプごとに個別のオブジェクト権限を使用できます。

すべてのオブジェクト所有者は、自身のオブジェクトにアクセスでき、自身のオブジェクトに対するすべての権限を持ちます。他のユーザーが所有するオブジェクトには、そのオブジェクトの所有者またはADMIN権限を持つユーザーから明示的にアクセス権を付与されないかぎり、アクセスできません。PUBLICロールに特定のオブジェクトへのアクセス権が付与されている場合、すべてのデータベース・ユーザーがそのオブジェクトにアクセスできます。ADMIN権限を持つユーザーであっても、所有者がそのオブジェクトに対して持つ所有者権限を取り消すことはできません。

注意:
キャッシュ・グループ・オブジェクトやレプリケーション・オブジェクトなどの一部のオブジェクトでは、ユーザーにシステム・レベルの権限があって初めて特定の処理を実行できます。

オブジェクトへのアクセスを制御するには、ユーザーがオブジェクトの所有者であるか、またはオブジェクトに対する処理を実行するための適切なオブジェクト権限をユーザーが持っていることが必要です。オブジェクト権限の付与または取消しを実行できるのは、インスタンス管理者、ADMIN権限を持つユーザー、または該当するオブジェクトの所有者です。

オブジェクト権限の付与と取消しの詳細は、「オブジェクト権限の付与または取消し」を参照してください。

PUBLICロール

各TimesTenデータベースに、PUBLICという名前のロールが自動的に作成されます。このロールには、デフォルトで、特定の権限が付与されます。TimesTenデータベースで作成された各ユーザーには、PUBLICロールに付与されている各権限が付与されます。つまり、インスタンス管理者またはADMIN権限を持つユーザーがユーザーを作成した場合、PUBLICロールに関連付けられている権限が各ユーザーに付与されます。PUBLICロールに後で付与された権限は、同時にすべてのユーザーに自動的に付与されます。ADMIN権限を持つユーザーは、PUBLICロールに対する権限の付与または取消しによって、すべてのユーザーのデフォルト権限を追加または削除できます。ユーザーがPUBLICからある権限を取り消すと、その権限を明示的に付与されたユーザーを除いて、各ユーザーからその権限が取り消されます。

注意:
この動作の唯一の例外は、SYSユーザーによってPUBLICに付与された権限は取り消せないことです。データベース作成の一環として付与された権限は、次のSQL文を実行して確認できます。

SELECT * FROM DBA_TAB_PRIVS WHERE GRANTOR = 'SYS'

次の例では、ユーザーPatにSELECT ANY TABLE権限が、PUBLICにSELECT ANY TABLE権限がそれぞれ付与されます。次に、SYS.DBA_SYS_PRIVSビューのすべてのシステム権限が表示されます。このビューの詳細は、「ユーザー権限の表示」を参照してください。PUBLICからSELECT ANY TABLEを取り消しても、PatからはSELECT ANY TABLEは削除されず、SYS.DBA_SYS_PRIVSビューによって再度表示されます。

Command> GRANT SELECT ANY TABLE TO PAT;
Command> GRANT SELECT ANY TABLE TO PUBLIC;
Command> SELECT * FROM SYS.DBA_SYS_PRIVS;
< SYS, ADMIN, NO >
< PUBLIC, SELECT ANY TABLE, NO >
< SYSTEM, ADMIN, NO >
< PAT, ADMIN, NO >
< PAT, SELECT ANY TABLE, NO >
5 rows found.
Command> REVOKE SELECT ANY TABLE FROM PUBLIC;
Command> select * from sys.dba_sys_privs;
< SYS, ADMIN, NO >
< SYSTEM, ADMIN, NO >
< PAT, ADMIN, NO >
< PAT, SELECT ANY TABLE, NO >
4 rows found.

必要な場合は、PUBLICにADMIN権限を付与するようなデータベースを作成することがあります。この場合、すべてのユーザーにADMIN権限が付与されるため、ユーザーはすべてのデータベース・オブジェクトに制限なくアクセスでき、インスタンス管理者が実施する必要があるタスクを除くすべての管理タスクを実行できます。このような状況ではデータベースのセキュリティを確保できないため、長期的に使用する方法としては推奨されません。この方法をいつどのような目的で採用するかの詳細は、『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』の「TimesTenのアップグレード」に関する説明を参照してください。

注意:
PUBLICロールにデフォルトで割り当てられる権限の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のPUBLICロールに関する説明を参照してください。

PUBLICロールでは、特定のオブジェクト、システム表およびビューへのアクセスも付与されます。デフォルトでは、新しく作成されたTimesTenデータベースでは、PUBLICに、各種システム表およびビューと、PL/SQL関数、プロシージャおよびパッケージに対するSELECT権限とEXECUTE権限があります。PUBLIC、および後でユーザーに付与された権限のリストは、SYS.DBA_TAB_PRIVSビューに問い合せることで表示できます。次の問合せでは、PUBLICに付与されている権限が5列目に表示されます。

Command> DESC SYS.DBA_TAB_PRIVS;
View SYS.DBA_TAB_PRIVS:
Columns:
GRANTEE                         VARCHAR2 (30) INLINE
OWNER                           VARCHAR2 (30) INLINE
TABLE_NAME                      VARCHAR2 (30) INLINE
GRANTOR                         VARCHAR2 (30) INLINE
PRIVILEGE                       VARCHAR2 (40) INLINE NOT NULL
GRANTABLE                       VARCHAR2 (3) INLINE NOT NULL
HIERARCHY                       VARCHAR2 (3) INLINE NOT NULL
1 view found.

Command> SELECT * FROM SYS.DBA_TAB_PRIVS WHERE GRANTEE='PUBLIC';
< PUBLIC, SYS, TABLES, SYS, SELECT, NO, NO >
< PUBLIC, SYS, COLUMNS, SYS, SELECT, NO, NO >
< PUBLIC, SYS, INDEXES, SYS, SELECT, NO, NO >
< PUBLIC, SYS, USER_COL_PRIVS, SYS, SELECT, NO, NO >
< PUBLIC, SYS, PUBLIC_DEPENDENCY, SYS, SELECT, NO, NO >
< PUBLIC, SYS, USER_OBJECT_SIZE, SYS, SELECT, NO, NO >
< PUBLIC, SYS, STANDARD, SYS, EXECUTE, NO, NO >
< PUBLIC, SYS, UTL_IDENT, SYS, EXECUTE, NO, NO >
< PUBLIC, SYS, TT_DB_VERSION, SYS, EXECUTE, NO, NO >
< PUBLIC, SYS, PLITBLM, SYS, EXECUTE, NO, NO >
< PUBLIC, SYS, DBMS_OUTPUT, SYS, EXECUTE, NO, NO >
< PUBLIC, SYS, DBMS_SQL, SYS, EXECUTE, NO, NO >
< PUBLIC, SYS, DBMS_STANDARD, SYS, EXECUTE, NO, NO >
< PUBLIC, SYS, DBMS_PREPROCESSOR, SYS, EXECUTE, NO, NO >
< PUBLIC, SYS, UTL_RAW, SYS, EXECUTE, NO, NO >
< PUBLIC, SYS, DBMS_UTILITY, SYS, EXECUTE, NO, NO >
< PUBLIC, SYS, DBMS_RANDOM, SYS, EXECUTE, NO, NO >
...
57 rows found.

権限階層のルール

すべての権限が1つの階層となっています。上位レベルの権限では、関連する下位レベルの権限が付与されます。たとえば、ADMIN権限では、すべての権限が付与されます。SELECT ANY TABLE権限では、任意の表に対するSELECT権限が付与されます。

ある処理を行うための権限をユーザーが必要な場合は、常に、そのユーザーが対象オブジェクトの所有者であるかどうか、または処理に必要な権限を付与する上位レベルの権限を持っているかどうかを確認して、そのユーザーが必要な権限を持っているかどうかを判断できます。たとえば、ユーザーPatがTerry.Table2に対するSELECT権限を必要としている場合、次の事項を確認します。

- Patがそのオブジェクトの所有者かどうか。所有者の場合は、自分のオブジェクトに対するすべてのオブジェクト権限があります。

- PatにSELECT ANY TABLE権限が付与されているかどうか。この権限がある場合、Patは任意の表、ビューおよびマテリアライズド・ビューに対してSELECT ONを実行できます。

- PatにADMIN権限が付与されているかどうか。付与されている場合、Patは有効なSQL操作であればすべて実行できます。

上位レベルに含まれる権限を付与しても、エラーは発生しません。一方、権限を取り消す場合は、付与したときと同じ単位で取り消す必要があります。次に示す、ユーザーPATに対する付与文および取消し文では、任意の表を更新できる権限と特定の表を更新できる権限が付与されます。

GRANT UPDATE ANY TABLE TO PAT;
GRANT UPDATE ON HR.employees TO PAT;
REVOKE UPDATE ON HR.employees FROM PAT;

UPDATE ANY TABLE権限では、データベースに含まれる任意の表を更新する権限が付与されます。2番目の文は、HR.employees表に対するUPDATE権限が明示的に付与されます。UPDATE ANY TABLEによってemployeesを含むすべての表へのアクセス権限が付与されるため、この2番目の文は不要ですが、エラーにはなりません。2番目の付与を取り消すことは可能ですが、最初に実行されたUPDATE ANY TABLEシステム権限の付与には影響しません。そのため、PATは引き続きHR.employees表を更新できます。

取消しは、付与したときと同じ単位で行う必要があります。次の例では、UPDATE ANY TABLEシステム権限をPATに付与します。あるユーザーが、自分のHR.employees表の更新権限を取り消そうとします。UPDATE ANY TABLE権限はシステム権限ですが、UPDATE権限はオブジェクト権限です。付与されていない単位に対するREVOKE文の実行は失敗し、エラーになります。

GRANT UPDATE ANY TABLE TO PAT;
REVOKE UPDATE ON HR.employees FROM PAT;
15143: REVOKE failed: User PAT does not have object privilege UPDATE on HR.EMPLOYEES
The command failed.

権限階層の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の 権限階層に関する項を参照してください。

システム権限の付与または取消し

システム権限を付与するか取り消すには、GRANT文またはREVOKE文を使用します。システム権限を付与するか取り消すことができるのは、インスタンス管理者またはADMIN権限を持つユーザーのみです。システム権限のGRANTまたはREVOKE構文には、システム権限とその権限が付与されるユーザーが含まれます。GRANT文およびREVOKE文の構文と、各SQL文を実行するために必要な権限の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の「SQL文」の章を参照してください。

注意:
オブジェクト権限の付与および取消し方法の詳細は、「オブジェクト権限の付与または取消し」を参照してください。

最も強力なシステム権限はADMINです。ユーザーにADMIN権限を付与すると、このユーザーは、任意のデータベース・オブジェクトに対してすべての処理を実行できるようになります。

各ユーザーは自分のシステム権限をSYS.USER_SYS_PRIVSシステム・ビューで確認できます。ADMIN権限を持つユーザーは、すべてのユーザーのすべてのシステム権限をSYS.DBA_SYS_PRIVSシステム表で確認できます。システム・ビューの詳細は、「ユーザー権限の表示」を参照してください。

次の項では、TimesTenで使用できるシステム権限の一部について説明します。

- 管理者権限の付与

- ALL PRIVILEGESの付与

- データベースに接続するための権限の付与

- 追加のシステム権限の付与

- 任意のデータベース・オブジェクト・タイプに対するユーザーによる処理の許可

- キャッシュ・グループの権限の付与または取消し

注意:
システム権限の完全なリストは、『Oracle TimesTen In-Memory Database SQLリファレンス』の権限に関する説明を参照してください。

管理者権限の付与

ADMIN権限にはシステム権限とオブジェクト権限がすべて含まれており、この権限が付与されたユーザーは、すべての管理タスクと有効なデータベース処理を実行できます。ADMIN権限を持つユーザーは、すべてのオブジェクトに対して、作成、変更、破棄、選択、更新、挿入または削除処理を実行できます。また、ADMIN権限を持つユーザーは、レプリケーション・タスク、チェックポイント処理、バックアップ、移行、ユーザーの作成と削除などを実行できます。すべての権限を付与するか取り消すことができるのは、ADMIN権限を持つユーザーのみです。

すべてのシステム表およびビューをデフォルトで表示できるのは、ADMIN権限を持つユーザーのみです。ADMIN権限を持つユーザーのみが、レプリケーション・スキーマまたはアクティブ・スタンバイ・ペアを作成、変更または破棄できます。次のビューおよびパッケージにアクセスできるのは、ADMIN権限を持つユーザーのみです。

- SYS.DBA_TAB_PRIVSビュー

- SYS.DBA_SYS_PRIVSビュー

- SYS.UTL_RECOMPパッケージ

注意:
システム表またはビューでユーザーの権限を確認する方法の詳細は、「ユーザー権限の表示」を参照してください。

ユーザーTERRYにADMIN権限を付与するには、次の文を実行します。

GRANT ADMIN TO TERRY;

ADMIN権限を持っているユーザーは、他のユーザーに権限を付与できます。たとえば、ADMIN権限を持つユーザーは、次の文を実行して、PATが所有するdepartments表に対するSELECT権限をTERRYに付与できます。

GRANT SELECT ON PAT.departments TO TERRY;

注意:
Patはdepartmentsの所有者であるため、PatもTerryにSELECTオブジェクト権限を付与できます。

ALL PRIVILEGESの付与

ALL PRIVILEGESでは、ユーザーにすべてのシステム権限が付与されます。ユーザーにほとんどのシステム権限を付与する場合は、ALL PRIVILEGESをユーザーに付与してから、付与しないシステム権限のみを取り消します。次の例では、すべてのシステム権限をユーザーPATに付与します。次に、ADMIN権限とDROP ANY TABLE権限を取り消して、Patが管理タスクのすべてと、表の削除を実行できないようにします。

GRANT ALL PRIVILEGES TO PAT;
REVOKE ADMIN, DROP ANY TABLE FROM PAT;

ユーザーに付与されたすべての権限についてREVOKE ALL PRIVILEGESを実行することもできます。次のユーザーPATの例のとおり、PUBLICロールから継承されたものを除いたシステム権限がすべて取り消されます。

REVOKE ALL PRIVILEGES FROM PAT;

データベースに接続するための権限の付与

TimesTenデータベースへのアクセスには、データソース名(DSN)を使用します。ユーザーが、権限のない接続属性(初期接続属性など)を持つDSNを使用しようとすると、エラーが表示されます。

初期接続属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の接続属性に関する説明を参照してください。

データベースに接続するには、すべてのユーザーに、ADMIN権限を持つユーザーからCREATE SESSIONシステム権限が付与されている必要があります。CREATE SESSIONシステム権限によって、データベースへの接続が認可されます。次の例では、CREATE SESSION権限をPATに付与します。

GRANT CREATE SESSION TO PAT;

ADMIN権限を持つユーザーは、PUBLICロールにこの権限を付与することによって、CREATE SESSION権限をすべてのユーザーに付与できます。これにより、すべてのユーザーがデータベースに接続できるようになります。

GRANT CREATE SESSION TO PUBLIC;

追加のシステム権限の付与

ADMIN権限の他にも、権限のスーパーセットを付与するシステム権限がいくつかあります。ここでは、そのような権限のいくつかを簡単に説明します。

- XLA: XLAリーダーは、システム全体に影響を与える可能性があります。追加のログ・ボリュームを作成しますが、そのブックマークを先に進めることができない場合にログが長期間保持されます。XLAリーダーとして接続するには、XLAシステム権限が必要です。

- CACHE_MANAGER: CACHE_MANAGER権限は、キャッシュ・グループ管理者処理のために使用されます。詳細は、「キャッシュ・グループの権限の付与または取消し」を参照してください。

任意のデータベース・オブジェクト・タイプに対するユーザーによる処理の許可

ユーザーに対する権限の付与または取消しを行う場合は、単一オブジェクトを対象として行うか、データベースに含まれる特定のタイプのオブジェクトすべてを対象にすることができます。

注意:
単一オブジェクトの権限の付与または取消しを行う場合は、オブジェクト権限を使用します。詳細は、「オブジェクト権限の付与または取消し」を参照してください。

ANYキーワードを含むシステム権限を持つユーザーは、データベースに含まれるタイプが同じすべてのオブジェクトに対して処理を実行できます。これらのシステム権限には、CREATE ANY object_type、DROP ANY object_type、ALTER ANY object_type、SELECT ANY object_type、UPDATE ANY TABLE、INSERT ANY TABLE、DELETE ANY TABLEおよびEXECUTE ANY PROCEDUREがあります。

注意:
これらの権限の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の権限に関する説明を参照してください。ANYキーワードを含むキャッシュ・グループ・システム権限の詳細は、「キャッシュ・グループの権限の付与または取消し」を参照してください。

次の各項では、CREATE ANY object_type、DROP ANY object_typeおよびALTER ANY object_typeの各システム権限について詳しく説明します。

- 表、索引、ビュー、マテリアライズド・ビュー、順序、PL/SQLプロシージャ、PL/SQL関数、PL/SQLパッケージまたはシノニムの作成

- 表、ビュー、マテリアライズド・ビュー、順序、プロシージャ、関数、パッケージまたはシノニムの削除

- 表、ビュー、マテリアライズド・ビュー、順序、プロシージャ、関数またはパッケージの変更

表、索引、ビュー、マテリアライズド・ビュー、順序、PL/SQLプロシージャ、PL/SQL関数、PL/SQLパッケージまたはシノニムの作成

表、ビュー、マテリアライズド・ビュー、順序、PL/SQLプロシージャ、PL/SQL関数、PL/SQLパッケージまたはシノニムをユーザーまたは他のユーザーのネームスペース内に作成するには、適切なCREATE object_typeシステム権限またはCREATE ANY object_typeシステム権限を持つ必要があります。

ここでは、CREATEシステム権限およびCREATE ANYシステム権限について説明します。

- CREATE object_type権限を付与されたユーザーは該当するオブジェクトを作成できますが、自分のスキーマ内にのみ作成できます。そのユーザーは作成したオブジェクトの所有者となり、自動的にそのオブジェクトに対するすべての権限が付与されます。
ユーザーがキャッシュ・グループを作成するには、他の権限が必要です。

- CREATE ANY object_type権限を付与されたユーザーは、他のユーザーのスキーマ内も含めて、該当するタイプの任意のオブジェクトをデータベースに作成できます。オブジェクト・タイプには、表、索引、ビュー、マテリアライズド・ビュー、順序、シノニムおよびプロシージャがあります。CREATE ANY object_type権限には、CREATE ANY TABLE、CREATE ANY INDEX、CREATE ANY VIEW、CREATE ANY MATERIALIZED VIEW、CREATE ANY SEQUENCE、CREATE ANY SYNONYMおよびCREATE ANY PROCEDUREがあります。

次の例では、他のユーザーのスキーマに任意の表を作成する権限をユーザーTERRYに付与します。

GRANT CREATE ANY TABLE TO TERRY;

次の例では、自分のスキーマに表を作成する権限を付与します。

GRANT CREATE TABLE TO TERRY;

表、ビュー、マテリアライズド・ビュー、順序、プロシージャ、関数、パッケージまたはシノニムの削除

DROP ANY object_typeシステム権限を付与すると、ユーザーは自分が所有しないobject_typeのオブジェクトを削除できます。たとえば、この権限をPatに付与すると、PatはユーザーHRが所有するemployees表を破棄できるようになります。ユーザーは自分の表を削除する権限を常に持っています。DROP ANY object_type権限では、ユーザーは、データベース内の指定した種類のどのオブジェクトも破棄できます(ただし、キャッシュ・グループを破棄するには他の権限が必要です)。

表、ビュー、マテリアライズド・ビュー、順序、プロシージャ、関数またはパッケージの変更

ALTER ANY PROCEDUREを持つユーザーは、データベースに含まれる任意のプロシージャ、関数またはパッケージを変更できます。ALTER ANY object_type権限は、自分が所有していないオブジェクトのプロパティを変更する場合に必要です。たとえば、プロシージャが、Proc1という名前のHRスキーマで作成され、PATにはALTER ANY PROCEDURE特権を付与されている場合、PATは、プロシージャHR.Proc1を正常に変更できます。

オブジェクト権限の付与または取消し

オブジェクト権限を付与するか取り消すには、GRANT文またはREVOKE文を使用します。オブジェクト・レベルのGRANT文またはREVOKE文の構文には、付与または取消しの対象となるオブジェクトの名前が必要です。GRANT文およびREVOKE文の構文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の「SQL文」の章を参照してください。

注意:

- 各SQL文には、特定の権限が必要となる可能性があります。必要な権限の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の「SQL文」の章で各文の説明を参照してください。

- オブジェクト権限の完全なリストは、『Oracle TimesTen In-Memory Database SQLリファレンス』の権限に関する説明を参照してください。

次の項では、キャッシュ管理オブジェクトを除くすべてのオブジェクト・タイプのオブジェクト権限について説明し、例を示します。キャッシュ・オブジェクト権限の詳細は、「キャッシュ・グループの権限の付与または取消し」を参照してください。

- すべてのオブジェクト権限の付与

- 表のオブジェクト権限

- ビューのオブジェクト権限

- 順序のオブジェクト権限

- マテリアライズド・ビューのオブジェクト権限

- REFERENCES句による外部キーの作成時に必要なオブジェクト権限

- PL/SQL関数、プロシージャおよびパッケージのオブジェクト権限

- シノニムのオブジェクト権限

すべてのオブジェクト権限の付与

ALLキーワードを使用すると、オブジェクトに対するすべての権限をユーザーに付与できます。実質的に、オブジェクトに対する任意の処理を実行する権限がユーザーに付与されます。

DROPまたはALTERに必要なオブジェクト権限は特にありません。これらの処理はオブジェクトごとに許可されるわけではなく、オブジェクトの所有者ではないユーザーに適切なシステム権限が付与されると、そのオブジェクトに対してDROPまたはALTERを実行できるようになります。

たとえば、GRANT ALL ON employees TO PATでは、employees表のすべての権限がユーザーPATに付与されます。すべてのオブジェクトに対する権限を付与した後、権限を個別に取り消すことができます。たとえば、次に有効な一連の処理を示します。

GRANT ALL ON HR.employees TO PAT;
REVOKE DELETE ON HR.employees FROM PAT;

ユーザーに付与されたオブジェクト権限についてREVOKE ALLを実行することもできます。これにより、次のユーザーPATの例で示すように、ユーザーがオブジェクトに対して持つすべての権限が取り消されます。

REVOKE ALL ON HR.employees FROM PAT;

GRANT ALL文とREVOKE ALL文は、オブジェクトの所有者とADMIN権限を持つユーザーの両方が実行できます。

表のオブジェクト権限

自分が所有していない表に対して処理を実行する場合、そのユーザーには、その表に関する適切なオブジェクト権限が付与されている必要があります。このような権限には、キャッシュ・グループに含まれる表に関する権限などがあります。表に関するオブジェクト権限には、SELECT、UPDATE、DELETE、INSERT、INDEXおよびREFERENCESがあります。

次のオブジェクト権限は、認可上の理由からのみでなく、パフォーマンス上の理由からも適切です。

- INDEX権限を持つユーザーは、表の索引を作成できます。索引の作成によって追加の領域が消費され、表に対するDMLのパフォーマンスが影響を受けます。INDEXは、索引を作成するユーザーに明示的に付与する必要があります。

- REFERENCES権限を持つユーザーは、表の外部キー依存性を作成できます。外部キー依存性は、親のDML操作のパフォーマンスに影響を与えます。REFERENCES権限の詳細は、「REFERENCES句による外部キーの作成時に必要なオブジェクト権限」を参照してください。

次の例では、HRスキーマ内のemployees表のSELECTオブジェクト権限をユーザーPATに付与します。

GRANT SELECT ON HR.employees TO PAT;

次の例では、ユーザーHRが所有するemployees表のUPDATEE権限をユーザーPATに付与します。

GRANT UPDATE ON HR.employees TO PAT;

ビューのオブジェクト権限

ユーザーがビューを作成するには、CREATE VIEWまたはCREATE ANY VIEW権限を付与する必要があります。ユーザーに所有しないビューのSELECTオブジェクト権限を付与すると、そのユーザーはそのビューから選択できるようになります。さらに、ビューの所有者にビューが参照しているすべてのオブジェクトに対するSELECTオブジェクト権限を付与し、ビュー自体を有効にする必要があります。

ユーザーPATが自分が所有者であるビューを作成し、そのビューの参照先が自分が所有するオブジェクトのみである場合、PatはCREATE VIEW権限があればこの処理を実行できます。PatがTerryが所有者であるビューを作成し、そのビューの参照先がTerryが所有するオブジェクトである場合、この処理を実行するためにPatが必要とする権限はCREATE ANY VIEW権限です。次に例を示します。

CREATE VIEW PAT.VIEW1 as select * from PAT.TABLE1;

この例の場合、PatにCREATE VIEW権限があればこの文を実行できます。

ユーザーPatがビューを作成し、そのビューでTerryが所有する表を参照する場合、PatにはCREATE VIEW権限と、そのビューが参照するすべてのオブジェクトに対するSELECTオブジェクト権限が必要となります。ビューの作成者にではなく、ビューの所有者に、ビューが参照するオブジェクトに対するSELECTオブジェクト権限が付与されている必要があります。そのため、この例では、Terryが所有するTABLE2に対するSELECTオブジェクト権限がPatに付与されている必要があります。これらの権限が付与されると、Patは次の文を実行できます。

CREATE VIEW PAT.VIEW2 as select * from TERRY.TABLE2;

ここで、3人目のユーザーJoeがこの文を実行する場合、Joeにはビューを作成するためにCREATE ANY VIEW権限が必要となります。この文を実行するのはJoeですが、この場合もビューの所有者であるPatに、Terryの表に対して選択処理を実行するためのSELECTオブジェクト権限が付与されている必要があります。

TimesTenでは、参照されるすべてのビューが実行時に検証されます。該当する処理を実行するために必要な権限がない場合、その権限について通知が行われます。

次に例を示します。

CREATE VIEW PAT.VIEW2 as select * from TERRY.TABLE2;
CREATE VIEW JOE.VIEW4 as select * from PAT.VIEW2, TERRY.TABLE4;

Patがこの文を実行する場合は、次の権限が付与されている必要があります。

- CREATE ANY VIEW権限。Patが自分のスキーマの他にJoeのスキーマにビューを作成するために必要です。

- ユーザーJoeに、Terry.Table4に対するSELECTオブジェクト権限が付与されている必要があります。

- ユーザーJoeに、Pat.View2に対するSELECTオブジェクト権限が付与されている必要があります。

- ユーザーPatに、Terry.Table2に対するSELECTオブジェクト権限が付与されている必要があります。

すべての参照の検証時に、TERRY.TABLE2に対するSELECTオブジェクト権限がPatにあるかどうかが確認され、PAT.VIEW2が引き続き有効かどうかが判断されます。ビューからの選択を実行すると、そのビュー自体とそのビューが参照している他のビューが有効かどうかが検証されます。

順序のオブジェクト権限

自分が所有していない順序に対して処理を実行する場合、ユーザーには、SELECTオブジェクト権限が付与されている必要があります。順序に対するSELECT権限を持つユーザーは、最終的にその順序を更新するNEXTVALのような処理も含めて、順序に対するすべての処理を実行できます。

たとえば、HRスキーマのemployees_seq順序に対するSELECT権限をユーザーPATに付与するには、次の文を発行します。

GRANT SELECT ON HR.employees_seq TO PAT;

PATは、この後、次の文を使用してこの順序の次の値を生成できます。

SELECT HR.employees_seq.NEXTVAL FROM DUAL;
< 207 >
1 row found.

マテリアライズド・ビューのオブジェクト権限

マテリアライズド・ビューを作成するには、ユーザーにCREATE MATERIALIZED VIEW権限が必要です。他のユーザーのスキーマでマテリアライズド・ビューを作成するユーザーには、CREATE ANY MATERIALIZED VIEW権限が必要です。

マテリアライズド・ビューの所有者には、そのビュー内のすべてのディテール表に対してCREATE TABLE権限およびSELECT権限が必要です。ただし、SELECT ANY TABLEやADMINなどの上位レベルのシステム権限がすでに付与されているマテリアライズド・ビューの所有者には、ディテール表に対するSELECT権限が自動的に付与されます。

自分が所有していないマテリアライズド・ビューから選択する場合、ユーザーには、そのマテリアライズド・ビューに対するSELECT、INDEXやREFERENCESなどのオブジェクト権限が付与されている必要があります。これらの必要な権限の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の該当するSQL文を参照してください。

無効なマテリアライズド・ビューの動作

マテリアライズド・ビューが有効であるには、そのマテリアライズド・ビューが参照するすべてのディテール表に対するSELECTオブジェクト権限がそのビューの所有者に付与され、保持されている必要があります。既存のマテリアライズド・ビューの所有者がそのマテリアライズド・ビューに基づく任意の詳細表に対するSELECT権限を失うと、そのマテリアライズド・ビューは無効になります。

マテリアライズド・ビューのステータスは、SYS.DBA_OBJECTS、SYS.ALL_OBJECTSおよびSYS.USER_OBJECTSビューのSTATUS列に表示されます。マテリアライズド・ビューの所有者は、USER_OBJECTSビューでそのマテリアライズド・ビューのステータスを確認できます。または、マテリアライズド・ビューが無効になると、INVALIDをそのビューに付加するttIsql describeコマンドを実行します。

注意:
SELECT ANY TABLEやADMINなどの上位レベルのシステム権限が付与されていたマテリアライズド・ビューの所有者は、そのシステム権限が取り消されると、ディテール表に対する必要なSELECT権限を失います。その時点で、マテリアライズド・ビューは無効となります。

- その場合でも、ユーザーは無効な非同期マテリアライズド・ビューからエラーなしで選択することは可能です。ただし、無効な同期マテリアライズド・ビューから選択すると、エラーが表示されます。

- 該当する権限を持つユーザーは、マテリアライズド・ビューのディテール表も更新できます。ただし、無効なマテリアライズド・ビューにそれらの変更は反映されません。さらに、非同期マテリアライズド・ビューについては、有効なマテリアライズド・ビューがディテール表に依存しない場合、マテリアライズド・ビュー・ログも更新されません。

- 無効な同期マテリアライズド・ビューに対して実行されるREFRESHは、エラーを伴って失敗します。

- 以前取り消された権限が再度付与されたマテリアライズド・ビューの所有者の場合、無効なCOMPLETE非同期マテリアライズド・ビューに対するREFRESHは正常に終了し、そのビューは有効になります。

- 無効なマテリアライズド・ビューを修正するには、適切な権限をそのビューの所有者に付与した後、ビューを破棄してから再作成する必要があります。

REFERENCES句による外部キーの作成時に必要なオブジェクト権限

CREATE文またはALTER TABLE文のREFERENCES句では、親表列(TABLE2.PK)に新しい子表列(TABLE1.COL1)からの外部キー依存性が作成されます。次に例を示します。

ALTER TABLE PAT.TABLE1 ADD CONSTRAINT FK1
FOREIGN KEY (COL1) REFERENCES PAT.TABLE2 (PK);

この例のSQLを実行するユーザーには、ALTER ANY TABLE権限が必要です。Patは両方の表を所有しているため、他の権限は不要です。

ただし、実行ユーザーが所有していない表がREFERENCES句によって参照されている場合、自分が所有していない表に対するREFERENCESオブジェクト権限がないと実行可能になりません。次に例を示します。

ALTER TABLE PAT.TABLE1 ADD CONSTRAINT FK1
FOREIGN KEY (COL1) REFERENCES TERRY.TABLE2 (PK);

この例のSQLを実行するユーザーには、ALTER ANY TABLE権限が必要です。前の例と同様に、このSQLの実行ユーザーがPatである場合、表の所有者は自分が所有する表を常に変更できるため、ALTER ANY TABLE権限は不要です。また、Terryが所有する表に関連する外部キーをユーザーPatが作成できるようにするには、PatにTERRY.TABLE2に対するREFERENCES権限が付与されている必要があります。

子表を作成または変更できるユーザーが外部キー依存性を作成するには、親表に対するREFERENCESオブジェクト権限が必要です。REFERENCES権限は、親表の外部キーを作成するユーザーにSELECT権限を暗黙的に付与します。ただし、この暗黙的な付与によって親表のSELECT権限がユーザーに付与されるわけではないため、親表に対する権限がREFERENCES権限のみのユーザーがどのようなSELECT文を実行しても失敗します。

PL/SQL関数、プロシージャおよびパッケージのオブジェクト権限

自分が所有していないPL/SQL関数、PL/SQLプロシージャまたはPL/SQLパッケージに対する処理を実行する場合、ユーザーには、EXECUTEオブジェクト権限が付与されている必要があります。ユーザーにパッケージに対するEXECUTE権限を付与すると、そのコンポーネント・プロシージャおよび関数に対する EXECUTE権限が自動的に付与されます。

この権限によって、次の処理を実行する権限が付与されます。

- プロシージャまたは関数を実行します。

- パッケージの仕様で宣言されている任意のプログラム・オブジェクトにアクセスします。

- 現時点で無効または未コンパイルの関数またはプロシージャのコール時にオブジェクトを暗黙的にコンパイルします。

EXECUTE権限を持つユーザーは、プロシージャ、関数またはパッケージを作成、破棄または変更できません。これらの処理には、適切なシステム権限が必要です。たとえば、ALTER PROCEDUREまたはALTER FUNCTIONを使用して明示的にコンパイルするには、ユーザーにALTER ANY PROCEDUREシステム権限が付与されている必要があります。関数、プロシージャまたはパッケージに関するシステム権限の詳細は、「任意のデータベース・オブジェクト・タイプに対するユーザーによる処理の許可」を参照してください。

シノニムのオブジェクト権限

ユーザーが、プライベート・シノニムまたはパブリック・シノニムを作成または破棄するには、次の権限が必要です。

表4-1 シノニムの権限

アクション

必要な権限

ユーザー自身のスキーマでプライベート・シノニムを作成します。

CREATE SYNONYM

他のユーザーのスキーマでプライベート・シノニムを作成します。

CREATE ANY SYNONYM

パブリック・シノニムを作成します。

CREATE PUBLIC SYNONYM

ユーザー自身のスキーマでプライベート・シノニムを破棄します。

権限は不要です。

他のユーザーのスキーマでプライベート・シノニムを破棄します。

DROP ANY SYNONYM

パブリック・シノニムを破棄します。

DROP PUBLIC SYNONYM

さらに、シノニムを使用するには、ユーザーには、シノニムが参照するオブジェクトに対する適切はアクセス権限が必要です。たとえば、ビューに対するシノニムを作成し、作成したシノニムを使用してビューから選択を行うには、ビューからの選択に必要なSELECT権限が必要です。

単一のSQL文による複数の権限の付与または取消し

1つのGRANTまたはREVOKE文で、1人以上のユーザーに対し、同じデータベースを対象として複数のオブジェクト権限を付与できます。たとえば、次の例では、1つのSQL文で、HR.employees表に対するSELECTおよびUPDATEオブジェクト権限をTerryに付与します。

GRANT SELECT, UPDATE ON HR.employees TO TERRY;

また、1つのGRANTまたはREVOKE文で、1人以上のユーザーに複数のシステム権限を付与できます。次の例では、複数のシステム権限をTerryとPatの両方に付与します。

GRANT CREATE ANY TABLE, CREATE SESSION TO TERRY, PAT;

1つのGRANT文またはREVOKE文にシステム権限とオブジェクト権限の両方を含めることはできません。

キャッシュ・グループの権限の付与または取消し

ユーザーが任意のキャッシュ・グループに関連するアクティビティを実行できるようにするには、そのユーザーに適切なキャッシュ・グループ権限が付与される必要があります。キャッシュ・グループに対するシステム権限とオブジェクト権限があり、システム権限にはオブジェクトを限定しない機能が含まれます。

注意:
パススルーの場合、権限チェックはOracle Databaseによってユーザー資格証明を使用して実行されるため、権限の付与は必要ありません。パススルーの詳細は、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』のパススルー・レベルの設定に関する説明を参照してください。

次の項では、キャッシュ・グループ権限の概要について説明します。

- キャッシュ・マネージャ権限

- キャッシュ・グループのシステム権限

- キャッシュ・グループのオブジェクト権限

キャッシュ・グループ処理のためのシステム権限とオブジェクト権限の完全なリストは、『Oracle TimesTen In-Memory Database SQLリファレンス』の権限に関する説明を参照してください。

キャッシュ・マネージャ権限

ユーザーはキャッシュ・グループ・システム権限により、データベースに含まれるキャッシュ・グループ・オブジェクトを操作できるようになります。CACHE_MANAGERシステム権限は、キャッシュ・グループの管理者権限です。ユーザーにCACHE_MANAGER権限が付与されると、このユーザーはすべてのキャッシュ・グループ処理を実行できるようになります。この権限により、キャッシュ・グループのすべての処理権限が付与されます(詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の権限階層に関する項を参照してください)。

読取り専用キャッシュ・グループの初期ロードを実行したり、読取り専用キャッシュ・グループの自動リフレッシュ状態を変更するには、CACHE_MANAGER権限が必要です。初期ロードを実行すると、キャッシュ・グループの自動リフレッシュの状態が一時停止からオンに暗黙的に変更されます。

次の例では、CACHE_MANAGER権限をPATに付与します。

GRANT CACHE_MANAGER TO PAT;

注意:
ASYNCHRONOUS WRITETHROUGH(AWT)キャッシュ・グループは、キャッシュ・グループとレプリケーションの両方の機能を持ちます。CACHE_MANAGER権限は、AWTキャッシュ・グループの作成に必要なすべての権限を付与します。

キャッシュ・グループのシステム権限

TimesTenユーザーが必要とする権限は、実行するキャッシュ・グループ処理のタイプによって決まります。

- キャッシュ・グループを作成するには、CREATE CACHE GROUPシステム権限またはCREATE ANY CACHE GROUPシステム権限が必要です。さらに、基礎となるキャッシュ表を作成するには、その表を自分が所有するかどうかに応じて、CREATE ANY TABLE権限またはCREATE TABLE権限をいずれかが付与される必要があります。

- 自分が所有していないキャッシュ・グループを破棄または変更する場合、ユーザーには、必要に応じてDROP ANY CACHE GROUP権限またはALTER ANY CACHE GROUP権限が付与されている必要があります。さらに、ユーザーが、自分が所有していない基礎となるキャッシュ表を破棄するには、DROP ANY TABLE権限を付与される必要があります。

注意:
すべてのキャッシュ・グループ権限の詳細は、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』の「キャッシュ・インフラストラクチャの設定」の章を参照してください。

たとえば、次の例では、データベースに含まれる任意のキャッシュ・グループを変更する権限をユーザーに付与します。

GRANT ALTER ANY CACHE GROUP TO PAT;

注意:
表を所有したり、キャッシュ・グリッド情報を格納するには、Oracle Databaseに、特定の権限を持つユーザーを作成することも必要です。Oracle Databaseキャッシュ管理ユーザーおよび各キャッシュ処理を行うTimesTenキャッシュ・マネージャ・ユーザーに必要な権限については、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』の「キャッシュ・インフラストラクチャの設定」の章を参照してください。

キャッシュ・グループ処理のための他のシステム権限は、自分が所有してないオブジェクトに対して次の処理を実行するためのものです。

- FLUSH ANY CACHE GROUP: データベースに含まれる任意のキャッシュ・グループをフラッシュできます。

- LOAD ANY CACHE GROUP: データベースに含まれる任意のキャッシュ・グループをロードできます。

- UNLOAD ANY CACHE GROUP: データベースに含まれる任意のキャッシュ・グループをアンロードできます。

- REFRESH ANY CACHE GROUP: データベースに含まれる任意のキャッシュ・グループをリフレッシュできます。

キャッシュ・グループのオブジェクト権限

キャッシュ・グループ処理のためのオブジェクト権限は、ユーザーが単一の定義済オブジェクトに対する処理を実行できるようにするために付与します。キャッシュ・グループ・オブジェクトに対するオブジェクト権限は、次のとおりです。

- FLUSH: 他のユーザーが所有するキャッシュ・グループをフラッシュできます。

- LOAD: 他のユーザーが所有するキャッシュ・グループをロードできます。

- UNLOAD: 他のユーザーが所有するキャッシュ・グループをアンロードできます。

- REFRESH: 他のユーザーが所有するキャッシュ・グループをリフレッシュできます。

たとえば、次の例では、Terryが所有するキャッシュ・グループCACHEGRPに対してFLUSHを実行するためのキャッシュ・グループ・オブジェクト権限をPATに付与します。

GRANT FLUSH ON TERRY.CACHEGRP TO PAT;

キャッシュ・グループ処理の詳細は、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』の「キャッシュ・グループの処理」を参照してください。

ユーザー権限の表示

各ユーザーに付与された権限を表示するには、次のビューを使用します。

表4-2 システム権限ビュー

ビュー名

説明

SYS.USER_SYS_PRIVS

現在のユーザーに付与されているすべてのシステム権限を戻します。

SYS.DBA_SYS_PRIVS

すべてのユーザーに付与される、PUBLICロールから継承されるシステム権限のリストを戻します。このビューからの選択にはADMIN権限が必要です。

SYS.USER_TAB_PRIVS

現在のユーザーに付与されているすべてのオブジェクト権限を戻します。

SYS.ALL_TAB_PRIVS

ユーザーに対してPUBLICロールから継承されるUSER_TAB_PRIVSとオブジェクト権限の両方の結果を戻します。これにより、ユーザーに付与されるすべてのオブジェクト権限が表示されます。

SYS.DBA_TAB_PRIVS

すべてのユーザーに付与される、PUBLICロールから継承されるオブジェクト権限を戻します。このビューからの選択にはADMIN権限が必要です。

たとえば、次の文を実行すると、すべてのユーザーに付与されるシステム権限がすべて表示されます。

Command> SELECT * FROM SYS.DBA_SYS_PRIVS;
< SYS, ADMIN, YES >
< SYSTEM, ADMIN, YES >
< TERRY, ADMIN, YES >
< TERRY, CREATE ANY TABLE, NO >
< PAT, CACHE_MANAGER, NO >
5 rows found.

注意:
これらのビューの詳細は、『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』のシステム表に関する説明を参照してください。

ユーティリティ、組込みプロシージャおよび初期接続属性に必要な権限

ユーティリティおよび組込みプロシージャの多くは、その実行に特定の権限を必要とします。また、一部の初期接続属性では、変更または接続時に特定の権限を必要とします。初期接続属性はデータベースが最初にロードされるときに設定され、初期接続属性設定でデータベースをロードできるのはインスタンス管理者のみです。それぞれに必要な権限の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のユーティリティ、組込みプロシージャまたは初期接続属性に関する説明を参照してください。

親子表の権限チェック・ルール

外部キー制約によって関連付けられている表がある場合は、次の事項が該当します。

- 子表の外部キー制約にON DELETE CASCADEが指定されている場合は、子表に対する DELETE権限が明示的に付与されていなくても、ユーザーは子表からの削除を伴う親表からの行の削除を実行できます。ただし、この動作が自動で行われるようにするには、ユーザーに親表に対するDELETE権限が必要です。

- 子表に対する挿入または更新を実行すると、親表に対する外部キー制約違反が子表に対する変更に伴って発生していないかどうかが確認されます。違反が発生する場合、ユーザーには子表に対するINSERT権限またはUPDATE権限が必要になりますが、親表に対するSELECT権限は不要です。

- 子表を作成するユーザーが外部キー依存性を作成するには、親表に対するREFERENCESオブジェクト権限が必要です。詳細は、「REFERENCES句による外部キーの作成時に必要なオブジェクト権限」を参照してください。

5 グローバリゼーション・サポート

次の項では、TimesTenのグローバリゼーション・サポート機能について説明します。

- グローバリゼーション・サポート機能の概要

- データベース・キャラクタ・セットの選択

- 長さセマンティクスおよびデータ記憶域

- 接続キャラクタ・セット

- 言語ソート

- SQL文字列および文字関数

- グローバリゼーション・サポート属性の設定

- 移行時のグローバリゼーション・サポート

グローバリゼーション・サポート機能の概要

TimesTenグローバリゼーション・サポートには、次の機能があります。

- キャラクタ・セットのサポート
データベースを作成する場合は、データベース・キャラクタ・セットを選択する必要があります。サポートされているすべてのキャラクタ・セットについては、このマニュアルの「データベース・キャラクタ・セットの選択」および『Oracle TimesTen In-Memory Databaseリファレンス』のサポートされているキャラクタ・セットに関する説明を参照してください。また、セッションの接続キャラクタ・セットも選択する必要があります。「接続キャラクタ・セット」を参照してください。

- 長さセマンティクス
文字データ型の記憶域測定を定義する場合に使用するバイト・セマンティクスおよびキャラクタ・セマンティクスを指定できます。「長さセマンティクスおよびデータ記憶域」を参照してください。

- 言語ソートおよび言語索引。言語ルールに基づいてデータをソートできます。「言語ソート」を参照してください。言語索引を使用して、言語ソートのパフォーマンスを向上させることができます。「言語索引の使用」を参照してください。

- SQL文字列関数および文字関数
TimesTenでは、文字列に関する情報を戻すSQL関数が提供されています。また、エンコードされた値から文字を戻すSQL関数も提供されています。「SQL文字列および文字関数」を参照してください。

注意:
このリリースのTimesTenでは、セッションの言語および地域はサポートされていません。

データベース・キャラクタ・セットの選択

TimesTenでは、データベース・キャラクタ・セットを使用して、CHARやVARCHAR2などの文字データ型で格納するデータのエンコーディングを定義します。

データベースのキャラクタ・セットは、DatabaseCharacterSetデータ・ストア属性を使用し、データベースの作成時に指定します。データベースのキャラクタ・セットは、データベースの作成後は変更できず、DatabaseCharacterSetにはデフォルトの値がありません。サポートされているキャラクタ・セットのリストについては、『Oracle TimesTen In-Memory Databaseリファレンス』のサポートされているキャラクタ・セットに関する説明を参照してください。

データベースのキャラクタ・セットを選択する場合は、次のことについて考慮してください。

- 現在および将来、データベースでサポートする必要がある言語であるか。

- キャラクタ・セットはオペレーティング・システムで使用可能かどうか。

- クライアントで使用されているキャラクタ・セット。

- アプリケーションでのキャラクタ・セットの処理状況。

- パフォーマンスへのキャラクタ・セットの影響。

TimesTen Application-Tier Database Cache (TimesTen Cache)を使用してOracle Database表をキャッシュする場合、またはOracle DatabaseのデータをTimesTen表にロードする場合は、Oracle Databaseと同じキャラクタ・セットでデータベースを作成する必要があります。

この項の内容は次のとおりです。

- キャラクタ・セットおよび言語

- クライアント・オペレーティング・システムとアプリケーションの互換性

- パフォーマンスおよび記憶域への影響

- キャラクタ・セットおよびレプリケーション

キャラクタ・セットおよび言語

データベース・キャラクタ・セットを選択すると、データベースで表示できる言語が決定されます。

一連の文字(アルファベット文字、表意文字、記号、句読点、制御文字など)をキャラクタ・セットとしてエンコードできます。エンコードされたキャラクタ・セットによって、文字レパートリ内の各文字に対して一意の数値コードが割り当てられます。この数値コードは、コード・ポイントまたはエンコードされた値と呼ばれます。

キャラクタ・セットは、シングルバイトでもマルチバイトでもかまいません。シングルバイトの7ビット・コード体系は、128文字までの文字を定義でき、通常、1つの言語のみをサポートします。シングルバイトの8ビット・コード体系は、256文字までの文字を定義でき、通常、1つの関連言語グループをサポートします。マルチバイトのコード体系は、何千もの文字を使用する中国語や日本語などのアジア言語の表意文字スクリプトをサポートするために必要です。これらのコード体系では、固定バイト数または可変バイト数のいずれかを使用してそれぞれの文字を表します。エンコードされたユニバーサル・キャラクタ・セットのことで、1つのキャラクタ・セットを使用して任意の言語の情報を格納できます。Unicodeは使用されるプラットフォーム、プログラムまたは言語に関係なく、すべてのキャラクタにそれぞれ一意のコード値を提供します。

クライアント・オペレーティング・システムとアプリケーションの互換性

データベース・キャラクタ・セットは、オペレーティング・システムから独立しています。英語のオペレーティング・システムで、日本語キャラクタ・セットのデータベースを作成および実行できます。ただし、クライアントのオペレーティング・システム内のアプリケーションでデータベースにアクセスする場合は、クライアントのオペレーティング・システムによって適切なフォントおよび入力方法のキャラクタ・セットがサポートされている必要があります。たとえば、英語版Windowsでは、最初に日本語のフォントおよび入力方法をインストールせずに、日本語のデータを挿入または取得することはできません。日本語のデータを挿入および取得するもう1つの方法として、リモートで日本語オペレーティング・システムを使用してデータベース・サーバーにアクセスする方法もあります。

すべてのクライアント・アプリケーションが同じキャラクタ・セットを使用している場合は、そのキャラクタ・セットが、通常、データベース・キャラクタ・セットとして最善の選択肢です。クライアント・アプリケーションで異なるキャラクタ・セットが使用されている場合、データベース・キャラクタ・セットをすべてのアプリケーション・キャラクタ・セットのスーパーセットにする必要があります。これによって、アプリケーション・キャラクタ・セットからデータベース・キャラクタ・セットに変換した場合、すべての文字が表示されるようになります。

パフォーマンスおよび記憶域への影響

最適なパフォーマンスのためには、変換が不要なキャラクタ・セットを選択し、使用言語にとって最も効率的なエンコーディングを使用してください。シングルバイト・キャラクタ・セットは、パフォーマンスの点でマルチバイト・キャラクタ・セットよりも優れており、領域要件に関してもより効率的です。ただし、シングルバイト・キャラクタ・セットには、サポートできる言語の種類に制限があります。

キャラクタ・セットおよびレプリケーション

レプリケーション・スキーム内のすべてのデータベースのデータベース・キャラクタ・セットは同じである必要があります。レプリケーションでは、キャラクタ・セットの変換は行われません。

長さセマンティクスおよびデータ記憶域

シングルバイト・キャラクタ・セットの場合、文字列のバイト数と文字数は同じです。マルチバイト・キャラクタ・セットでは、1つの文字またはコード・ポイントが1バイト以上で構成されています。可変幅キャラクタ・セットでは、バイト長に基づいて文字数を算出することが困難な場合があります。列の長さをバイトで計算することはバイト・セマンティクスと呼ばれ、列の長さを文字で計算することはキャラクタ・セマンティクスと呼ばれます。

文字長およびバイト長セマンティクスは、列長および記憶域サイズについて発生する可能性がある問題を解決するためにサポートされています。UTF-8またはAL32UTF8などのマルチバイト・エンコードのキャラクタ・セットがサポートされています。マルチバイト・エンコードでは、1文字に必要な記憶域量が文字によって異なります。たとえば、UTF-8の文字では1から4バイトが必要です。たとえば、CHAR (10)と定義された列の場合、キャラクタ・セットのエンコードに関係なく、この列には10文字すべてが収まります。しかし、キャラクタ・セットのエンコードがUTF-8の場合は、最大40バイトが必要になります。

キャラクタ・セマンティクスは、可変幅のマルチバイト文字列に必要な記憶域を定義する場合に有効です。たとえば、Unicodeのデータベース(AL32UTF8)で、5文字の英字とともに最大5文字の漢字を格納できるVARCHAR2の列を定義する必要があるとします。バイト・セマンティクスを使用すると、この列には、漢字(それそれが3バイト)用に15バイト、英字(それぞれが1バイト)用に5バイトの合計20バイトが必要になります。キャラクタ・セマンティクスを使用すると、この列には10バイトが必要になります。

次のリストの式ではバイト・セマンティクスを使用しています。CHARおよびVARCHAR2式のBYTE修飾子に注意してください。

- CHAR (5 BYTE)

- VARCHAR2(20 BYTE)

次のリストの式ではキャラクタ・セマンティクスを使用しています。VARCHAR2式のCHAR修飾子に注意してください。

- VARCHAR2(20 CHAR)

- SUBSTR(string, 1, 20)

デフォルトでは、CHARおよびVARCHAR2文字データ型は文字ではなくバイトで指定されます。したがって、表定義でCHAR(20)と指定されている場合は、20バイトの文字データを格納できます。

文字データ型の新しい列にバイト・セマンティクスとキャラクタ・セマンティクスのどちらが使用されるかは、NLS_LENGTH_SEMANTICS一般接続属性によって決定されます。これにより、明示的な修飾子を追加する必要なく、バイト長セマンティクスまたは文字長セマンティクスのいずれかを使用して、CHARおよびVARCHAR2列を作成できます。NCHARおよびNVARCHAR2列は、常に文字ベースです。既存の列は、影響を受けません。

NLS_LENGTH_SEMANTICSのデフォルト値はBYTEです。BYTEまたはCHAR修飾子をデータ型式に指定すると、この値がNLS_LENGTH_SEMANTICSの値より優先されます。

接続キャラクタ・セット

データベース・キャラクタ・セットによって、CHARおよびVARCHAR2文字データ型のエンコーディングが決定されます。TimesTenでアプリケーションとデータベース間で必要なキャラクタ・セット変換を実行できるように、送受信されるアプリケーション・データのエンコーディングを記述する場合は、接続キャラクタ・セットが使用されます。たとえば、Unicode以外のアプリケーションでUnicode(AL32UTF8)のデータベースと通信できます。

ConnectionCharacterSet一般接続属性では、接続のための文字コードを設定します(この文字コードには、データベース・キャラクタ・セットと異なるものを指定できます)。接続では、パラメータ、SQLの問合せテキスト、結果、エラー・メッセージなど、接続を介して渡される情報用に接続キャラクタ・セットを使用します。アプリケーション環境に適合する接続キャラクタ・セットまたはデータソースのキャラクタ・セットを選択します。

接続キャラクタ・セットとデータベース・キャラクタ・セットが同じ場合は、変換が発生しないため、最高のパフォーマンスが実現されます。接続キャラクタ・セットとデータベース・キャラクタ・セットが異なる場合は、ODBCレイヤーでデータ変換が実行されます。ターゲットのキャラクタ・セットに変換できない文字は、置換文字に変換されます。

デフォルトの接続キャラクタ・セットはUS7ASCIIです。この設定は、直接接続およびクライアント接続の両方に適用されます。

言語ソート

ソートのルールは、各言語によって異なります。これまで、テキストは文字のエンコードに使用されるバイナリ・コードに従ってデータベース内でソートされてきました。通常、この方法では、言語的に意味のある順序ではソートされません。様々な言語および文化の複雑なソート要求には、言語ソートで処理します。これにより、CHAR、VARCHAR2、NCHARおよびNVARCHAR2などの文字データ型のテキストを特定の言語規則に従ってソートできます。

言語ソートでは、各文字を、その文字の言語的に適切な順序を反映した数値に置き換えることによって処理が行われます。TimesTenでは、単一言語ソートおよび多言語ソートの2種類の言語ソートが提供されています。

この項の内容は次のとおりです。

- 単一言語ソート

- 多言語ソート

- 大/小文字およびアクセントを区別しない言語ソート

- 言語ソートの実行

- 言語索引の使用

単一言語ソート

単一言語ソートの場合、TimesTenでは文字列を2つのステップで比較します。1つめのステップでは、文字列全体のメジャー値をメジャー値の表と比較します。通常、同じ外観の文字は、メジャー値が同じです。2つめのステップでは、文字列全体のマイナー値をマイナー値の表と比較します。メジャー値とマイナー値は、TimesTenによって定義されます。TimesTenでは、アクセントおよび大/小文字の相違のある文字は、メジャー値は同じで、マイナー値は異なると定義されます。

単一言語ソートは、シングルバイトおよびUnicodeのデータベース・キャラクタ・セットでのみ使用可能です。キャラクタ・セットがUnicode以外のマルチバイトの場合、単一言語ソートを指定すると、デフォルトのソート順はデータベース・キャラクタ・セットのバイナリ・ソート順となります。

サポートされているソートのリストについては、『Oracle TimesTen In-Memory Databaseリファレンス』のNLS_SORTに関する説明を参照してください。

多言語ソート

TimesTenでは、1回のソートで複数の言語のデータをソートできるように多言語ソートが提供されています。多言語ソートは、ISO/OEC 14651 - International String OrderingおよびUnicode照合アルゴリズム規格に基づいています。このフレームワークによって、複雑なソート・ルールを持つ言語(アジア言語など)の処理、および多言語データを持つデータベースに対する言語的なサポートの提供がデータベースで可能になります。

また、多言語ソートでは、標準等価性および補助文字を処理できます。標準等価性とは、文字または文字列間での基本的な等価性のことです。たとえば、çはcと,との組合せと等価です。

たとえば、TimesTenでは、フランス語の単一言語ソート(FRENCH)がサポートされていますが、ユーザーはフランス語の多言語ソート(FRENCH_M)を指定できます。_Mは、多言語ソートのISO 14651規格を意味します。ソート順は、GENERIC_Mソート順に基づいており、アクセントを右から左にソートできます。表に多言語データが含まれている場合は、多言語ソートを使用することをお薦めします。表にフランス語のみが含まれている場合は、メモリーの使用量が少ないフランス語の単一言語ソートを使用すると、パフォーマンスが向上する可能性があります。フランス語の単一言語ソートでは、フランス語の多言語ソートより少数の文字が定義されているため、メモリーの使用量が少なくなります。どの方法を使用するかは、ソートの範囲とパフォーマンスのトレードオフになります。

サポートされている多言語ソートのリストについては、『Oracle TimesTen In-Memory Databaseリファレンス』のNLS_SORTに関する説明を参照してください。

大/小文字およびアクセントを区別しない言語ソート

データベース内部の処理では、大/小文字およびアクセントが区別されます。大/小文字およびアクセントを区別しないソートを実行する必要がある場合もあります。

大/小文字およびアクセントを区別しない言語ソートを指定するには、次の操作を実行します。

- TimesTenソート名の末尾に_CIを追加すると、ソートで大/小文字が区別されません。次に例を示します。
BINARY_CI: アクセントを区別し、大/小文字を区別しないバイナリ・ソート

GENERIC_M_CI: アクセントを区別し、大/小文字を区別しないGENERIC_Mソート

- TimesTenソート名の末尾に_AIを追加すると、ソートでアクセントおよび大/小文字が区別されません。次に例を示します。
BINARY_AI: アクセントおよび大/小文字を区別しないバイナリ・ソート

FRENCH_M_AI: アクセントおよび大/小文字を区別しないFRENCH_Mソート

言語ソートの実行

NLS_SORT データ・ストア接続属性で、言語比較に使用する照合順番を指定します。NLS_SORTの値は、SQLの文字列比較演算子およびORDER BY句に影響を与えます。

ALTER SESSION文を使用すると、NLS_SORTの値を変更できます。

ALTER SESSION SET NLS_SORT=SWEDISH;
SELECT product_name
FROM product
ORDER BY product_name;

PRODUCT NAME
------------
aerial
Antenne
Lcd
ächzen
Ähre

また、SQL関数NLSSORTを使用して言語ソートを実行することによって、NLS_SORTの設定を無視することもできます。

SELECT * FROM test ORDER BY NLSSORT(name,'NLS_SORT=SPANISH');

注意:
TimesTenでは、マテリアライズド・ビューおよびキャッシュ・グループに対して、この属性を接続文字列またはDSN定義で使用するのではなく、SQL関数のNLSSORT()を使用して照合順番を明示的に指定することをお薦めします。

詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のNLS_SORTに関する説明を参照してください。NLSSORTの使用例については、『Oracle TimesTen In-Memory Database SQLリファレンス』のNLSSORTに関する説明を参照してください。

言語索引の使用

言語索引を作成すると、言語比較時のパフォーマンスを向上させることができます。言語索引には、ソート・キー値用の記憶域が必要です。

言語索引を作成するには、次のような文を使用します。

CREATE INDEX german_index ON employees
(NLSSORT(employee_id, 'NLS_SORT=GERMAN'));

オプティマイザによって、NLSSORTおよびNLS_SORTの値に基づいて適切な索引が選択されます。

1つの列に対して複数の言語ソートが必要な場合は、複数の言語索引を作成する必要があります。たとえば、同じ列に対してGERMANとGERMAN_CIソートの両方を使用する場合は、2つの言語索引を作成します。

詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE INDEXに関する説明を参照してください。

SQL文字列関数および文字関数

文字列を操作する多数のSQL関数がありますが、詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の次の各説明を参照してください。

- 文字値を戻す文字関数に関する説明。

- 数値を戻す文字関数に関する説明。

- 文字列関数に関する説明。

- LOB関数に関する説明。

- 変換関数(文字列に対して操作する一部の関数)に関する説明。

- 一般的な比較関数(LOBデータ型以外の文字列に対して操作する一部の関数)に関する説明。

グローバリゼーション・サポート属性の設定

次の表に、グローバリゼーション・サポート属性の概要を示します。

パラメータ

説明

DatabaseCharacterSet

データベースで使用される文字コードを示します。

ConnectionCharacterSet

接続用の文字コードを指定します。データベース・キャラクタ・セットとは異なる文字コードを指定することができます。

NLS_SORT

言語比較に使用する照合順序を示します。

NLS_LENGTH_SEMANTICS

デフォルトの長さセマンティクスを設定します。

NLS_NCHAR_CONV_EXCP

NCHAR/NVARCHAR2データとCHAR/VARCHAR2データ間の暗黙的または明示的なデータ型変換時にデータが失われた場合にエラーをレポートするかどうかを指定します。

DatabaseCharacterSetは、データベースの作成時に設定する必要があります。デフォルトはありません。「データベース・キャラクタ・セットの選択」を参照してください。

残りの属性は、データベースとの接続時に設定されます。ConnectionCharacterSetの詳細は、「接続キャラクタ・セット」を参照してください。

ALTER SESSION文を使用すると、セッション中に次の属性を変更できます。

- NLS_SORT

- NLS_LENGTH_SEMANTICS

- NLS_NCHAR_CONV_EXCP

詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のALTER SESSIONに関する説明および『Oracle TimesTen In-Memory Databaseリファレンス』の「接続属性」を参照してください。

TIMESTEN8を使用した後方互換性

TIMESTEN8は、7.0より前のリリースのTimesTenの動作を指定する制限付きデータベース・キャラクタ・セットです。これは、下位互換性を維持する目的のみでサポートされています。

TIMESTEN8には、次の制限があります。

- すべての種類のキャラクタ・セット変換がサポートされていません。これには、次が含まれます。

- アプリケーションとデータベースの間の変換。DatabaseCharacterSetがTIMESTEN8の場合は、ConnectionCharacterSetもTIMESTEN8である必要があります。

- CHAR/VARCHAR2データとNCHAR/NVARCHAR2データ間の変換。

- CHARおよびVARCHAR2データ型のソートはバイナリ順にのみ制限されています。使用できる照合順番はNLS_SORT=BINARYのみです。

- CHARセマンティクスは無視されます。文字はシングルバイトです。

- UPPERおよびLOWER関数でサポートされるのはASCII文字のみです。ASCII以外の文字に対する結果は定義されていません。エラーは返されません。

- TIMESTEN8は、TimesTen Cacheではサポートされていません。

- TIMESTEN8では、LOBデータ型はサポートしていません。

ユーザーは、データベース作成時、可能な場合常に、CHARおよびVARCHAR2列に格納されるデータの実際のエンコーディングと一致するデータベース・キャラクタ・セットを選択する必要があります。TIMESTEN8は、既存のTimesTenデータに対する後方互換性が必要な場合にのみ選択します。

注意:
TIMESTEN8キャラクタ・セットを使用するTimesTenデータベースを別のキャラクタ・セットを使用するデータベースに移行する場合の潜在的な問題の詳細は、『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』の移行、バックアップおよびリストアに関する説明を参照してください。

移行時のグローバリゼーション・サポート

移行時、グローバリゼーション・サポートによって問題が発生する場合があります。詳細は、『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』の移行、バックアップおよびリストアに関する説明および『Oracle TimesTen In-Memory Databaseリファレンス』のttMigrateに関する説明を参照してください。

6 ttIsqlユーティリティの使用方法

TimesTenのttIsqlユーティリティは、TimesTenデータソースを処理するための一般的なツールです。ttIsqlコマンドライン・インタフェースを使用して、SQL文および組込みttIsqlコマンドを実行して様々なタスクを実行します。通常ttIsqlを使用して行う処理は次のとおりです。

- データベースの設定およびメンテナンス。表と索引の作成、既存の表の変更および表統計の更新は、ttIsqlを使用して迅速かつ簡単に実行できます。

- データベースの構造に関する情報の検索。表、索引、およびキャッシュ・グループの定義は、組込みttIsqlコマンドを使用して検索できます。また、データベースの現在のサイズおよび状態を表示することもできます。

- データベース処理の最適化。ttIsqlユーティリティを使用して、SQL操作をチューニングするために問合せオプティマイザ計画を変更または表示できます。また、様々なODBC関数コールの実行に必要な時間も表示できます。

次の項では、ttIsqlユーティリティを使用してこれらのタスクを実行する方法について説明します。

- バッチ・モードおよび対話モード

- TTISQL環境変数を使用したデフォルト設定の定義

- ttIsqlコマンド・プロンプトのカスタマイズ

- ttIsqlオンライン・ヘルプの使用

- ttIsqlのeditline機能の使用(UNIXのみ)

- ttIsqlのコマンド履歴の使用

- ttIsqlのeditコマンドの使用

- キャラクタ・セットの処理

- データベース構造情報の表示

- オブジェクト・タイプ別のデータベース・オブジェクトのリスト

- 接続属性の表示および設定

- トランザクションの処理

- 準備済およびパラメータ化済のSQL文の処理

- 変数の使用、宣言、構成方法

- PL/SQLブロックの作成および実行

- OUTパラメータを使用したPL/SQLからのデータの受渡し

- IF-THEN-ELSEコマンド構成を使用した条件制御

- Oracle DatabaseからTimesTen表へのデータのロード

- 問合せオプティマイザ計画の参照および変更

- ODBC関数の管理

- WHENEVER SQLERRORを使用したエラーのリカバリ

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-2013, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.

Command> connect MY_DSN;
Connection successful: DSN=MY_DSN;DataStore=E:\ds\MY_DSN;
DRIVER=E:\WINNT\System32\TTdv1122.dll;
(Default setting AutoCommit=1)

Command>

ttIsqlを使用してデータベースに接続する際には、ttIsqlコマンドラインでDSNまたは接続文字列を指定することも可能です。connectコマンドが暗黙的に実行されます。

C:\>ttIsql -connstr "DSN=MY_DSN"

Copyright (c) 1996-2013, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.

connect "DSN=MY_DSN";
Connection successful: DSN=MY_DSN;DataStore=E:\ds\MY_DSN;
DRIVER=E:\WINNT\System32\TTdv1122.dll;
(Default setting AutoCommit=1)

Command>

バッチ・モードは、2つの異なる方法で使用できます。最も一般的な方法は、ttIsqlコマンドラインで、実行するファイルの名前を-fオプションの後に指定する方法です。

たとえば、CREATE TABLE文を含むファイルを実行する場合は次のようになります。

C:\>ttIsql -f create.sql -connstr "DSN=MY_DSN"

Copyright (c) 1996-2013, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.

connect "DSN=MY_DSN"
Connection successful: DSN=MY_DSN;DataStore=E:\ds\MY_DSN;
DRIVER=E:\WINNT\System32\TTdv1122.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コマンドライン・オプションの概要を示します。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-2013, 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=E:\ds\MY_DSN;
DRIVER=E:\WINNT\System32\TTdv1122.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コマンド・プロンプトのカスタマイズ

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組込みコマンドのコマンド構文の定義および説明が用意されています。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

ttIsqlのeditline機能の使用(UNIXのみ)

UNIXシステムでは、editlineライブラリを使用して、emacs(デフォルト)またはviバインディングを設定すると、前のttIsqlコマンドをスクロールしたり、編集して再送信することができます。この機能は、Windowsでは使用不可および不要です。

ttIsqlのeditline機能を無効にするには、ttIsqlコマンドのset editline offを使用します。

設定およびキーストロークに関する情報を、エディタのタイプごとに説明します。

- emacsバインディング

- viバインディング

emacsバインディング

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バインディング

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ユーティリティでは、現行の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>

ttIsqlのコマンド履歴の保存および消去

savehistoryコマンドを使用すると、ttIsqlによって保存されるコマンドのリストを保存できます。

Command> savehistory history.txt;

出力ファイルがすでに存在している場合は、-aオプションを使用してこのファイルに新しいコマンド履歴を追加するか、または-fオプションを使用してこのファイルを上書きします。次の例では、既存のファイルに新しいコマンド履歴を追加する方法を示します。

Command> savehistory -a history.txt;

clearhistoryコマンドを使用すると、ttIsqlによって保存されるコマンドのリストを消去できます。

Command> clearhistory;

ttIsqlのeditコマンドの使用

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のeditコマンドのデフォルトのテキスト・エディタの変更

ttIsql _EDITOR定義の別名を定義することによってデフォルトのエディタを指定できます。次の例では、デフォルトのエディタをviに設定します。

Command> DEFINE _EDITOR=vi

_EDITOR定義の別名を定義しない場合は、ttIsqlはVISUAL環境変数で指定されているエディタを使用します。_EDITOR定義の別名およびVISUAL環境変数が設定されていない場合は、ttIsqlはEDITOR環境変数で指定されているエディタを使用します。_EDITOR、VISUALおよびEDITORが設定されていない場合は、UNIXではviが、Windowsではnotepad.exeが使用されます。

キャラクタ・セットの処理

ttIsqlユーティリティでは、『Oracle TimesTen In-Memory Databaseリファレンス』のサポートされているキャラクタ・セットの項に記載されているキャラクタ・セットがサポートされています。ttIsqlで文字を表示する機能は、ttIsqlを使用している端末のネイティブ・オペレーティング・システムのロケール設定によって異なります。

ロケール・ベースの出力書式を上書きするには、ncharencodingオプションまたは-Nオプションを使用します。これらのオプションの有効な値は、LOCALE(デフォルト)およびASCIIです。ASCIIを選択した場合にttIsqlでUnicode文字が検出されると、Unicode文字はエスケープされた書式で表示されます。

出力方法を変更する場合、アクティブな接続は必要ありません。

データベース構造情報の表示

データベース構造に関する情報を表示するいくつかのttIsqlコマンドが用意されています。次に、最も有効なコマンドの概要を示します。

- describe: データベース・オブジェクトに関する情報を表示します。

- cachegroups: キャッシュ・グループの属性を表示します。

- dssize - 永続メモリー領域および一時メモリー領域の現在のサイズをレポートします。

- tablesize: ttComputeTabSizesツールを使用して分析された表のサイズが表示されます。

- monitor: データベースの現在の状態のサマリーを表示します。

ttIsqlのdescribeコマンドの使用

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>

ttIsqlのcachegroupsコマンドの使用

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 global (Dynamic)
Autorefresh: No
Aging: LRU on
Root Table: ORATT.WRITETAB
Table Type: Propagate
2 cache groups found.

ttIsqlのdssizeコマンドの使用

dssizeコマンドを使用すると、データベースの最大サイズ、割当てサイズおよび使用中サイズのみでなく、永続パーティションおよび一時メモリー領域の現在のメモリー・ステータスがレポートされます。

次の例では、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に関する説明を参照してください。

ttIsql tablesizeコマンドの使用

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に関する項を参照してください。

ttIsqlのmonitorコマンドの使用

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-2013, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.
connect "DSN=myDSN";
Connection successful:
DSN=myDSN;UID=terry;DataStore=/scratch/terry/myDSN;DatabaseCharacter
Set=AL32UTF8;ConnectionCharacterSet=US7ASCII;PermSize=32;TypeMode=0;
(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-2013, 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=/scratch/terry/myDSN;DatabaseCharacterSet=AL32UTF8;
ConnectionCharacterSet=US7ASCII;PermSize=32;TypeMode=0;
(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ユーティリティには、トランザクションを管理するためのいくつかの組込みコマンドが用意されています。次に、これらのコマンドの概要を示します。

- autocommit: 自動コミット機能を有効または無効にします。これは、setコマンドの属性としても設定できます。

- commit: 現行のトランザクションをコミットします。

- commitdurable: 現行のトランザクションをコミットし、データベース障害の場合にコミット済の作業をリカバリできるようにします。

- rollback: 現行のトランザクションをロールバックします。

- isolation - トランザクションの分離レベルを変更します。これは、setコマンドの属性としても設定できます。

- sqlquerytimeout: アプリケーションに戻されるまでのSQL文の実行待機時間(秒)を指定します。これは、setコマンドの属性としても設定できます。

デフォルトでは、ttIsqlを起動すると、SQLスクリプト内でも自動コミット機能が有効になります。このモードでは、データベースに対するすべてのSQL操作が自動的にコミットされます。自動コミットが有効な場合、自動コミットは、DDLCommitBehavior接続属性の設定、およびDDLを実行するユーザーに依存します。詳細は、「自動コミットとDDLCommitBehaviorの間の関係」を参照してください。

自動コミット機能を無効にするには、引数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-2013, 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=E:\ds\MY_DSN;
DRIVER=E:\WINNT\System32\TTdv1122.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.

準備済およびパラメータ化済のSQL文の処理

TimesTenアプリケーションでは、SQL文を1回のみ準備してそれを複数回実行する方が、実行のたびに文を繰り返し準備するより効率的です。ttIsqlには、準備済のSQL文を使用するための一連の組込みコマンドが用意されています。次に、これらのコマンドの概要を示します。

- prepare: SQL文を準備します。SQLPrepare ODBCコールに対応します。

- exec - 事前に準備済の文を実行します。SQLExecute ODBCコールに対応します。

- execandfetch: 事前に準備済の文を実行し、すべての結果行をフェッチします。1つ以上のSQLFetchコールの前に実行されるSQLExecuteコールに対応します。

- fetchall - 以前に実行した文のすべての結果行をフェッチします。1つ以上のSQLFetchコールに対応します。

- fetchone - 以前に実行した文の1行のみをフェッチします。1つのみのSQLFetchコールに対応します。

- close - 結果セットが生成された以前に実行済の文に対する結果セットのカーソルをクローズします。SQL_CLOSEオプションが指定されたSQLFreeStmtコールに対応します。

- free: 事前に準備済の文をクローズします。SQL_DROPオプションが指定されたSQLFreeStmtコールに対応します。

- describe - 入力パラメータおよび結果列を含む準備済の文を表示します。

ttIsqlユーティリティの準備済の文コマンドは、SQL文のパラメータ・マーカーも処理します。準備済のSQL文にパラメータ・マーカーが含まれている場合は、ttIsqlの実行時に、文の各パラメータに値を入力するように自動的に求められます。

次の例では、ttIsqlユーティリティの準備済の文コマンドを使用して、NUMBERおよびCHAR列を含む表のINSERT文を準備します。文が準備された後、文の2つのパラメータに対してそれぞれ異なる値を使用して2回実行されます。また、ttIsqlユーティリティのtimingコマンドを使用して、各コマンドに関連付けられている主要ODBC関数コールの実行に必要な経過時間を表示します。

Command> connect "DSN=MY_DSN";
Connection successful: DSN=MY_DSN;DataStore=E:\ds\MY_DSN;DRIVER=
E:\WINNT\System32\TTdv1122.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.
Command>

前述の例では、準備する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=E:\ds\MY_DSN;
DRIVER=E:\WINNT\Sys tem32\TTdv1122.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>

注意:
PL/SQLホスト変数を指定したttIsqlの使用方法については、『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』のTimesTenデータベースでのPL/SQLに関する概要の説明を参照してください。

変数の使用、宣言、構成方法

次の項では、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を指定できます)。

TYPE TypeName IS TABLE OF DataType(<precision>) INDEX BY BINARY_INTEGER;

変数がNUMBERの配列として宣言された場合、NUMBER、INTEGER、FLOATまたはDOUBLE PRECISIONのデータ型のPL/SQL変数にバインドすることが可能です。これを行うには、次の適切な宣言を行います。

TYPE TypeName IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
TYPE TypeName IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;
TYPE TypeName IS TABLE OF FLOAT INDEX BY BINARY_INTEGER;
TYPE TypeName 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('PLSQL');

PARAMNAME, PARAMVALUE
< PLSQL, 1 >
1 row found.

Command> IF :paramvalue = 1 THEN "e:PLSQL is enabled";
PLSQL is enabled
Command> IF NOT  :paramvalue = 1 THEN "e:PLSQL is not 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ブロックの作成および実行

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からのデータの受渡し

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コマンド構成を使用した条件制御

IF-THEN-ELSEコマンド構成を使用すると、ttIsqlセッションに条件ブランチ・ロジックを実装できます。IFコマンドによって条件がテストされ、THEN句内またはオプションのELSE句内のコマンドを実行するかが決定されます。SQL文、SQLスクリプト、PL/SQLブロックまたはTimesTenユーティリティのコマンドを実行できます。

注意:
IF-THEN-ELSE構成の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttIsqlに関する項を参照してください。

次の例では、PL/SQLが有効であるかを確認するバインド変数を作成およびテストします。これでは、autovariablesコマンドを使用し、ttConfigurationに対するコールの結果からバインド変数が作成されます。この値はparamvalue変数をテストすることによってIF-THEN-ELSE条件内でテストできます。

注意:
autovariablesコマンドの詳細は、「取得した列のバインド変数の自動作成」を参照してください。

Command> SET AUTOVARIABLES ON;
Command> CALL TTCONFIGURATION('PLSQL');
PARAMNAME, PARAMVALUE
< PLSQL, 1 >
1 row found.
Command> IF :paramvalue = 1 THEN "e:PLSQL is enabled"
> ELSE "e:PLSQL is not enabled";
PLSQL 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からTimesTen表へのデータのロード

結果を含めるためのキャッシュ・グリッド、キャッシュ・グループおよびキャッシュ表を作成しないで、バックエンドOracle DatabaseからのSQL問合せの結果をTimesTenの単一表にロードできます。TimesTenでは、Oracle Databaseでユーザーが指定したSELECT文を実行し、その結果セットをTimesTenの表にロードするツールが提供されます。

次は、このタスクを実行するために行う主要な手順です。

1. 適切な列とデータ型を備えた表をTimesTenに作成します。

2. Oracle Databaseで実行されて目的の結果セットを生成するSELECT文を指定します。

3. 結果セットを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の表名と同じである必要はありません。この表は主キーを必要としません。表がすでに存在している場合は、警告が発行され、取得された行が表に追加されます。

- オプションで、表に結果セットをロードする際に並行して使用されるパラレル・スレッドの数。このデフォルトは4です。

- 必要な行を取得するために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表にロードできるため、次の制限事項が適用されます。

- システム表、ディクショナリ表、一時表、ビューのディテール表、マテリアライズド・ビュー表、マテリアライズド・ビュー・ログ表、またはキャッシュ・グループ内にすでにある表にはロードできません。また、表名にシノニムは使用できません。

- 外部キー制約の参照表(子表)である既存の表に結果セットをロードする場合、その制約は検証されません。その結果、親行を失っている行がロードされることがあります。そのかわり、表がロードされた後ですべての外部キーを確認する必要があります。

次の項では、個々の方法の詳細について説明します。

- ttIsqlを使用した表の作成およびSQL問合せ結果のロード

- TimesTen組込みプロシージャを使用した表の推奨およびSQL問合せ結果のロード

ttIsqlを使用した表の作成およびSQL問合せ結果のロード

ttIsqlユーティリティは、createandloadfromoraqueryコマンドを提供します。これは、表名、パラレル・スレッドの数、および入力パラメータとしてOracle Databaseで実行できるSELECT文を取得します。これらのパラメータで、TimesTenは次のことを実行します。

1. SQL問合せを評価し、適切な表を作成します(まだ作成されていない場合)。そのとき、この表は提供された表名を持ち、列名はSQL問合せで指定された名前を使用し、結果データの取得元のOracle Database表と同じ(またはマップされた)データ型を持ちます。

2. 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=cachedb1_1122;UID=oratt;PWD=timesten;OraclePWD=oracle"

Copyright (c) 1996-2013, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql
connect -connstr "DSN=mydb;UID=oratt;PWD=timesten;OraclePWD=oracle";
Connection successful: DSN=mydb;UID=oratt;
DataStore=/timesten/install/info/DemoDataStore/mydb;DatabaseCharacterSet=US7ASCII;
ConnectionCharacterSet=US7ASCII;DRIVER=/timesten/install/lib/libtten.so;
PermSize=40;TempSize=32;TypeMode=0;OracleNetServiceName=inst1;

(Default setting AutoCommit=1)
Command> createandloadfromoraquery employees 2 SELECT * FROM hr.employees;
Mapping query to this table:
CREATE TABLE "ORATT"."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 rows loaded from oracle.

DESCRIBEコマンドを実行して、新しい表を表示します。

注意:
この例では表の所有者が指定されていないため、デフォルトで現行のユーザーになります。この例では、現行のユーザーはorattです。

Command> DESCRIBE employees;

Table ORATT.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にoratt.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 "ORATT"."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 rows loaded from oracle.

そして、次のcreateandloadfromoraqueryは、idが200より大きいすべての従業員を取得し、結果セットはTimesTenの既存の表に追加されます。警告によって、表がすでに存在していて、6行がこの表に追加されたことが伝えられます。

Command> createandloadfromoraquery emp 4 SELECT * FROM hr.employees
WHERE employee_id > 200;
Warning  2207: Table ORATT.EMP already exists
6 rows loaded from oracle.

パラレル・ロード処理は実行時間が長くなる場合があるため、処理を取り消す必要がある場合があります。パラレル・ロード処理の取消し方法の詳細は、「パラレル・ロード処理の取消し」を参照してください。

TimesTen組込みプロシージャを使用した表の推奨とSQL問合せ結果のロード

createandloadfromoraqueryコマンドが、TimesTen表を作成しOracle Databaseからの結果セットをこの表にロードするためのすべてのタスクを自動的に実行する一方で、次の2つの組込みプロシージャは同じ機能を次の2つの手順に分離します。

1. ttTableSchemaFromOraQueryGet組込みプロシージャは、SQL問合せを評価し、実行を選択できるCREATE TABLE SQL文を生成します。この文を実行するには、Oracle Databaseで問合せを実行するために必要なすべての権限をユーザーが持つ必要があります。これにより、実行なしで表構造を表示することができます。ただし、推奨されたCREATE TABLE文を自分で実行する必要があります。

2. ttLoadFromOracle組込みプロシージャは、バックエンドOracle DatabaseでSQL問合せを実行し、次に結果セットをTimesTen表にロードします。これは、結果をロードするTimesTen表名、必要な行を取得するためのOracle Database SQL SELECT文、および表に結果セットをロードする際に並行して使用するパラレル・スレッドの数を必要とします。
コールは、ロードされる行数を示す単一の数を返します。後続のコールは、取得された行を表に追加します。

注意:
構文、要件、制限および必要な権限の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttTableSchemaFromOraQueryGet」および「ttLoadFromOracle」を参照してください。

次の例は、DSN、ユーザー名、このユーザーのTimesTenでのパスワード、Oracle Databaseでの同じ名前のユーザーのパスワード、およびOracle DatabaseインスタンスのOracleNetServiceNameを指定して接続します。次に、ttTableSchemaFromOraQueryGet組込みプロシージャをコールして、SELECT文を評価し、employees表用に推奨されたCREATE TABLE文を返します。最後に、この例では、ttLoadFromOracle組込みプロシージャをコールして、Oracle Databaseからの結果セットをemployees表にロードします。ロードは、4つのスレッドによりパラレルに実行されます(デフォルト)。

注意:
autocommitがoffに設定されている場合、表のロード後に、ユーザーは手動でコミットまたはロールバックを行う必要があります。

$ ttisql "DSN=mydb;uid=oratt;pwd=timesten;
OraclePwd=oracle;OracleNetServiceName=inst1"
Copyright (c) 1996-2013, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.
connect "DSN=mydb;uid=oratt;pwd=timesten;
OraclePwd=oracle;OracleNetServiceName=inst1";
Connection successful: DSN=mydb;UID=oratt;
DataStore=/timesten/install/info/DemoDataStore/mydb;
DatabaseCharacterSet=US7ASCII;ConnectionCharacterSet=US7ASCII;
DRIVER=/timesten/install/lib/libtten.so;PermSize=40;TempSize=32;
TypeMode=0;OracleNetServiceName=inst1;
(Default setting AutoCommit=1)

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> CALL ttLoadFromOracle ('HR','EMPLOYEES','SELECT * FROM HR.EMPLOYEES');
< 107 >
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 ('oratt', 'employees', 'select * from oratt.employees');
< CREATE TABLE "ORATT"."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関数を使用して、またはttIsqlユーティリティで[Ctrl]キーを押したまま[C]キーを押すことによって、パラレル・ロード処理を実行しているすべてのスレッドを取り消して、完全に停止できます。詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』のサポートされているODBC関数に関する説明およびこのマニュアルの「ODBC関数の取消し」を参照してください。

パラレル・ロード処理は定期的にコミットされるため、成功した処理はロールバックされません。cancelコマンドを発行すると、次の時点でTimesTenは処理を取り消します。

- 挿入スレッドが生成される前。

- 挿入バッチのコミット後(256行ごと)。

- メイン・スレッドがOracle Databaseからのフェッチを完了した後。

取り消したパラレル・ロード処理を再試行するには、重複行を避けるためにTimesTenデータベースから前回挿入した行を削除します。

問合せオプティマイザ計画の参照および変更

次の項では、問合せオプティマイザ計画、SQLコマンド・キャッシュ内のコマンド、またはSQLコマンド・キャッシュ内のコマンドに関する問合せ計画を表示する方法について説明します。

- showplanコマンドの使用

- SQLコマンド・キャッシュからのコマンドおよび実行計画の表示

showplanコマンドの使用

組込みshowplanコマンドを使用すると、TimesTen Data Managerで問合せの実行に使用される問合せオプティマイザ計画が表示されます。また、ttIsqlには、この問合せオプティマイザ計画を変更するための組込み問合せオプティマイザ・ヒント・コマンドが用意されています。showplanコマンドと、次に示すttIsqlコマンドを組み合せて使用すると、最適な実行計画を設計できます。TimesTen問合せオプティマイザの詳細は、「TimesTen問合せオプティマイザ」を参照してください。

- optprofile - 現行のオプティマイザ・ヒントの設定および結合順序を表示します。

- setjoinorder - 結合順序を設定します。

- setuseindex - 索引ヒントを設定します。

- tryhash - ハッシュ索引の使用を有効または無効にします。

- trymergejoin: マージ結合を有効または無効にします。

- trynestedloopjoin - ネステッド・ループ結合を有効または無効にします。

- tryserial - シリアル・スキャンを有効または無効にします。

- trytmphash - 一時ハッシュ索引の使用を有効または無効にします。

- trytmptable - 中間結果表の使用を有効または無効にします。

- trytmprange: 一時範囲索引の使用を有効または無効にします。

- tryrange: 範囲索引の使用を有効または無効にします。

- tryrowid - ROWIDスキャンの使用を有効または無効にします。

- trytbllocks: 表ロックの使用を有効または無効にします。

- unsetjoinorder - 結合順序を消去します。

- unsetuseindex - 索引ヒントを消去します。

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の組込み問合せオプティマイザ・ヒント・コマンドと組み合せて使用すると、アプリケーション要件を満たすために使用する実行計画を迅速に決定できます。

SQLコマンド・キャッシュからのコマンドおよび実行計画の表示

次の項では、コマンドおよびその実行計画の表示方法について説明します。

- SQLコマンド・キャッシュに格納されたコマンドの表示

- SQLコマンド・キャッシュでの文に関する問合せ計画の表示

SQLコマンド・キャッシュに格納されたコマンドの表示

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>で問合せテキストがフィルタ処理されます。

SQLコマンド・キャッシュでの文に関する問合せ計画の表示

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

ODBC関数の管理

ttIsqlのODBC関数では、次の操作を実行できます。

- ODBC関数の取消し

- timing ODBC関数コール

ODBC関数の取消し

[Ctrl]キーを押しながら[C]キーを押すと、ttIsqlコマンドは実行中のODBC関数の取消しを試行します。

timing 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=E:\ds\MY_DSN;
DRIVER=E:\WINNT\System32\ TTdv1122.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を使用したエラーのリカバリ

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

7 トランザクション管理

TimesTenでは、データへのACID(Atomic: 原子性、Consistent: 一貫性、Isolated: 独立性、Durable: 永続性)アクセスを提供するトランザクションがサポートされています。次の項では、トランザクション機能を構成する方法について説明します。

- トランザクションの概要

- トランザクションの暗黙的なコミット動作

- ACIDセマンティクスの確認

- 分離およびロックによる並行性制御

- チェックポイント処理

- トランザクションのロギング

- トランザクションの再要求操作

- チェックポイントおよびトランザクション・ログ・ファイルを使用したリカバリ

トランザクションの概要

TimesTenデータベースに対するすべての処理は、アプリケーション・データへの変更やアクセスを行わない場合でも、トランザクション内で実行します。処理を実行する時点で未処理トランザクションが存在しない場合は、アプリケーションのかわりにトランザクションが自動的に開始します。トランザクションは、明示的または暗黙的なコミットやロールバックによって完了します。完了後は、ロックやカーソルなど、トランザクションによって取得または開かれたリソースは解放されます。

トランザクションをコミットまたはロールバックするには、次のSQL文を使用します。

- SQL COMMIT文は、現行のトランザクションをコミットします。トランザクションで行った更新は、同時実行トランザクションで有効になります。

- SQL ROLLBACK文は、現行のトランザクションをロールバックします。トランザクションで行ったすべての更新は、元に戻されます。

注意:
COMMITおよびROLLBACK文の構文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のSQL文に関する説明を参照してください。

読取り専用トランザクションにコミットは必要ありません。書込み処理を実行するときは、ロックを解除するためにトランザクションを完了します。可能な場合は、書込みトランザクションの時間を短くしてください。長時間実行トランザクションは、ロックが保持される時間が長くなり、同時実行トランザクションがブロックされるため、同時実行性およびスループットが低下することがあります。また、長時間実行トランザクションによって、トランザクション・ログ・ファイルがパージされずに、ディスクに蓄積されることがあります。

1つの接続で許可される未処理トランザクションは1つのみです。また、オープン状態のトランザクションが存在する場合、接続は明示的に閉じることはできません。

トランザクションの暗黙的なコミット動作

次の項では、アプリケーションで暗黙的なコミット動作が有効か、またはアプリケーションでDML文またはDDL文の暗黙的なコミット動作が必要かを構成する方法を説明します。

- トランザクションの自動コミット動作

- TimesTenのDDLコミット動作

- 自動コミットおよびDDLCommitBehaviorの関係

トランザクションの自動コミット動作

自動コミットでは、DML文またはDDL文の後に暗黙的なコミットを発行するかどうかを構成します。デフォルトでは、ODBCおよびJDBCの仕様に従って、自動コミットは有効です。

自動コミットが有効になっている場合、次の動作が実行されます

- 暗黙的なコミットは、文が正常に実行された直後に発行されます。

- 暗黙的なロールバックは、主キー違反など、文の実行が失敗した直後に発行されます。

- 文によってカーソルを開く結果セットが生成された場合、そのカーソルおよびトランザクション内の他のオープン・カーソルを明示的に閉じるまで、自動コミットは発行されません。カーソルが開いている状態で文を実行した場合、すべてのカーソルを閉じるまでその文はコミットされません。
結果セットのすべての行をフェッチしても、カーソルは自動的に閉じません。結果セットの処理後、コミット読取り分離レベルを使用している場合はカーソルを明示的に閉じる必要があり、シリアライズ可能分離レベルを使用している場合はトランザクションを明示的にコミットまたはロールバックする必要があります。

注意:
永続コミットおよび自動コミットが有効でも、障害が発生した場合またはカーソルをクローズする前にアプリケーションが終了した場合は、作業内容が失われることがあります。

- 自動コミットが有効になっている場合に、ODBCまたはJDBCのバッチ処理を使用して、1回のコールで複数行に対してINSERT、UPDATEまたはDELETEを実行すると、コミットはバッチ処理全体が終了してから実行されます。バッチ処理中にエラーが発生した場合は、正常に変更された行がこのトランザクション内でコミットされます。特定の行の問題が原因でエラーが発生した場合は、エラーが発生した行の前の行で、正しく変更された行のみがこのトランザクション内でコミットされます。ODBC SQLParamOptions関数のpirowパラメータには、バッチで問題が発生した行の番号が含まれます。

各文の後にコミットを暗黙的に行うと、パフォーマンス・コストが高くなり、煩わしくなる可能性があります。TimesTenでは、すべてのコミットを意図的に行うようにするため、自動コミットを無効にすることをお薦めします。自動コミットを無効にすると、すべての文の後に暗黙的なコミットを実行することはないため、トランザクションの境界を制御したり、1つのトランザクションで複数の文を実行したり、パフォーマンスを向上することができます。

自動コミットを無効にすると、次のいずれかの処理を実行した後に、コミットまたはロールバックでトランザクションを明示的に完了する必要があります。

- トランザクションで実行することになっていた作業をすべて完了した後。

- トランザクション一貫性(ブロッキング)チェックポイント・リクエストを発行した後。

- 問合せオプティマイザが使用する列統計および表統計を更新した後。

- ttLockWaitなどのプロシージャで指定した新しい設定を有効にするために、結果セットを生成しないTimesTen組込みプロシージャをコールした後。

自動コミット設定を変更する前に、データベース接続を確立する必要があります。自動コミットを無効にするには、次のいずれかの処理をします。

- ODBCベースのアプリケーションでは、SQL_AUTOCOMMIT_OFFを使用してSQLSetConnectOption関数を実行します。

- JDBCアプリケーションでは、Connection.setAutoCommit(false)メソッドを使用します。

- ttIsqlの実行中に、autocommit 0コマンドを発行します。

TimesTenのDDLコミット動作

通常、TimesTenデータベースでは、DDL文は現在のトランザクションの一部として実行され、トランザクションの残りの部分とともにコミットまたはロールバックされます。ただし、Oracle Databaseのデフォルトの動作では、DDL文の前後に暗黙的なCOMMITを発行します。

DDLCommitBehavior接続属性を使用して次のいずれかの動作を構成できます。

- 0 - Oracle Databaseの動作。各DDL文の実行前に暗黙的なトランザクション・コミット、実行後に永続コミットを実行します。これがデフォルトです。

- 1 - TimesTenの従来の動作。DDL文を実行しても、暗黙的なトランザクション・コミットはトリガーされません。

DDL文には次のものがあります。

- 表、ビュー、ユーザー、プロシージャ、索引などのデータベース・オブジェクトに対するCREATE、ALTERおよびDROP文。

- TRUNCATE

- GRANTおよびREVOKE

DDLCommitBehavior=0を設定すると次のような結果になります。

- DDLによる変更をロールバックできません。

- グローバル一時表がON COMMIT PRESERVE ROWS句を使用して作成された場合を除いて、DDL文によってグローバル一時表からレコードが削除されます。

- 作成した表はCREATE TABLE . . .AS SELECT文を使用した場合、すぐに表示されます。

- TRUNCATE文が自動的にコミットされます。ただし、親表および子表は別のトランザクションで切り捨てる必要があり、その際には、子表が先に取り捨てられます。子表が空でなければ、親表は切り捨てられません。子表および親表の切捨てを同じトランザクションで実行できるのはDDLCommitBehaviorを1に設定している場合のみです。

詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のDDLCommitBehaviorについての説明を参照してください。

自動コミットおよびDDLCommitBehaviorの関係

自動コミットおよびDDLCommitBehaviorでは、どのような場合にSQL文に対する暗黙的なコミットを実行するかを設定します。

- 自動コミットはDDL文およびDML文の両方に適用されます。DDL文の暗黙的なコミットを有効にすると、両方のオプションで重複が発生します。自動コミットが有効でDDLCommitBehaviorが無効な場合、自動コミットはDDL文の後にのみ実行されます。ただし、自動コミットおよびDDLCommitBehaviorの両方が有効な場合、暗黙的なコミットはDDL文の前後に実行されます。

- DDLCommitBehaviorを有効にするには、DSN属性DDLCommitBehaviorを設定します。自動コミットを有効または無効にするには、アプリケーションでODBC関数またはJDBCメソッドを実行します。

表7-1では、いずれかのオプションをもう一方のオプションと組み合せて有効または無効にした場合に実行される動作を示しています。

表7-1: 自動コミットとDDLCommitBehaviorの関係

Autocommit

DDLCommitBehavior

関係

ON

ON

オープン・カーソルがない場合、すべての文が自動コミットされます。DDL文の実行前後に暗黙的にコミットされます。

OFF

ON

お薦めする設定です。DDL文の実行前後に暗黙的にコミットされます。他のすべての文には明示的なコミットが必要です。

ON

OFF

オープン・カーソルがない場合、すべての文が実行後に自動コミットされます。コミットはDDLの処理前ではなく処理後に発行されます。

OFF

OFF

DDL文を含むすべての文に明示的なコミットが必要です。

ACIDセマンティクスの確認

リレーショナル・データベースとして、TimesTenはACIDに準拠しています。

- 原子性: すべてのTimesTenトランザクションは原子性であり、1つのトランザクションのすべてのデータベース操作が実行されるか、1つも実行されないかのいずれかです。

- 一貫性: トランザクションは一貫性を保持したままデータベースの状態を変更できます。

- 独立性: トランザクションは分離されています。TimesTenにはコミット読取りとシリアライズ可能の2つの独立性レベルがあり、これらと行レベルロックを合わせてマルチユーザー並行性制御が提供されます。

- 永続性: トランザクションを一度コミットすると、コミットされた状態が保たれます。

次の項では、TimesTenがトランザクションのACIDセマンティクスを確認する方法について説明します。

- トランザクションのアトミック性、一貫性および分離

- トランザクションの一貫性と永続性

トランザクションのアトミック性、一貫性および分離

トランザクションでデータベースのデータが変更されるため、ロックおよびトランザクション・ログによってACIDセマンティクスが次のように保証されます。

- ロック: TimesTenでは、トランザクションで書込みを行うデータ項目と、トランザクション分離レベルに応じて、読取りを行うデータ項目に対してロックを取得します。「分離およびロックによる並行性制御」を参照してください。

- トランザクションのロギング: すべてのTimesTenトランザクションはアトミックです。トランザクションの結果は、データベースに完全に適用されるか、完全に適用されないかのいずれかになります。データベースへの変更はトランザクション・ログに記録されます。原子性は、トランザクションがロールバックされた場合、トランザクション・ログを使用してその結果を元に戻すことで実現されます。ロールバックは、アプリケーションが明示的に実行したり、障害が発生した時点でトランザクションがコミットされていなかったために、データベースのリカバリ中に実行される場合もあります。「トランザクションのロギング」を参照してください。

次の表に、TimesTenでのロックおよびトランザクション・ログの使用方法を示します。

条件

結果

トランザクションが正常に終了した(コミット済)。

- DurableCommits属性が有効な場合、トランザクション・ログがディスクに書き込まれます。詳細はトランザクションの一貫性と永続性に関する説明を参照してください。

- トランザクションのために設定されていたロックが解除され、対応するデータが他のトランザクションで読取りおよび変更できるようになります。

- トランザクション内のすべてのオープン・カーソルは自動的に閉じます。

トランザクションがロールバックされた。

- トランザクション・ログを使用して、トランザクションの結果が元に戻され、データ項目がトランザクション処理を開始する前の状態にリストアされます。

- トランザクションのために設定されていたロックが解除されます。

- トランザクション内のすべてのオープン・カーソルは自動的に閉じます。

システムで障害が発生した(データは未コミット)。

- 最初の接続で、TimesTenは、最新のチェックポイント・イメージを読み取り、トランザクション・ログを適用してトランザクションに一貫性がある最新の状態にデータベースをリストアするデータベースのリカバリを自動的に実行します。詳細は、「チェックポイント処理」を参照してください。

アプリケーションでエラーが発生した。

- すべての未処理トランザクションはロールバックされます。

TimesTenでは、チェックポイントが基本的に含まれていない一時データベースがサポートされています。ただし、トランザクションをロールバックできるようにトランザクション・ログが用意されています。このようなデータベースに対してリカバリが実行されることはありません。一時データベースは、データベースまたはアプリケーションがシャットダウンまたは失敗すると破棄されます。一時データベースの詳細は、「データベースの概要」の説明を参照してください。

トランザクションの一貫性と永続性

TimesTen Data Managerは、チェックポイント処理およびトランザクション・ロギングの組合せによる一貫性と永続性を備えています。

- チェックポイント処理では、現在のインメモリー・データベース・イメージがディスク上のチェックポイント・ファイルに書き込まれ、チェックポイント処理時点でコミットされているすべてのトランザクションが一貫性を備え、永続的になります。

- すべてのトランザクションは、インメモリー・トランザクション・ログ・バッファに記録され、次のいずれかの方法でディスクに書き込まれます。

- 永続(同期)コミットによる永続性の保証

- 非永続(非同期)コミットによる永続性の遅延

注意:
チェックポイント処理およびロギングの詳細は、「チェックポイント処理」および「トランザクションのロギング」を参照してください。

分離およびロックによる並行性制御

TimesTenのトランザクションでは、ANSIシリアライズ可能分離レベルおよびANSIコミット読取り分離レベルがサポートされています。ANSIシリアライズ可能分離レベルは、最も厳密なトランザクションの分離レベルです。ANSIコミット読取りに設定すると、同時実行性をより高くできます。デフォルトはコミット読取りで、これはほとんどのアプリケーションに適した分離レベルです。

次の項では、トランザクションの分離レベルおよびロック・レベルについて説明します。

- トランザクションの分離レベル

- ロックの粒度

トランザクションの分離レベル

トランザクションに独立性があることで、アクティブな各トランザクションは、他のアクティブなトランザクションがシステム内に存在していない場合と同様に動作できます。分離レベルでは、読取り処理の実行時に行レベル・ロックを設定するかどうかを決定します。表を更新するために文が発行されると、更新トランザクションが完了し、ロックが解除されるまで、他のトランザクションが同じデータを変更しないようにロックが設定されます。

Isolation接続属性では、接続の分離レベルを設定します。データベース・レベルのロックを使用している場合は、トランザクションを同時実行できないため、分離レベルによる影響はありません。分離レベルをトランザクション中に変更することはできません。

TimesTenでは、次の2つのトランザクション分離レベルがサポートされています。

- ANSIコミット読取り分離: コミット読取り分離レベルは、ほとんどのアプリケーションに適した処理モードで、デフォルト・モードでもあります。これによって、データを読み取っているトランザクションを、同じデータを更新している他のトランザクションと同時に実行できるようになります。TimesTenでは、データ項目の複数のバージョンが作成されるため、シリアライズ可能ではない読取りおよび書込み処理をパラレルで実行できます。
同じデータの読取りおよび書込みが行われる場合も、読取り処理により書込み処理がブロックされることも、書込み処理により読取り処理がブロックされることもありません。読取り処理では、スキャンされた行にロックを設定しません。書込み処理では、トランザクションがコミットまたはロールバックされるまで、ロックを設定します。読取りユーザーはコミットされたデータのコピーを共有し、書取りユーザーは非コミット・バージョンを保有します。したがって、実行中のトランザクションによって更新処理が行われている項目を別のトランザクションで読み取ると、その項目のコミットされたバージョンが表示されます。処理中のトランザクションの非コミット・バージョンは表示されません。

コミット読取り分離レベルでは、トランザクション内の非リピータブル・リードまたはファントム行のため分離度が低下するかわりに、同時実行性が向上します。アプリケーションが同じトランザクション内で同じ問合せを何度も実行すると、別のトランザクションからの更新のコミットによって、読取り処理の結果が別のものになることがあります。ファントム行は、トランザクション時に読取りのロックが早く解放されたため、同じトランザクション内に2つの異なる読取り形式で表示されます。

コミット読取り分離レベルを設定するには(このデフォルト設定が変更されている場合)、次のいずれかの処理を行います。

- ODBCアプリケーションで、SQL_TXN_ISOLATIONフラグをSQL_TXN_READ_COMMITTEDに設定し、ODBC関数SQLSetConnectOptionを実行します。

- 接続文字列をisolation=1にして接続します。

- ttIsqlを使用している場合は、ISOLATION 1またはISOLATION READ_COMMITTEDを実行します。

- ANSIシリアライズ可能分離レベル: トランザクション内で読取り処理または書込み処理によって設定されたすべてのロックは、トランザクションがコミットまたはロールバックされるまでそのままになります。読取り処理によって書込み処理がブロックされ、書込み処理によって読取り処理がブロックされます。そのため、あるトランザクションで読み取られた行は、そのトランザクションが終了するまで、別のトランザクションから更新または削除することはできません。同様に、あるトランザクションによって挿入、更新または削除された行は、そのトランザクションが終了するまで、別のトランザクションからはアクセスできません。
シリアライズ可能分離レベルでは、同時実行性が低下するかわりに、リピータブル・リードが実現し、分離度が向上します。同じ問合せを同じトランザクション内で複数回実行するトランザクションは、毎回同じ結果セットが戻されることが保証されます。他のトランザクションで、戻された行を更新したり、削除したり、問合せ条件を満たす新しい行に対して挿入を実行することもできません。

分離レベルをシリアライズ可能に設定するには、次のいずれかの処理を行います。

- ODBCアプリケーションで、SQL_TXN_ISOLATIONフラグをSQL_TXN_SERIALIZABLEに設定し、ODBC関数SQLSetConnectOptionを実行します。

- 接続文字列をisolation=0にして接続します。

- ttIsqlを使用している場合は、isolation 0またはisolation serializableを実行します。

マテリアライズド・ビューを常に一貫性がある状態に保つために、すべてのビュー・メンテナンス処理は、トランザクションがコミット読取り分離レベルの場合も、シリアライズ可能分離レベルで実行されます。これは、トランザクションで、ビュー・メンテナンス時に読み取られるすべてのデータ項目に読取りロックを設定することを意味します。ただし、読取りロックは、トランザクションが終了するまで保持されるのではなく、ビュー・メンテナンス処理をトリガーしたINSERT、UPDATE、CREATE VIEW文が終了すると解除されます。

注意:
ttXactAdminユーティリティで生成されるレポートには、すべての未処理トランザクションに関するロックの保持と待機が表示されます。このレポートは、処理がブロックされたロックの競合問題、またはロック・タイムアウトおよびデッドロックなどのエラーが発生した場合、トラブルシューティングに使用できます。また、特定のトランザクションをロールバックする場合にも使用できます。

ロックの粒度

TimesTenでは、行レベル・ロック、表レベル・ロックおよびデータベース・レベル・ロックがサポートされています。

注意:
異なるロック・レベルの異なる接続が同時に存在することは可能ですが、データベース・レベルのロックを使用する接続が1つでもある場合は、同時実行性が低下します。パフォーマンスの詳細は、「最適なロック方法の選択」を参照してください。

- 行レベル・ロック: 通常、トランザクションはアクセスする各行にロックを設定します。行レベル・ロックは、同時実行性制御の粒度が最も細かくなるため、処理モードとしてお薦めします。同時実行トランザクションで、同じ表の異なる行を更新できます。ただし、行レベル・ロックには、データベースの一時メモリー領域にロック情報を保存するための領域が必要になります。
行レベル・ロックはデフォルトです。ただし、別のタイプのロックに変更されている場合で、行レベル・ロックを再度有効にする場合は、次のいずれかの処理を行います。

- LockLevelの接続属性を0に設定します。

- lockLevelパラメータをRowに設定してttLockLevel組込みプロシージャをコールします。このプロシージャは、次のトランザクション、およびこの接続でその後に実行されるすべてのトランザクションの行レベル・ロックとデータベース・レベル・ロックを変更します。

- ttOptSetFlagプロシージャを実行して、RowLockパラメータを1に設定すると、オプティマイザで行ロックの使用を選択できます。

注意:
詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の「LockLevel」、「ttLockLevel」および「ttOptSetFlag」を参照してください。

- 表レベル・ロック: 表レベル・ロックは、同時実行トランザクションで他の表にアクセスする場合や、トランザクションで特定の表のほとんどの行にアクセスする場合にお薦めします。表レベル・ロックでは、データベース・レベル・ロックに比べ、同時実行性が高くなります。行レベル・ロックでは、表レベル・ロックに比べ、同時実行性が高くなります。表レベル・ロックでは、一時メモリー領域にわずかな領域があれば、ロック情報を保存できます。
表レベル・ロックでは、次の場合に最大のパフォーマンスが得られます。

- 問合せで表の多数の行にアクセスする場合

- 表にアクセスする同時トランザクションの数が非常に少ない場合

- 一時領域が不十分で、大量の挿入または削除などの処理で設定する可能性がある行ロックをすべて格納できない場合

表レベル・ロックを有効にするには、ttOptSetFlagプロシージャを実行して、TblLockパラメータを1に設定すると、オプティマイザで行ロックの使用を選択できます。また、オプティマイザで行レベル・ロックの使用を選択しない場合は、RowLockを0に設定します。

表レベル・ロックと行レベル・ロックの両方が無効になっている場合、TimesTenではデフォルトで行レベル・ロックが設定されています。表レベル・ロックと行レベル・ロックの両方が有効になっている場合、TimesTenはパフォーマンスが高いと予想されるロック・スキームを選択します。表レベル・ロックはロック処理のオーバーヘッドが少ないため、行レベル・ロックよりも高いパフォーマンスが得られますが、オプティマイザでは多くの場合、同時実行性が高い行レベル・ロックが選択されます。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttOptSetFlag」を参照してください。

注意:
同じトランザクション内で複数のロックが取得されている場合、トランザクションが終了すると、ロックは順次解放されます。

- データベース・レベル・ロック: データベース・レベル・ロックは、すべてのトランザクションをシリアライズし、データベースの同時実行性を実質的に禁止します。トランザクションを開始すると、データベースに排他ロックが設定され、データベース内のアクティブなトランザクション数は常に1つになります。トランザクションが完了すると、ロックが解除されます。
データベース・レベル・ロックは、ロック処理のオーバーヘッドが少ないため、通常は行レベル・ロックより高いパフォーマンスが得られます。また、バルク・ロード処理など、単一のトランザクション・ストリームを実行する場合、行レベル・ロックに比べスループットが高くなります。ただし、このロックは、複数の同時トランザクションを実行することがないアプリケーションにのみ適用されます。データベース・レベル・ロックを設定すると、同時トランザクションが許可されないため、すべてのトランザクションがANSIシリアライズ可能分離レベルで効率的に実行されます。

データベース・レベル・ロックを有効にするには、次のいずれかの処理を行います。

- LockLevelの接続属性を1に設定します。

- lockLevelパラメータをDSに設定してttLockLevel組込みプロシージャをコールします。このプロシージャは、次のトランザクション、およびこの接続でその後に実行されるすべてのトランザクションの行レベル・ロックとデータベース・レベル・ロックを変更します。

ロック取得の待機時間の設定

LockWait接続属性を、文がロックの設定を待機する、この時間をすぎるとタイムアウトする最長時間に設定します。デフォルトは10秒です。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のLockWaitに関する説明を参照してください。

トランザクション内の文がロックを待機していて、ロック待機時間が過ぎた場合は、エラーが戻されます。エラーを受信した後、アプリケーションは文を再発行できます。

ロック・タイムアウトを検出するためのデータベースの管理サブデーモン・プロセスのスケジュールにより、ロック待機時間は正確ではありません。タイムアウトが0秒に設定されている場合はすぐにレポートされるため、不正確ではありません。ロック待機時間は、ブロッキング・チェックポイントには適用されません。

データベースの管理サブデーモン・プロセスでは、同時実行トランザクションの中にデッドロックがないか、2秒ごとにデータベースをチェックします。デッドロックが発生した場合、デッドロック・サイクルに入ったトランザクションのうちの1つにエラーが戻されます。デッドロックが発生したもう一方のトランザクションが実行できるようになるには、エラーを受け取ったトランザクションをロールバックする必要があります。

チェックポイント処理

チェックポイント処理では、データベースのインメモリー・イメージを、チェックポイント・ファイルと呼ばれるディスク・ファイルに保存します。デフォルトでは、TimesTenはバックグラウンドのチェックポイント処理を一定間隔で実行します。チェックポイント処理の実行時、データベースのサイズおよび最新のチェックポイント以降に行われたデータベースへの変更の回数に応じて、大量のI/Oアクティビティが発生し、実行時間が長くなる場合があります。

注意:
アプリケーションでプログラムによってチェックポイント処理を開始することもできます。詳細は、「チェックポイントの設定および管理」を参照してください。
一時データベースではチェックポイントは開始されません。一時データベースの詳細は、「データベースの永続性」を参照してください。

次の項では、チェックポイント処理およびその管理方法について説明します。

- チェックポイントの目的

- チェックポイント・ファイルの使用

- チェックポイントのタイプ

- チェックポイントの設定および管理

チェックポイントの目的

チェックポイント処理には、2つの主な目的があります。

- リカバリを開始できるデータベース・イメージをより最新の状態で提供するため、データベース・リカバリの所要時間を短縮します。

- トランザクション・ログの一部を将来のデータベースのリカバリ処理で不要にします(通常は、これで1つ以上のトランザクション・ログ・ファイルを削除できます)。

これらの2つの機能は、TimesTenアプリケーションにとって非常に重要です。リカバリ時間の短縮は、データベースのリカバリに必要なトランザクション・ログの量が、システム障害の発生後にアプリケーションで発生するダウンタイムに直接影響するため重要になります。不要なトランザクション・ログ・ファイルの削除は、新しいトランザクション・ログ・ファイルで使用可能なディスク領域を解放できるため重要になります。また、トランザクション・ログ・ファイルの数が減るため、データベースをメモリーにロードする所要時間が短縮されます。これらのファイルが削除されない場合、最終的に、トランザクション・ログ・ディレクトリのファイル・システムで使用可能なすべての領域がすべてこれらのファイルによって消費され、データベース処理が、ログ領域不足のため失敗することになります。

チェックポイント・ファイルの使用

TimesTenでは、データベースごとにdsname.ds0およびdsname.ds1の2つのチェックポイント・ファイルがあります(ここで、dsnameは、データベースのDSNで指定されるデータベース・パス名やファイル名の接頭辞です)。TimesTenは、チェックポイント処理中、どのチェックポイント・ファイルに一貫性のある最新のイメージが格納されているかを決定してから、データベースの次のインメモリーのイメージをもう1つのファイルに書き込みます。したがって、これらの2つのファイルには、最新の2つのデータベース・イメージが含まれることになります。

TimesTenでは、一貫性のある最新のチェックポイント・ファイルとトランザクション・ログを使用して、データベースをシャットダウン後またはシステム障害発生後の、トランザクションに一貫性のある最新の状態にリカバリします。この処理中にエラーが発生した場合、または新しい方のチェックポイント・イメージが不完全な場合は、もう一方のチェックポイント・ファイルを使用してリカバリが再度開始されます。

データベースが作成されると、dsname.res0、dsname.res1およびdsname.res2という名前の3つのトランザクション・ログ・ファイルがTimesTenによって作成されます。これらのファイルには、予約済トランザクション・ログ領域として機能する事前割当て済の領域が含まれています。予約済トランザクション・ログ領域によって、トランザクション・ログ・ファイルを保持するファイル・システムが一杯になった場合に、トランザクションのロギングを制限付きで継続できます。ファイル・システムが一杯になった場合は、トランザクションで新しいログ・レコードを書き込むことはできません。トランザクションがこのような書込みを行おうとすると、強制ロールバックが実行されます。

チェックポイントのタイプ

TimesTenでは、2つのタイプのデータベース・チェックポイント処理がサポートされています。

- ファジー・チェックポイント(非ブロッキング・チェックポイント)

- トランザクション一貫性チェックポイント

ファジー・チェックポイント(非ブロッキング・チェックポイント)

ファジー・チェックポイント(非ブロッキング・チェックポイント)では、チェックポイントの処理中にデータベースに対してトランザクションを実行できます。ファジー・チェックポイントでは、ロックをまったく取得しないので、他のデータベース・アクティビティへの影響は最小限になります。チェックポイントの処理中でもトランザクションによってデータベースが変更されるので、作成されるチェックポイント・ファイルにコミット・トランザクションと非コミット・トランザクションの両方が含まれてしまう場合があります。また、チェックポイント・イメージの別の部分では、別の時点のものが反映される可能性もあります。たとえば、ある部分は、あるトランザクションのコミット前に書き込まれ、別の部分は、コミット後に書き込まれる場合があります。ファジー・チェックポイントという用語は、データベース・イメージの状態があいまいであることに由来します。

ファジー・チェックポイント処理でチェックポイント・ファイルが生成された際にデータベースをリカバリするには、TimesTenでは、データベースをトランザクションに一貫性のある最新の状態にリカバリするために、一貫性がある最新のチェックポイント・ファイルとトランザクション・ログが必要になります。

トランザクション一貫性チェックポイント

トランザクション一貫性チェックポイント(ブロッキング・チェックポイントとも呼ばれる)では、チェックポイント処理の一部でデータベースに排他ロックが設定され、その間はデータベースへのアクセスがブロックされます。その結果得られるチェックポイント・イメージには、チェックポイント処理でデータベースを排他ロックしたときより前のすべてのコミット済トランザクションが含まれます。データベース・ロックが保持されている間はアクティブなトランザクションが許容されないため、実行中のトランザクションで行われた変更はチェックポイント・イメージに含まれません。

TimesTenでは、一貫性のある最新のチェックポイント・ファイルを使用して、データベースを最後のチェックポイント処理が正しく終了した時点の、トランザクションに一貫性のある最新の状態にリカバリします。トランザクション・ログ・ファイルを使用して、データベースをシャットダウン後またはシステム障害発生後の、トランザクションに一貫性のある最新の状態にリカバリします。

トランザクション一貫性チェックポイントをリクエストするには、アプリケーションでttCkptBlocking組込みプロシージャを使用します。実際のチェックポイント処理は、リクエストを行ったトランザクションがコミットまたはロールバックされてから実行されます。両方のチェックポイント・ファイルがすでに最新となっているデータベースに対してトランザクション一貫性チェックポイントをリクエストすると、そのリクエストは無視されます。

チェックポイントの設定および管理

TimesTenチェックポイントのデフォルト動作は次のとおりです。

- TimesTenでは、定期的なファジー・チェックポイント処理がバックグラウンドで実行されます。この動作は変更できます。詳細は、「バックグラウンドのチェックポイント処理の設定または無効化」を参照してください。

- TimesTenでは、データベースをメモリーからアンロードする直前に、データベースに対してトランザクション一貫性チェックポイント処理を実行します。「トランザクション一貫性チェックポイント」を参照してください。

次の接続属性および組込みプロシージャを使用して、チェックポイントを管理および監視できます。

- CkptFrequency属性

- CkptLogVolume属性

- CkptRate属性

- CkptReadThreads属性

- ttCkpt組込みプロシージャ

- ttCkptBlocking組込みプロシージャ

- ttCkptConfig組込みプロシージャ

- ttCkptHistory組込みプロシージャ

次の項では、チェックポイント処理の管理方法について説明します。

- プログラムによるチェックポイントの実行

- バックグラウンドのチェックポイント処理の構成または無効化

- チェックポイントの履歴およびステータスの表示

- チェックポイント処理速度の設定

- チェックポイント・ファイル読込みスレッド数の設定

プログラムによるチェックポイントの実行

デフォルトのTimesTenでは、定期的なファジー・チェックポイント処理がバックグラウンドで実行されます。このため、アプリケーションで手動チェックポイントを発行する必要はほとんどありません。ただし、手動チェックポイントを発行する必要がある場合は、ttCkpt組込みプロシージャをコールしてファジー・チェックポイントをリクエストするか、またはttCkptBlocking組込みプロシージャをコールしてトランザクション一貫性チェックポイントをリクエストできます。

バックグラウンドのチェックポイント処理の構成または無効化

属性または組込みプロシージャを使用すると、トランザクション・ログ・ファイルの特定の量のデータが含まれた時点でチェックポイント処理を実行するか、特定の頻度でチェックポイント処理を実行するかを構成できます。

TimesTenでチェックポイント処理を構成するには、次の処理を行います。

CkptFrequencyおよびCkptLogVolume接続属性を次のように構成します。

- CkptFrequency接続属性で、TimesTenがバックグラウンド・チェックポイント処理を実行する頻度(秒)を制御します。デフォルトは600秒です。バックグラウンドのチェックポイント処理をCkptLogVolume接続属性で制御する場合は、CkptFrequency接続属性を0に設定します。

- CkptLogVolume接続属性で、次回のバックグラウンド・チェックポイント処理までにトランザクション・ログ・ファイルに収集するデータ量(MB)を制御します。このデータ量を増やすと、チェックポイント処理の頻度を減らすことができます。デフォルトは0です。バックグラウンドのチェックポイント処理をCkptLogVolume接続属性で制御する場合は、CkptFrequency接続属性を0に設定します。

バックグラウンドのチェックポイント処理を無効にするには、CkptFrequencyおよびCkptLogVolume接続属性を0に設定します。

または、ttCkptConfig組込みプロシージャをコールしてバックグラウンド・チェックポイント処理を構成するか、無効化できます。ttCkptConfigで設定された値は、接続属性で設定された値より優先されます。

注意:
デフォルト値および使用方法の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のCkptFrequencyに関する説明、CkptLogVolumeに関する説明およびttCkptConfigに関する説明を参照してください。

チェックポイントの履歴およびステータスの表示

ttCkptHistory組込みプロシージャをコールして、過去8つのチェックポイント処理に関する情報を表示します。実行中のチェックポイント処理の進行状況は、Percent_Complete列で監視できます。

チェックポイント処理速度の設定

デフォルトでは、チェックポイント・データがディスクに書き込まれる速度に制限はありません。CkptRate属性またはttCkptConfig組込みプロシージャを使用して、バックグラウンドでチェックポイント・データがディスクに書き込まれる最大速度を設定できます。リカバリ時に行われるチェックポイント処理および最後のチェックポイント処理ではこの速度は保持されず、無制限になります。

注意:
これらの機能の使用の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のCkptRateに関する説明およびttCkptConfigに関する説明を参照してください。

速度を低く設定しすぎると、チェックポイント処理に過度の時間がかかり、次の問題が発生する場合があります。

- 不要なトランザクション・ログ・ファイルのパージが遅延します。

- バックアップ処理の開始が遅延します。

- リカバリ時間が増加します。

速度を選択する場合は、通常のチェックポイント処理で書き込まれるデータの量およびチェックポイント処理に通常かかる時間について考慮する必要があります。これらの情報は両方ともttCkptHistory組込みプロシージャを使用して入手できます。

実行中のチェックポイント処理の進行状況をttCkptHistory結果セットのPercent_Complete列で確認した結果、遅すぎると思われる場合は、ttCkptConfig組込みプロシージャをコールして、速度を上げることができます。ttCkptConfigをコールして速度を変更すると、新しい速度は即時に有効になり、実行中のチェックポイント処理に対しても反映されます。

チェックポイント処理速度を計算するには次の処理を行います。

1. ttCkptHistory組込みプロシージャをコールします。

2. 任意のチェックポイントに対して、終了時間から開始時間を引きます。

3. 書き込まれたバイト数をこの経過時間(秒)で割って1秒当たりのバイト数を取得します。

4. この数字を1024×1024で割って1秒当たりのMB数を取得します。

チェックポイント処理速度の設定時には、次のことを考慮する必要があります。

- 指定したチェックポイント処理速度は概算です。チェックポイント処理の実際の速度は、ハードウェア、システム・ロードなどの要因によって、指定した速度より遅くなる場合があります。

- 前述の方法ではチェックポイント処理速度が実際より低く計算されることがあります。これは、開始時間と終了時間の間に、チェックポイント・ファイルへの使用済ブロックの書込みのみでなく他のチェックポイント処理が含まれるためです。

- ttCkptHistoryコールのPercent_Completeフィールドに、チェックポイント処理が実際に完了する前に100%が表示される場合があります。Percent_Completeフィールドには、使用済ブロックの書込み状況のみが表示され、チェックポイント処理終了時の追加のブックキーピングは含まれていません。

- また、チェックポイント処理速度を調整する場合は、低速にするとチェックポイント処理により時間がかかり、チェックポイント処理を開始してから次に開始するまでの間の最短時間が事実上長くなるため、チェックポイント処理頻度も調整する必要があります。

チェックポイント・ファイル読込みスレッド数の設定

デフォルトでは、TimesTenはチェックポイント・ファイルを単一のスレッドでシリアルに読み込みます。CkptReadThreads接続属性を使用して、データベースをメモリーにロードするときTimesTenがチェックポイント・ファイルの読込みに使用するスレッドの数を設定します。

n個のスレッドを使用すると、TimesTenはチェックポイント・ファイルをサイズの等しいn個の部分に分割します。各スレッドが、ファイルの一部を同時にメモリーに読み込みます。すべてのスレッドがチェックポイント・ファイルの各部分を正常に読み込むと、TimesTenはデータベースの一貫性をチェックします。

注意:
詳細は、このマニュアルのCkptReadThreadsの設定に関する項と、『Oracle TimesTen In-Memory Databaseリファレンス』のCkptReadThreadsに関する項を参照してください。

トランザクションのロギング

TimesTenでは、すべての同時接続によって共有されるトランザクション・ログをデータベースごとに1つ作成します。トランザクション・ログ・レコードは、データベースの更新、コミットおよびロールバックごとに作成されます。ただし、読取り専用のトランザクションにトランザクション・ログ・レコードは生成されません。ログ・レコードはまず、データベースと同じ共有メモリー・セグメントに格納されているトランザクション・ログ・バッファに書き込まれます。その後、ログ・バッファの内容はディスク上の最新のトランザクション・ログ・ファイルにフラッシュされます。

トランザクション内で行ったすべての更新はトランザクション・ログを使用して追跡され、トランザクションがロールバックされると、それらの更新は元に戻すことができます。

トランザクション・ロギングによって、システム障害の発生後、最後のチェックポイント処理を実行した時点からコミットされたトランザクションを、チェックポイント・ファイルやトランザクション・ログからリカバリできます。ログ・バッファ内にあるコミットされた非永続トランザクションで、ディスクにフラッシュされていないものは、システム障害が発生すると失われる可能性があります。

次の項では、トランザクション・ログ・バッファおよびファイルの構成方法について説明します。

- トランザクション・ログのバッファおよびファイルの管理

- 蓄積されるトランザクション・ログ・ファイルの監視

トランザクション・ログのバッファおよびファイルの管理

次の項では、トランザクション・ログ・バッファおよびファイルの構成方法について説明します。

- トランザクション・ログ・バッファ: トランザクション・ログ・バッファはデータベースごとに1つあり、トランザクション・ログ・バッファのサイズはDSN属性LogBufMBを使用して構成できます。各トランザクション・ログ・バッファは複数のストランドを持つことができます。トランザクション・ログ・バッファのストランド数は、LogBufParallelism属性で構成します。

- トランザクション・ログ・ファイル: トランザクション・ログ・ファイルの最大サイズは、DSN属性LogFileSizeを使用して設定できます。トランザクション・ログ・ファイルは、LogDir属性で別の場所が指定されていないかぎり、チェックポイント・ファイルと同じディレクトリに作成されます。トランザクション・ログ・ファイル名は、ds_name.lognという形式になっています。ds_nameは、DSN属性DataStoreによって指定され、データベースのDSNで表示されるデータベース・パス名です。接尾辞のnは、トランザクション・ログ・ファイル番号で、0から始まります。

注意:
TimesTenでは、パフォーマンスを最適にするため、アプリケーションでLogDir属性を使用して、トランザクション・ログ・ファイルをチェックポイント・ファイルとは別の物理デバイスに格納することをお薦めします。別の場所に格納することで、チェックポイントのI/O操作とトランザクション・ログに対するI/O操作が相互にブロックすることがなくなります。
データベースのトランザクション・ログ・ファイルおよびチェックポイント・ファイルが同じデバイスにある場合は、TimesTenによりサポート・ログにメッセージが書き込まれます。

蓄積されるトランザクション・ログ・ファイルの監視

トランザクション・ログ・ファイルが過度に蓄積されないよう、保持されているトランザクション・ログがないことを頻繁に確認することが重要です。非常に多くのトランザクション・ログのファイルが蓄積され、利用可能なディスク領域がなくなると、トランザクション・ログの保持が進行して、次のチェックポイント操作によってトランザクション・ログ・ファイルがパージされるまで、TimesTenデータベースでは新しいトランザクションを開始できません。

次の項では、トランザクション・ログ操作、ログの保持、ログ・ファイルの蓄積について説明します。

- トランザクション・ログ・ファイルのパージ

- TimesTenのコンポーネントまたは操作によるログの保持

- 保持されるログとログ・ファイルの蓄積の監視

トランザクション・ログ・ファイルのパージ

すべてのトランザクション・ログ・ファイルは、TimesTenがパージを行うと判断する次の状況まで保持されます。

- ファイルにログ記録が書き込まれるか、トランザクションがコミットされるか、ロールバックされたとき。これは、ローカル・データベース・トランザクションまたはXAトランザクションのいずれでもかまいません。

- ファイルに記録された変更が、両チェックポイント・ファイルに書き込まれたとき。

- レプリケーションが有効な場合に、ファイルに記録された変更がレプリケートされたとき。

- TimesTen Cacheが使用され、この動作が構成されている場合、ファイルに記録された変更がOracle Databaseに伝播されたとき。

- XLAが使用されている場合、ファイルに記録された変更がXLAにレポートされたとき。

通常のTimesTenの処理では、不要なトランザクション・ログ・ファイルはチェックポイントが開始されるたびにパージされます。チェックポイントは、構成可能な接続属性CkptFrequency接続属性を使用した時間間隔、CkptLogVolume接続属性で構成可能なログ量、または手動やバックグラウンドのチェックポイント・アプリケーション・スレッドを使用してコールできるttCkpt組込み関数を使用して開始できます。

ログ・ファイルの累積のためにディスク領域がなくなっている場合は、CkptFrequency接続属性のかわりにCkptLogVolume接続属性を使用します。また、ttLogHolds組込みプロシージャを頻繁に実行する場合は、ログの再利用がブロックされているかどうかがわかります。

注意:
パフォーマンスを向上させるために、チェックポイント・ファイルがあるディスク・パーティションとは別のディスク・パーティションにログ・ファイルを配置します。ログ・ファイルの保存場所は、LogDir接続属性によって決定されます。詳細は、本書の「トランザクション・ログ・バッファおよびファイルの管理」または『Oracle TimesTen In-Memory Databaseリファレンス』のLogDirに関する説明を参照してください。

一般的な情報については、Oracle TimesTen Application-Tier Database Cache概要のチェックポイントに関する説明を参照してください。CkptFrequencyおよびCkptLogVolumeの詳細は、「バックグラウンド・チェックポインティングの構成または無効化」を参照してください。また、『Oracle TimesTen In-Memory Databaseリファレンス』のCkptFrequency、CkptLogVolume、ttCkptおよびttLogHoldsに関する説明も参照してください。

TimesTenのコンポーネントまたは処理によるログの保持

TimesTenのいくつかのコンポーネントまたは処理によって、トランザクション・ログが保持される場合があります。ある時点以降、トランザクション・ログの保持により、ログ・ファイルは不要になるまでパージされなくなります。通常の場合は、ログの保持の位置は定期的に進行し、ログ・ファイルは適切にパージされます。ただし、操作が正常に動作せず、保持の位置が進まないと、その位置以降にログ・ファイルが過度に蓄積されてパージができなくなり、利用可能なディスク領域がなくなってしまいます。

これらのコンポーネントおよび操作は、次のとおりです。

- レプリケーション: 受信側のホストがログ・ファイルを完全に処理したことを送信側のレプリケーション・エージェントが確認するまでトランザクション・ログは保持されます。
次のようなときに、障害状態となることがあります。

- ネットワークが停止しているか、スタンバイがクラッシュし、1つ以上のサブスクライバにデータを配信できないとき。必要に応じ、ログをこれ以上保持しないようアプリケーションが指示を出し、通常の処理が再開されたらスタンバイにマスター・データベースを複製するようにできます。これの実行の基準は、複製に必要な時間、ログ・ファイルに利用可能なマスター上のディスク領域量、トランザクション・ログの増加率などになります。

- レプリケーションでアクティブ・データベースおよびスタンバイ・データベースの同期を保つことができないほど、データベース全体のトランザクション率が高くなっているとき。アプリケーションで、アプリケーションのトランザクション率またはレプリケートされる表数を削減できます。

詳細は、『Oracle TimesTen In-Memory Database開発者および管理者ガイド』の「レプリケーションのパフォーマンスの向上」およびOracle TimesTen In-Memory Databaseトラブルシューティング・ガイドの「レプリケーションのトラブルシューティング」を参照してください。

- XLA: XLAブックマークが進行するまでトランザクション・ログは保持されます。
XLAアプリケーションが予期せず終了したり、そのブックマークが削除されないまま切断されたり、変更トラッキングを無効にせずにブックマークがスタックとなると、障害状態になる場合があります。ブックマークが遅すぎた場合は、アプリケーションで削除できます。XLAリーダー・プロセスがまだアクティブな場合は、別のXLAプロセスが接続しブックマークを削除できるよう、まず終了する必要があります。

- AWTキャッシュ・グループをレプリケートするアクティブなスタンバイのペア: ログが保持されているトランザクションがOracle Databaseでコミットされたことをレプリケーション・エージェントが確認するまで、トランザクション・ログは保持されます。アクティブ・スタンバイ・ペアでは、通常、アクティブ・データベースがスタンバイ・データベースから確認を受信します。スタンバイ・データベースが停止している場合、レプリケーション・エージェントはOracle Databaseから直接確認を受け取ります。
次のようなときに、障害状態となることがあります。

- Oracle Databaseが停止またはロックされているか、リソースの競合があります。

- ネットワークが停止しているか、遅いか、飽和しています。

- アクティブ・スタンバイ・ペアで、スタンバイ・データベースに対するレプリケーションが遅れています。スタンバイ・データベースでチェック・ログが保持されています。

- TimesTenがOracle Databaseに継続的に伝播できる最大の率よりもTimesTenへのトランザクション率が高くなっています。

詳細は、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』のAWTキャッシュ・グループの監視に関する説明およびOracle TimesTen In-Memory Databaseトラブルシューティング・ガイドのAWTキャッシュ・グループのトラブルシューティングに関する説明を参照してください。

- AUTOREFRESHが構成されたキャッシュ・グループ: アクティブ・データベースのレプリケーション・エージェントが、ログ・ファイルがスタンバイ・データベースによって正常に処理されたことを確認するまで、トランザクション・ログは保持されます。
次のようなときに、障害状態となることがあります。

- AUTOREFRESHモードの結果による大量のワークロードにより、アクティブ・データベースからスタンバイ・データベースへのレプリケーションでスタンバイ・データベースに遅れが生じています。

- 停止またはリカバリ中のスタンバイ・データベースが、ユーザー・アプリケーションまたはOracle Clusterwareから開始されるttRepStateSave組込みプロシージャへのコールを介してFAILEDとマークされていません。アクティブ・データベースは、スタンバイ・データベースの状態がFAILEDとマークされるまで、Oracle Databaseへの伝播を引き継ぎません。スタンバイ・データベースが停止またはリカバリ中の場合、トランザクション・ログ・ファイルはOracle Databaseのために保持されます。

詳細は、Oracle TimesTen In-Memory Databaseトラブルシューティング・ガイドの自動リフレッシュ・キャッシュ・グループの監視に関する説明を参照してください。

- TimesTenの増分バックアップ: バックアップが完了するまで、トランザクション・ログは保持されます。
トランザクション・ログの最新のエントリに対して、増分バックアップが大きく遅れるとき、障害状態が発生することがあります。たとえば、トランザクション・アクティビティが予期せずに激増した場合、バックアップが非常に古いログ・ファイルを保持しているために、利用可能なトランザクション・ログ用のディスク領域が一杯にならないようにする必要があります。この問題を解決するには、アプリケーションで再度増分バックアップを実行します。

- 長時間実行のトランザクションまたはXAトランザクション: トランザクション・ログが完了するまで、トランザクション・ログは保持されます。
アプリケーション・トランザクションが長時間コミットまたはロールバックされず、アプリケーションが長時間実行のトランザクションを終了しなければならない場合、障害状態になる場合があります。

必要に応じて、ttXactAdminユーティリティを-xactIdRollbackオプションを使用して実行すると、トランザクションをロールバックできます。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttXactAdminに関する説明を参照してください。

保持されるログとログ・ファイルの蓄積の監視

トランザクション・ログの過度の蓄積を定期的に監視するオプションは、次のとおりです。

- 保持されているログの詳細な結果セットが返される、ttLogHolds組込みプロシージャをコールします。該当する場合、この情報は次になります。

- ログ・ファイルの番号、保持されている位置のオフセット、およびチェックポイント、レプリケーション、バックアップ、XLA、長時間実行のトランザクションまたは長時間実行のXAトランザクションの種類の保持

- チェックポイントによる保持の場合のチェックポイント・ファイル名

- サブスクライバ名およびレプリケーションで使用するパラレル・トラックID

- バックアップによる保持の場合のバックアップ・パス

- 永続サブスクリプション名およびXLA用にオープンする最後のプロセスのプロセスID

- 長時間実行のトランザクションのトランザクションID

- 長時間実行のXAトランザクションのXA XID

詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttLogHoldsに関する説明を参照してください。

- ttCkptHistory組込みプロシージャをコールし、最後のいくつかのチェックポイントを確認し、返された行に1つもFAILEDの状態がないことを確認します。
詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttCkptHistoryに関する説明を参照してください。

- 操作メトリックについては、SYS.SYSTEMSTATS表を確認してください。各トランザクション・ログ・ファイルには、一意の順序番号があります(最初のログ・ファイルが0で開始し、以降の各ログ・ファイルは1ずつ増分します)。現在のログ・ファイルの番号は、SYS.SYSTEMSTATS.log.file.latestにあります。まだ消去されていない一番古いログ・ファイルの番号は、SYS.SYSTEMSTATS.log.file.earliestにあります。順序番号の差が不適切しきい値を超過した場合、エラーまたは警告が発生するようにします。
詳細は、『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』のSYS.SYSTEMSTATSに関する説明を参照してください。

- XLAについては、ブックマークがスタックまたは遅行している原因の診断の助けとなる、接続されているアプリケーションのプロセスIDなどのブックマークの情報が記載されているSYS.TRANSACTION_LOG_API表を確認してください。
詳細は、『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』のSYS.TRANSACTION_LOG_APIに関する説明を参照してください。

トランザクション・ロギングの永続性オプション

次の項では、トランザクション・ロギングの永続性オプションについて説明します。

- 永続性の保証

- 永続性の遅延

- 永続コミットのパフォーマンス強化

永続性の保証

永続性は、チェックポイント処理とロギングの組合せで実装されます。

- チェックポイント・ファイル: チェックポイント処理では、現在のデータベース・イメージがディスク上のチェックポイント・ファイルに書き込まれ、チェックポイント処理以前にコミットされたすべてのトランザクションの結果に永続性が与えられます。

- トランザクション・ログ・ファイル: 最後のチェックポイント後にコミットされたトランザクションに対しては、従来のロギングによる方法によって永続性が与えられます。トランザクションが処理されるたびに、そのトランザクションによるデータベースの変更内容がインメモリー・トランザクション・ログに記録されます。コミットが行われると、トランザクション・ログ内の該当部分がディスクにフラッシュされます。このログ・フラッシュ処理によって、該当するトランザクションおよび以前コミット済のすべてのトランザクションに永続性が与えられます。
トランザクション・ログ・データがディスクに永続的に書き込まれると、アプリケーションに制御が戻ります。永続的にコミットされたトランザクションは、システム障害が発生しても失われることはありません。

永続性の保証を有効にするには、DurableCommits属性を1に設定します。

最新のチェックポイント・イメージがトランザクション・ログとともに使用され、トランザクションに一貫性がある最新の状態でデータベースが再構築されます。

注意:
あるトランザクションを永続的にコミットすると、そのトランザクションだけでなく、以前のすべてのトランザクションが永続的になります。非永続トランザクションは、永続的にコミットされたトランザクションと同様、データベース障害の発生時にも失われる可能性はありません。

ほとんどのトランザクションが永続的にコミットされた場合、LogFlushMethod初期接続属性を2に設定する場合があります。この接続属性では、TimesTenでログ・データをトランザクション・ログ・ファイルに書き込む方法および同期する方法を構成します。詳細は、「永続コミットの適切な使用」を参照してください。

永続性の遅延

永続性遅延モードでは、永続性保証モードの場合と同様に、トランザクションによってデータベースが変更されるたびに、インメモリーのトランザクション・ログにレコードが書き込まれます。ただし、トランザクションが永続性遅延モードでコミットされると、そのトランザクションはディスクへのトランザクション・ログの書込みを待機せず、制御がアプリケーションに戻されます。このため、非永続トランザクションはデータベースで障害が発生した場合に失われる可能性があります。ただし、これは永続トランザクションに比べてかなり短時間で実行できます。最終的にトランザクションは、データベースのサブデーモン・プロセスにより、またはインメモリーのログ・バッファに空きがない場合はディスクにフラッシュされます。

アプリケーションではDurableCommits属性を0に設定して、永続性遅延モードをリクエストします。これはデフォルトかつ推奨するオプションです。永続性遅延を使用している接続と、永続性保証を使用している接続を共存させることができます。

永続性遅延モードによるパフォーマンス上の利点が必要で、わずかな数のトランザクションであれば失うことを許容できるアプリケーションの場合は、バックグラウンドで永続コミットを定期的に実行できます。この場合、最後の永続コミット後に非永続的にコミットしたトランザクションのみが、システム障害が発生すると失われる可能性があります。

永続コミットのパフォーマンス強化

複数の同時実行トランザクションをグループ・コミットすると、永続コミットのパフォーマンス・コストを低下できます。多くのスレッドを同時に実行する場合で、そのスレッドが短時間のトランザクションである場合は、ほとんど同時にコミットできます。その後、1回のディスク書込みによって同時トランザクションのグループが永続的にコミットされます。永続コミットのたびに、ディスク書込みの終了を待機する必要があるため、グループ・コミットでは、いずれのコミット処理のレスポンス時間も向上しませんが、一連の同時トランザクションのスループットは大幅に向上します。

TimesTenでは、永続コミットが頻繁に使用される場合、トランザクションが短時間であるかぎり、CPUの数を超える数の接続をサポートできます。これは、それぞれの接続で、CPUを使用する時間よりコミットの完了を待つ時間の方が長いため可能になります。または、永続コミットが頻繁に実行されないアプリケーションでは、各接続のワークロードに対するTimesTen関連のCPU使用率が非常に高くなります。

最適なレスポンス時間を必要としない、トランザクションの多少の消失は許容できるアプリケーションでは、定期的な永続コミットの実行を選択できます。これにより、非永続的にコミットされているすべてのトランザクションに比べて、トランザクションが失われる可能性は低くなります。永続コミットをn個のトランザクションごとにのみ実行するか、またはn秒ごとに実行すると、トランザクションの消失の可能性がある時間枠を小さくし、レスポンス時間を短縮できます。ユーザーは、金融取引を扱うトランザクションなど、消失の危険があるクリティカルなトランザクションを永続的にコミットすることもできます。

定期的な永続コミットを有効にするために、アプリケーションで次のことが実行されます。

1. 属性DurableCommits=0を設定して接続します。これにより、トランザクションが非永続的にコミットされます。

2. 永続コミットが必要な場合は、コミットする前にアプリケーションから組込みプロシージャttDurableCommitをコールします。ttDurableCommit組込みプロシージャは、実際にトランザクションはコミットせず、コミットの実行時にそのコミットに永続性を与えるのみです。

トランザクションの再要求操作

トランザクションがTimesTenによってコミット済としてマークされた後、コミットの再要求段階があり、この間にデータベース・リソースが再要求されます。この項では、この再要求操作について、次の内容で説明します。

- 再要求操作について

- コミット・バッファを再要求操作用に構成する

再要求操作について

トランザクションのコミットの再要求段階の間に、TimesTenのリソース・クリーンアップが発生します。たとえば、DELETE操作を含むトランザクションを考えてみます。SQL操作は削除した行を削除済としてマークしますが、これらの行が占有する領域とリソースは、実際にはトランザクションのコミットの再要求フェーズまでは解放されません。

再要求の間、TimesTenはトランザクションの開始時点からのすべてのトランザクション・ログ記録を再調査し、実行する必要がある再要求操作を決定してから、これらの操作を実行します。

パフォーマンス向上のため、数件のトランザクション・ログ・レコードをキャッシュしてディスク上のトランザクション・ログへのアクセスを減らすことができます。このキャッシュはコミット・バッファと呼ばれ、その大きさは、次の「コミット・バッファを再要求操作用に構成する」の項で説明しているように構成可能です。

注意:

- 再要求フェーズが開始すると、トランザクションはコミットされたとみなされ、ロールバックできなくなります。

- 再要求フェーズ中にプロセスが終了すると、クリーンアップ操作により再要求が完了します。

コミット・バッファを再要求操作用に構成する

大きなトランザクション・コミットの再利用要求段階では大量の処理が必要になり、リソースを大量に消費します。(このため、より小さなトランザクションを一般的に推奨します。)ただし、コミット・バッファの最大サイズを増やすことでパフォーマンスを向上させることができます。コミット・バッファとは、再利用要求操作で使用されるトランザクション・ログ記録のキャッシュです。

TimesTenのCommitBufferSizeMax接続属性を使用して、コミット・バッファの最大サイズをMB単位で指定できます。この設定のスコープは、現在のセッションです。効率性の向上のため、初期のメモリー割当ては最大値より大幅に小さくなっていますが、関連するログ・レコードがコミット・バッファに収まるように必要に応じて自動的に増えていき、割当ての最大値まで達します。その後、再要求フェーズのたびに、割当てが元の割当てに戻ります。デフォルトでは、最大値128KB、初期割当て16KBです。(『Oracle TimesTen In-Memory Databaseリファレンス』のCommitBufferSizeMaxに関する説明も参照してください。)

コミット・バッファの最大サイズを大きくすると、一時領域が対応して増加する場合があります。指定可能な最大サイズには、整数の最大値以外に特定の制限はありませんが、利用可能な一時領域を超えるとエラーが発生します。

次の関連機能に留意してください。

- 一連のセッションの中でALTER SESSIONを使用して次のようにコミット・バッファの最大サイズを変更できます。ここでnはMB単位の最大値です。(『Oracle TimesTen In-Memory Database SQLリファレンス』のALTER SESSIONに関する説明も参照してください。)

ALTER SESSION SET COMMIT_BUFFER_SIZE_MAX = n

- ttCommitBufferStats組込みプロシージャを使用して接続に関する統計を収集し、コミット・バッファの最大サイズのチューニングに役立てることができます。この組込みパラメータはパラメータを取らず、コミット・バッファ・オーバーフローの合計数と、トランザクション・ログ・レコードの再要求操作に使用された最大メモリー量を、バイト単位で返します。バッファ・オーバーフローがある場合、コミット・バッファの最大サイズを増やすことを検討してください。オーバーフローがなく、最大メモリー使用量がコミット・バッファの最大サイズより大幅に少ない場合は、最大サイズを減らすことを検討してください。
ttCommitBufferStatsReset組込みプロシージャは、これらの統計を0 (ゼロ)にリセットします。これは、コミット・バッファの最大サイズに新しい値を設定し、統計を最初からやり直したい場合などに便利です。

(『Oracle TimesTen In-Memory Databaseリファレンス』のttCommitBufferStatsとttCommitBufferStatsResetに関する説明も参照してください。)

- システム全体のコミット・バッファ・オーバーフローの数も、SYS.SYSTEMSTATS表内のTimesTen統計、txn.commits.buf.overflowedに記録されます。(『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』のSYS.SYSTEMSTATSに関する説明も参照してください。)

- CommitBufferSizeMaxの現在の設定を確認するには、ttConfiguration組込みプロシージャを呼び出します。

チェックポイントおよびトランザクション・ログ・ファイルを使用したリカバリ

システム障害やプロセス障害によって、データベースが無効になったり破損したりすると、データベースへのすべての接続が無効になります。アプリケーションが障害のあったデータベースに再接続すると、サブデーモンがデータベースに新しいメモリー・セグメントを割り当て、チェックポイント・ファイルおよびトランザクション・ログ・ファイルからそのデータをリカバリします。

リカバリ中に、最新のチェックポイント・ファイルがメモリーに読み込まれます。最後のチェックポイント以降にコミットされ、ログ・レコードがディスク上に存在するすべてのトランザクションが、適切なトランザクション・ログ・ファイルからロールフォワードされます。ただし、このようなトランザクションには、永続的にコミットされたすべてのトランザクションのみでなく、ログ・レコードがインメモリーのログ・バッファからエージ・アウトされたすべてのトランザクションも含まれることに注意してください。コミットされていないトランザクション、またはロールバックされたトランザクションはリカバリされません。チェックポイントとトランザクション・ログ・ファイルの詳細は、「チェックポイント処理」および「トランザクションのロギング」を参照してください。

8 TimesTenデータベースのデータの処理

この章では、TimesTenデータベースの基本コンポーネントの詳細について説明し、SQLを使用してこれらのコンポーネントを管理する方法の簡単な例を示します。SQLの詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』を参照してください。

アプリケーション内からSQLを実行する方法の詳細は、適切なTimesTen開発者ガイドを参照してください。

この章の内容は次のとおりです。

- データベースの概要

- 表の理解

- ビューの理解

- マテリアライズド・ビューの理解

- 索引の理解

- 行の理解

- シノニムの理解

データベースの概要

次の項では、TimesTenデータベースの主要な要素および特徴について説明します。

- データベースのコンポーネント

- データベースのユーザーおよび所有者

- データベースの永続性

データベースのコンポーネント

TimesTenデータベースには、次の永続コンポーネントがあります。

- 表: アプリケーションのデータを含む表でTimesTenデータベースは主に構成されます。詳細は、「表の理解」を参照してください。

- マテリアライズド・ビュー: 1つ以上の通常のTimesTen表から選択したデータのサマリーを保持する読取り専用表です。詳細は、「マテリアライズド・ビューの理解」を参照してください。

- ビュー: 1つ以上のディテール表と呼ばれる表に基づいた論理表です。ビュー自体にデータは含まれていません。詳細は、「ビューの理解」を参照してください。

- 索引: 索引は、表に速くアクセスできるように、表の1つ以上の列に対して作成します。詳細は、「索引の理解」を参照してください。

- 行: 各表は0以上の行で構成されます。行とは、成形された値のリストです。詳細は、「行の理解」を参照してください。

- システム表: システム表には、すべての表に関する表などのTimesTenメタデータが含まれます。『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』のシステム表に関する説明を参照してください。

また、準備済のコマンド、カーソル、ロックなどの多くの一時コンポーネントもあります。

データベースのユーザーおよび所有者

TimesTen Data Managerはパスワードでユーザー名を認証します。TimesTen Client/Serverもパスワードでユーザーを認証します。アプリケーションの実行に使用されるログイン名が、デフォルトではデータベースの所有者になるため、アプリケーションでは、そのアプリケーション専用に1つのUIDを選択する必要があります。2つの別のログインを使用すると、TimesTenが正しい表を検出するのが困難になる場合があります。接続文字列でUID接続属性を省略すると、TimesTenでは現行のユーザーのログイン名を使用します。TimesTenでは、すべてのユーザー名が大文字に変換されます。

ユーザーは、SYSユーザーとしてTimesTenデータベースにアクセスすることはできません。TimesTenは、UID接続属性の値または接続ユーザーのログイン名(UID接続属性の値が存在しない場合)でユーザー名を判別します。ユーザーのログイン名がSYSの場合は、ログイン名が上書きされるようにUID接続を設定します。

データベースの永続性

データベースは、作成されると、永続属性セットまたは一時属性セットのいずれかが設定されます。

注意:
Temporary接続属性の値を設定することでデータベース永続性を定義できます。データベースの作成後、そのデータベースのTemporary属性は変更できません。Temporary属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のTemporaryに関する説明を参照してください。

- 永続データベースは、チェックポイントと呼ばれるプロシージャで自動的にディスクに保存されます。TimesTenでは、接続属性CkptFrequencyおよびCkptLogVolumeの設定に基づいて、チェックポイント処理がバックグラウンドで自動的に実行されます。また、最後のアプリケーションが切断されるときにも、データベースのチェックポイント処理が実行されます。アプリケーションでは、ttCkptBlocking組込みプロシージャをコールすることで、ディスクに対して直接データベースのチェックポイント処理を実行できます。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttCkptBlockingに関する説明を参照してください。

- 一時データベースは、ディスクに保存されません。(最後の接続が切断されたり、システムまたはアプリケーション障害が発生したなどで)接続されるアプリケーションがない場合、一時データベースは自動的に破棄されます。TimesTenでは、最後のアプリケーションが切断されると、ディスク・ベースのすべてのファイルを削除します。
一時データベースは、バックアップまたはレプリケートできません。永続データベースの場合、データベースのサイズとアクティビティによっては、チェックポイント処理がかなりのオーバーヘッドとなりますが、一時データベースはディスクに完全にチェックポイント処理されることはなく、一時データベースの場合はほとんど影響を与えません。トランザクション・ログ・ファイルを削除するには、チェックポイントが必要になります。

ただし、一時データベースにはトランザクション・ログがあり、これはトランザクションをロールバックできるように定期的にディスクに書き込まれます。一時データベースのトランザクション・ログに書き込まれるデータの量は、永続データベースに対して書き込まれるデータの量よりも少ないため、一時データベースの方がパフォーマンスは向上します。一時データベースに対してリカバリが実行されることはありません。

一時データベースでは、パフォーマンスの向上が可能です。データベースをディスクに保存する必要がない場合は、一時データベースを作成することで、チェックポイントのオーバーヘッドを軽減できます。

一時データベースの設定方法の詳細は、「一時データベースの設定」の説明を参照してください。

表の理解

TimesTenの表は、共通の書式または構造を持つ行で構成されています。この書式は、表の列で定義します。

次の項では、表とその列およびこれらの管理方法について説明します。

- 表の概要

- 表の処理

- 表へのエージングの実装

表の概要

この項の内容は次のとおりです。

- 列の概要

- インライン列およびアウトライン列

- デフォルトの列値

- 表名

- 表へのアクセス

- 主キー、外部キーおよび一意索引

- システム表

列の概要

表に列を作成する場合、列名の大文字と小文字は区別されます。

各列には、次の値が設定されています。

- データ型

- NULL値可能、主キーおよび外部キーのプロパティ(オプション)

- オプションのデフォルト値

列は、NOT NULLと明示的に宣言しないかぎり、NULL値可能になります。表の列がNULL値可能の場合は、その列にNULL値を保存できます。NULL値可能でない場合は、表のその列の各行にNULL以外の値を設定する必要があります。

TimesTenの列の書式は変更できません。列の追加や削除は可能ですが、列の定義は変更できません。列を追加または削除するには、ALTER TABLE文を使用します。列の定義を変更するには、まずアプリケーションで表を削除し、新しい定義で再作成する必要があります。

インライン列およびアウトライン列

表の行のインメモリー・レイアウトは、行への高速アクセスを可能にし、無駄な領域が最小限になるように設計されています。TimesTenでは、表のVARBINARY、NVARCHAR2およびVARCHAR2の各列がインラインまたはアウトラインのいずれかに指定されます。

- インライン列は固定長です。表内のすべての固定長列の値は、行単位で保存されます。

- (アウトライン列とも呼ばれる)非インライン列は可変長です。データ型がVARCHAR2、NVARCHAR2またはVARBINARYの列には、アウトラインで保存されるものがあります。アウトライン列は、行に近接して保存されるのではなく、行に割り当てられます。TimesTenではデフォルトで、宣言された列の長さが128バイトを超えるVARCHAR2、NVARCHAR2およびVARBINARYの列は、アウトラインで保存されます。さらにすべてのLOBデータ型もアウトラインで保存されます。TimesTenではデフォルトで、宣言された列の長さが128バイト以下の可変長の列は、インラインで保存されます。

インライン列ではなくアウトライン列で実行されるほとんどの処理はわずかに遅くなります。インライン列ではなくアウトライン列を使用する際にパフォーマンスに関して考慮する事項がいくつかあります。

- TimesTenは、アウトライン列からデータを行を連続して保存しないため、データへのアクセスは遅くなります。

- TimesTenは、より多くのロギング操作を生成するため、データの移入が遅くなります。

- TimesTenは、より多くの再利用操作およびロギング操作を実行するため、データの削除が遅くなります。大量の行(100,000以上)を削除する場合は、複数のより小さいDELETE FROM文、TRUNCATE TABLE文またはDELETE FIRST句を使用することを検討してください。詳細は、「大量のDELETE文の回避」を参照してください。

- 列を保存するとオーバーヘッドが少なくなります。

行のインライン部分およびアウトライン部分の最大サイズについては、「ttIsql tablesizeコマンドの使用」を参照してください。

デフォルトの列値

表の作成時に、デフォルトの列値を指定できます。指定するデフォルト値は、列のデータ型と互換性がある必要があります。列には、次のいずれかのデフォルト値を指定できます。

- NULL(すべてのデータ型の列)

- 定数値

- SYSDATE(DATE列およびTIMESTAMP列)

- USER(CHAR列)

- CURRENT_USER(CHAR列)

- SYSTEM_USER(CHAR列)

CREATE TABLE文のDEFAULT句を使用し、デフォルト値を指定しなかった場合、デフォルト値はNULLになります。詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE TABLEに関する説明を参照してください。

表名

TimesTenの表は、所有者名および表名によって一意に識別されます。すべての表に所有者が存在します。デフォルトでTimesTenは、表を作成したユーザーを所有者に定義します。TimesTenが作成したシステム表などの表の所有者名にはSYSが付きます。

表を一意に参照するには、MARY.PAYROLLなどのように表の所有者名と表名をピリオド「.」で区切って指定します。所有者を指定しなかった場合、TimesTenは、コール元のユーザー名の下にある表を検索し、次にユーザー名SYSの下にある表を検索します。

名前は、文字で始まる英数字の値です。名前には、アンダースコアを使用できます。表名の長さは、最大30文字です。所有者名の長さも、最大30文字です。TimesTenでは、すべての表名、列名および所有者名が大文字で表示されます。詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の「名前、ネームスペースおよびパラメータ」に関する説明を参照してください。

表へのアクセス

アプリケーションは、表にSQL文を介してアクセスします。TimesTenの問合せオプティマイザは、表に最短でアクセスする方法を自動的に選択します。既存の索引を使用するか、必要に応じて一時索引を作成してアクセスの高速化します。一時索引の自動作成および自動破棄を行うとパフォーマンスのオーバーヘッドが発生するため、パフォーマンスを向上させるには、頻繁に検索する列に対して、アプリケーションで索引を明示的に作成する必要があります。詳細は、「文のチューニングと索引の使用」を参照してください。オプティマイザ・ヒント(文またはトランザクション・レベル)を使用して、特定のアプリケーションのTimesTen実行計画を調整できます。オプティマイザ・ヒントの詳細は、「オプティマイザ・ヒントを使用して実行計画を変更する」を参照してください。

主キー、外部キーおよび一意索引

1つ以上の列に主キーを作成して、それらの列で重複値が拒否されるように設定できます。主キーの列は、NULL値可能にできません。1つの表に設定可能な主キーは1つのみです。TimesTenは、主キーに対して範囲索引を自動的に作成して、主キーに一意性を適用し、主キーを介してアクセス速度を向上します。行を挿入すると、範囲索引をハッシュ索引に変更する場合を除き、主キー列を変更できなくなります。

注意:
索引の詳細は、「索引の理解」を参照してください。

1つの表に設定可能な主キーは1つのみですが、一意索引を使用すると、一意性に関するプロパティを表に追加できます。詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE INDEXに関する説明を参照してください。

注意:
主キーの列はNULL値可能にできませんが、一意索引をNULL値可能な列に作成することはできます。

また、表には、別の表の行に対応する行を持つ1つ以上の外部キーを設定できます。外部キーは、他方の表の主キーまたは一意に索引付けされた列に関連付けられています。外部キーは、参照先列に対して範囲索引を使用します。詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE TABLEに関する説明を参照してください。

システム表

TimesTenのデータベースには、アプリケーションで作成された表のみでなく、システム表も含まれています。システム表には、TimesTenメタデータ(データベース内のすべての表および索引の定義など)およびその他の情報(オプティマイザ計画など)が保存されています。アプリケーションでは、ユーザー表の場合と同様にシステム表を問い合せることができます。アプリケーションでは、システム表の更新はできません。TimesTenのシステム表については、『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』の「システム表」の章を参照してください。

注意:
TimesTenのシステム表の書式は、リリースによって異なる場合があります。32ビット版と64ビット版のTimesTenでは、この書式が異なります。

表の処理

表の作成、破棄または管理を行う処理を実行するには、適切な権限を持っている必要があります。権限の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の「SQL文」の章で、すべてのSQL文の構文とともに説明されています。

この項の内容は次のとおりです。

- 表の作成

- 表の破棄

- 表サイズの見積り

表の作成

表を作成するには、SQL文CREATE TABLEを使用します。SQL文の構文については、『Oracle TimesTen In-Memory Database SQLリファレンス』を参照してください。TimesTenでは、表名が大文字に変換されます。

例8-1 表の作成

次のSQL文によって、2つの異なるデータ型のCustIdおよびCustNameという2つの列を持つNameIDという表が作成されます。

CREATE TABLE NameID (CustId TT_INTEGER, CustName VARCHAR2(50));

例8-2 ハッシュ索引を持つ表の作成

この例では、CustId、CustName、Addr、Zip、Regionの列を持つCustomerという表が作成されます。CustId列が主キーとして指定されているので、表内の行は「主キー、外部キーおよび一意索引」で説明のとおり、行のCustId値で一意に識別されます。

UNIQUE HASH ON custId PAGES値は、ハッシュ索引に30ページあることを示しています。つまり、この表の予想行数は30 * 256 = 7680です。表の行数がこれより大幅に多くなると、パフォーマンスが低下する場合があり、ハッシュ索引のリサイズが必要になります。ハッシュ索引内のページの詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のALTER TABLEのSET PAGESに関する説明を参照してください。ハッシュ表内のページのサイズを設定する方法の詳細は、ハッシュ索引サイズの適切な設定に関する説明を参照してください。

CREATE TABLE Customer
(custId NUMBER NOT NULL PRIMARY KEY,
custName CHAR(100) NOT NULL,
Addr CHAR(100),
Zip NUMBER,
Region CHAR(10))
UNIQUE HASH ON (custId) PAGES = 30;

表の破棄

TimesTen表を破棄するには、SQL文DROP TABLEをコールします。

例8-3 表の破棄

次の例では、表NameIDが破棄されます。

DROP TABLE NameID;

表サイズの見積り

TimesTenデータベースのサイズの増加は、最初の接続時に行うことができます。データベースのサイズを変更する必要をなくすには、データベースの最終的なサイズを少なく見積もらないようにする必要があります。表のサイズの見積りには、ttSizeユーティリティを使用します。

次の例は、ttSizeユーティリティによる行数、インライン行のバイト数、表の索引のサイズおよび表の合計サイズの見積りを示します。

ttSize -tbl Pat.tab1 MyDb

Rows = 2

Total in-line row bytes = 17524
Indexes:

Bitmap index PAT.BITMAP_ID adds 6282 bytes
Total index bytes = 6282

Total = 23806

既存の表のサイズは、ttIsql tablesizeコマンドでも計算できます。詳細は、「ttIsql tablesizeコマンドの使用」を参照してください。

表へのエージングの実装

データベース内の1つ以上の表に対してエージング・ポリシーを定義できます。エージング・ポリシーとは、エージングのタイプ、属性および状態(ONまたはOFF)のことです。使用状況ベースまたは時間ベースのいずれかのタイプのエージング・ポリシーを指定できます。使用状況ベースのエージングでは、指定したデータベースの使用範囲内の最低使用頻度(LRU)のデータが削除されます。時間ベースのエージングでは、指定したデータ存続期間およびエージング・プロセスの頻度に基づいてデータが削除されます。使用状況ベースと時間ベースの両方のエージングを同じデータベースに定義することはできますが、特定の表に対して定義できるエージング・タイプは1つのみです。

CREATE TABLE文を使用して、新しい表のエージング・ポリシーを定義できます。既存の表にエージング・ポリシーが定義されていない場合は、ALTER TABLE文を使用してその表にエージング・ポリシーを追加できます。エージング・ポリシーは、エージング・ポリシーを破棄したり、新しいエージング・ポリシーを追加することによって変更できます。

次のタイプの表にはエージングを指定できません。

- グローバル一時表

- マテリアライズド・ビューのディテール表

キャッシュ・グループにエージングを実装することもできます。『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』のキャッシュ・グループでのエージングの実装に関する説明を参照してください。

この項の内容は次のとおりです。

- 使用状況ベースのエージング

- 時間ベースのエージング

- エージングおよび外部キー

- エージング開始のスケジュール

- エージングおよびレプリケーション

使用状況ベースのエージング

使用状況ベースのエージングを使用すると、最低使用頻度(LRU)のデータを削除することによって、データベースで使用されるメモリーの量を、指定したしきい値の範囲内で管理できます。

CREATE TABLE文のAGING LRU句を使用して、新しい表のLRUエージングを定義します。エージングの状態がONの場合、エージングは自動的に開始されます。

ttAgingLRUConfig組込みプロシージャをコールして、LRUエージング属性を指定します。属性値は、LRUエージング・ポリシーが含まれているデータベース内のすべての表に適用されます。ttAgingLRUConfig組込みプロシージャをコールしない場合は、属性のデフォルト値が使用されます。

注意:
属性を変更する場合、ttAgingLRUConfig組込みプロシージャを使用するにはユーザーにADMIN権限が必要です。既存の属性を表示する場合、権限は必要ありません。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の組込みプロシージャに関する説明を参照してください。

次の表に、LRUエージング属性の概要を示します。

LRUエージング属性

説明

LowUsageThreshhold

LRUエージングが非アクティブになるデータベースPermSizeの割合(%)。

HighUsageThreshhold

LRUエージングがアクティブになるデータベースPermSizeの割合(%)。

AgingCycle

エージング・サイクルの間隔(分)。

LRUエージング・ポリシーの定義後、AgingCycleに対して新しい値を設定すると、エージングは、その時点での時間および新しいサイクル時間に基づいて実行されます。たとえば、元のエージング・サイクルが15分で、LRUエージングが10分前に実行された場合、エージングは、5分後に再度実行されることになります。ただし、AgingCycleパラメータを30分に変更すると、AgingCycleで変更した値を使用してttAgingLRUConfigプロシージャをコールした時点から30分後にエージングが行われます。

最後のエージング・サイクル以降に行へのアクセスまたは行の参照を行った場合、その行はLRUエージングの対象ではなくなります。行は、次のいずれかの条件に当てはまる場合にアクセスまたは参照されたとみなされます。

- 行がSELECT文の結果セットを作成するために使用された。

- 行に、更新フラグまたは削除フラグが設定されている。

- 行がINSERT SELECT文の結果セットを作成するために使用された。

ALTER TABLE文を使用して、次のタスクを実行できます。

- ALTER TABLE文をSET AGING {ON|OFF}句とともに使用して、エージング・ポリシーが定義されている表のエージングの状態を有効または無効にします。

- ALTER TABLE文をADD AGING LRU [ON|OFF]句とともに使用して、LRUエージング・ポリシーを既存の表に追加します。

- ALTER TABLE文をDROP AGING句とともに使用して、表のエージングを破棄します。

エージングの開始をスケジュールするには、ttAgingScheduleNow組込みプロシージャをコールします。詳細は、「エージング開始のスケジュール」を参照してください。

表のエージングをLRUから時間ベースに変更するには、まず、DROP AGING句とともにALTER TABLE文を使用して表のエージングを破棄します。次に、ADD AGING USE句とともにALTER TABLE文を使用して時間ベースのエージングを追加します。

注意:
LRUエージングを破棄するか、またはコマンドで参照される表にLRUエージングを追加すると、TimesTenによって、コンパイルされているコマンドが無効とマークされます。これらのコマンドは、再コンパイルする必要があります。

時間ベースのエージング

時間ベースのエージングでは、指定したデータ存続期間およびエージング・プロセスの頻度に基づいてデータが表から削除されます。CREATE TABLE文のAGING USE句を使用して、新しい表の時間ベースのエージング・ポリシーを指定します。ALTER TABLE文のADD AGING USE句を使用して、既存の表に時間ベースのエージング・ポリシーを追加します。

AGING USE句にはColumnName引数があります。ColumnNameは時間ベースのエージングに使用する列名で、タイムスタンプ列とも呼ばれます。タイムスタンプ列は次のように定義する必要があります。

- ORA_TIMESTAMP、TT_TIMESTAMP、ORA_DATEまたはTT_DATEデータ型

- NOT NULL

使用しているアプリケーションによって、タイムスタンプ列の値が更新されます。いくつかの行でこの列の値が不明な場合に、それらの行がエージングされないようにするには、その列のデフォルト値を大きい値に定義します。タイムスタンプ列に索引を作成すると、エージング・プロセスのパフォーマンスを向上できます。

注意:
列を追加または変更してNOT NULLに定義することはできないため、既存の表で列を追加または変更した後で、その列をタイムスタンプ列として使用することはできません。

時間ベースのエージング・ポリシーが含まれている表からタイムスタンプ列を破棄することはできません。

タイムスタンプ列のデータ型がORA_TIMESTAMP、TT_TIMESTAMPまたはORA_DATEある場合は、CREATE TABLE文のLIFETIME句に、日、時間または分単位で存続期間を指定できます。タイムスタンプ列のデータ型がTT_DATEである場合は、日単位で存続期間を指定します。

タイムスタンプ列の値は、SYSDATEから引かれます。結果は、指定した単位(分、時間、日)を使用して切り捨てられ、指定したLIFETIME値と比較されます。結果がLIFETIME値より大きい場合、その行はエージングの候補となります。

CYCLE句を使用して、システムで行を確認し、指定した存続期間を超えたデータを削除する頻度を指定します。CYCLEを指定しない場合、エージングは5分ごとに行われます。CYCLEに0(ゼロ)を指定した場合、エージングは継続して行われます。エージングは、状態がONの場合、自動的に開始されます。

ALTER TABLE文を使用して、次のタスクを実行します。

- SET AGING {ON|OFF}句を使用して、時間ベースのエージング・ポリシーが含まれている表のエージングの状態を有効または無効にします。

- SET AGING CYCLE句を使用して、時間ベースのエージング・ポリシーが含まれている表のエージング・サイクルを変更します。

- SET AGING LIFETIME句を使用して、存続期間を変更します。

- ADD AGING USE句を使用して、エージング・ポリシーが含まれていない既存の表に時間ベースのエージングを追加します。

- DROP AGING句を使用して、表のエージングを破棄します。

エージングの開始をスケジュールするには、ttAgingScheduleNow組込みプロシージャをコールします。詳細は、「エージング開始のスケジュール」を参照してください。

表のエージング・ポリシーを時間ベースのエージングからLRUエージングに変更するには、まず、表の時間ベースのエージングを破棄します。次に、ADD AGING LRU句とともにALTER TABLE文を使用して、LRUエージングを追加します。

エージングおよび外部キー

外部キーによって関連付けられている表には、同じエージング・ポリシーを設定する必要があります。

- LRUエージングが有効になっている間に子表内の行にアクセスした場合は、親行または子行のいずれも削除されません。

- 時間ベースのエージングが有効になっている場合に親表内の行がエージング・アウトの候補になると、親行およびそのすべての子が削除されます。

- 表でON DELETE CASCADEが有効になっている場合、この設定は無視されます。

エージング開始のスケジュール

エージング処理をスケジュールするには、ttAgingScheduleNow組込みプロシージャをコールします。実行中のエージング・プロセスが存在しないかぎり、このプロシージャをコールするとすぐにエージング・プロセスは開始されます(存在する場合、そのエージング・プロセスが完了すると開始されます)。

ttAgingScheduleNowをコールすると、状態がONまたはOFFのいずれであるかに関係なく、エージング・プロセスが開始されます。

ttAgingScheduleNowをコールしてもエージングの状態は変わらないため、これをコールした結果としてエージング・プロセスは1回のみ開始されます。ttAgingScheduleNowのコール時にエージングの状態がOFFの場合、エージング・プロセスは開始されますが、プロセスの完了後、エージングは継続されません。エージングを継続するには、ttAgingScheduleNowを再度コールするか、またはエージングの状態をONに変更する必要があります。

エージングの状態がすでにONに設定されている場合は、ttAgingScheduleNowがコールされた時間に基づいて、ttAgingScheduleNowによってエージング・サイクルがリセットされます。

SET AGING OFF句とともにALTER TABLE文を使用してエージングを無効にすると、外部でエージングを制御できます。その後、ttAgingScheduleNowを使用して、目的の時間にエージングを開始します。

ttAgingScheduleNowを使用して、このプロシージャのコール時に個々の表の名前を指定することによって、表のエージングを開始またはリセットします。表名を指定しない場合は、ttAgingScheduleNowによって、エージングが定義されているデータベース内のすべての表のエージングが開始またはリセットされます。

エージングおよびレプリケーション

アクティブなスタンバイ・ペアの場合は、アクティブなマスター・データベースにエージングを実装します。エージングの結果として行われる削除は、スタンバイ・マスター・データベースおよび読取り専用サブスクライバにレプリケートされます。スタンバイ・マスター・データベースに対してフェイルオーバーが行われると、エージングは、ロールがACTIVEに変更された後でそのデータベースに対して有効になります。

他のすべてのタイプのレプリケーション・スキームの場合は、ノードごとに個別にエージングを実装します。エージング・ポリシーは、すべてのノードで同じである必要があります。

ホット・スタンバイとして使用されるマルチマスター・レプリケーション・スキームにLRUエージングを実装すると、LRUエージングで予期しない結果が発生する可能性があります。エージングがローカルで行われるため、フェイルオーバー後に必要なデータの一部が失われる場合があります。

ビューの理解

ビューとは、1つ以上の表に基づく論理表です。ビュー自体にデータは含まれていません。これは、ディテール表の計算済データを含むマテリアライズド・ビューと区別するために、非マテリアライズド・ビューと呼ばれることもあります。ビューは直接更新できませんが、ディテール表のデータへの変更はただちにビューに反映されます。

ビューまたはマテリアライズド・ビューのいずれを作成するかを決めるには、計算コストを検討します。マテリアライズド・ビューの場合は、マテリアライズド・ビュー内のデータに対して計算を行う必要があるため、ディテール表を更新するユーザーにコストがかかります。非マテリアライズド・ビューの場合、問合せ時に計算を行う必要があるため、ビューを問い合せる接続にコストがかかります。

ビューの作成、破棄または管理を行う処理を実行するには、適切な権限を持っている必要があります。権限の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の「SQL文」の章で、すべてのSQL文の構文とともに説明されています。

この項の内容は次のとおりです。

- ビューの作成

- ビューの破棄

- ビューおよびディテール表に対する制限

ビューの作成

ビューを作成するには、SQL文CREATE VIEWを使用します。SQL文の構文については、『Oracle TimesTen In-Memory Database SQLリファレンス』の「SQL文」の章を参照してください。

CREATE VIEW ViewName AS SelectQuery;

これによって、ビューで使用される列がディテール表から選択されます。

たとえば、表t1からビューを作成します。

CREATE VIEW v1 AS SELECT * FROM t1;

次に、表t1に対する集計問合せからビューを作成します。

CREATE VIEW v1 (max1) AS SELECT max(x1) FROM t1;

CREATE VIEW文でのSELECT問合せ

マテリアライズド・ビューの内容の定義に使用するSELECT問合せは、トップ・レベルのSQL SELECT文(『Oracle TimesTen In-Memory Database SQLリファレンス』の「SQL文」の章を参照)に類似していますが、次の制限があります。

- ビュー定義内のSELECT *問合せは、ビュー作成時に拡張されます。ビューが作成された後に追加された列は、ビューに反映されません。

- ビューを作成するSELECT文で、次の句は使用できません。

- DISTINCT

- FIRST

- ORDER BY

- 引数

- 一時表

- SELECT構文のリストの各式には、一意の名前が必要です。列の別名が定義されていないかぎり、単純にその列の名前が使用されます。ROWIDは式とみなされるため、別名が必要です。

- SELECT FOR UPDATEまたはSELECT FOR INSERT文はビューに対しては使用できません。

- 特定のTimesTen問合せ制限は、非マテリアライズド・ビューの作成時に確認されません。これらの制限に違反しているビューの作成が可能な場合がありますが、その後、実行した文でこのビューが参照されると、エラーが戻されます。

ビューの破棄

DROP VIEW文で、指定したビューが破棄されます。

次の文では、CustOrderビューが破棄されます。

DROP VIEW CustOrder;

ビューおよびディテール表に対する制限

ビューには、次の制限があります。

- ビューが SELECT文のFROM句で参照されると、ビューの名前は、その定義によって解析時に導出表に置き換えられます。導出表がないと、ビューのすべての句を元のSELECT内の同じ句にマージして適切な問合せにすることができない場合は、この導出表の内容がマテリアライズ化されます。たとえば、ビューと参照しているSELECTの両方で集計が指定されている場合、ビューは、その結果がSELECTの他の表と結合される前にマテリアライズ化されます。

- ビューは、DROP TABLE文では破棄できません。DROP VIEW文を使用する必要があります。

- ビューは、ALTER TABLE文では変更できません。

- ビューの参照は、ディテール表の破棄または変更が原因で失敗する可能性があります。

マテリアライズド・ビューの理解

次の項では、マテリアライズド・ビューとその管理方法について説明します。

- マテリアライズド・ビューの概要

- マテリアライズド・ビューの処理

マテリアライズド・ビューの概要

マテリアライズド・ビューとは、1つ以上の通常のTimesTen表から選択したデータのサマリーを保持する読取り専用表です。マテリアライズド・ビューの結果セットを作成するために問い合される通常のTimesTen表は、ディテール表と呼ばれます。

注意:
マテリアライズド・ビューは、キャッシュ・テーブルではサポートされません。

図8-1に、ディテール表から作成されたマテリアライズド・ビューを示します。アプリケーションで、ディテール表の更新およびマテリアライズド・ビューからのデータの選択を行うことができます。

図8-1 マテリアライズド・ビュー

マテリアライズド・ビューは、マテリアライズド・ビューの結果セットの更新方法に基づいて、次の2つのタイプに分けられます。

- 同期マテリアライズド・ビュー

- 非同期マテリアライズド・ビュー

また、各タイプのマテリアライズド・ビューを使用する状況の詳細は、「同期マテリアライズド・ビューまたは非同期マテリアライズド・ビューを使用する状況」を参照してください。

同期マテリアライズド・ビュー

同期マテリアライズド・ビューでは、デフォルトで、ディテール表のトランザクション時に、ディテール表の結果セット・データが更新されます。ディテール表でデータが更新されるたびに、結果セットが更新されます。このため、同期マテリアライズド・ビューとディテール表が非同期になることはありません。ただし、パフォーマンスに影響を与える可能性があります。1つのトランザクション(ユーザー・トランザクション)で、ディテール表と同期マテリアライズド・ビューの両方の更新が実行されます。

非同期マテリアライズド・ビュー

このマテリアライズド・ビューは、作成時にデータが移入され、ディテール表との同期がとられます。ディテール表が更新されても、非同期マテリアライズド・ビューはすぐには更新されません。対応するディテール表と非同期になる可能性は常にあります。非同期マテリアライズド・ビューでは、パフォーマンスが優先されるため、結果セットの更新が延期されます。結果セットをリフレッシュするタイミングおよび方法、およびリフレッシュをユーザーが手動で行うか、または事前構成した間隔で自動で行うかは、ユーザーが決定します。非同期マテリアライズド・ビューは、ディテール表を更新するユーザー・トランザクションではリフレッシュされず、常に非同期マテリアライズド・ビュー自体のトランザクションでリフレッシュされます。このため、ユーザー・トランザクションが非同期マテリアライズド・ビューの更新でブロックされることはありません。

非同期リフレッシュには、次のいずれかのリフレッシュ方式を使用できます。

- FAST: 前回の更新以降の増分変更のみが更新されます。

- COMPLETE: 全体リフレッシュが実行されます。

FASTリフレッシュを進めるには、マテリアライズド・ビュー・ログを作成し、非同期マテリアライズド・ビューによって使用される各ディテール表について、遅延増分トランザクションを管理する必要があります。すべての遅延トランザクションを管理する場合、それが複数のFAST非同期マテリアライズド・ビューに含まれている場合でも、各ディテール表には1つのマテリアライズド・ビュー・ログのみ必要です。

マテリアライズド・ビューまたはマテリアライズド・ビュー・ログが関連付けられているディテール表は、破棄できません。

注意:
XLAを非同期マテリアライズド・ビューと組み合せて使用する場合は、DDL文の実行順序を保持できません。通常、表に対する変更を追跡するためのXLAメカニズムと、マテリアライズド・ビューに対する変更を追跡するXLAメカニズムとの間に、処理上の違いはありません。ただし、非同期マテリアライズド・ビューの場合、非同期ビューに関するXLA通知の順序が、関連付けられているディテール表に関する順序、または非同期ビューに関する順序と同じとはかぎらないことに注意してください。たとえば、ディテール表に対する挿入が2つある場合、非同期マテリアライズド・ビューでは、これらの2つが逆の順序で実行される可能性があります。また、更新が、削除してから挿入として処理されたり、複数の挿入や複数の削除など、複数の処理が組み合される可能性があります。処理の順序を保持する必要があるアプリケーションでは、非同期マテリアライズド・ビューを使用しないでください。

同期マテリアライズド・ビューまたは非同期マテリアライズド・ビューを使用する状況

次の項では、同期または非同期マテリアライズド・ビューを使用する状況のガイドラインについて説明します。

- 結合および集計関数によるスーパー・ロック

- マテリアライズド・ビューの最新度

- オーバーヘッド・コスト

結合および集計関数によるスーパー・ロック

同期マテリアライズド・ビューに結合があるか、または集計関数が使用されている場合、スーパー・ロックが生じます。たとえば、1000行から1つの平均を集計する同期マテリアライズド・ビューを持つ1つの表があるとします。同期マテリアライズド・ビューのディテール表のある行を更新すると、その行は、そのトランザクションが終わるまでロックされます。その行を更新しようとする他のトランザクションはすべてブロックされ、そのトランザクションがコミットされるまで待機します。

しかし、その表には同期マテリアライズド・ビューがあるため、このマテリアライズド・ビューも更新されます。このマテリアライズド・ビューに含まれる1つの行がロックされ、変更を反映し更新されます。一方、元表には、マテリアライズド・ビューの同じ行に集計される行が他にも999あります。元表のその他の999行も、これらの行のいずれかを更新しようとするとブロックされ、マテリアライズド・ビューの行のロックが取得できるまで待機することになるため、実質的にロックされていることになります。これはスーパー・ロックと呼ばれます。

同様の影響は結合の場合にも生じます。5つの表を結合する同期マテリアライズド・ビューがあり、その5つのいずれかの表の行を更新すると、更新対象の表に結合されているその他4つの表のすべての行に対してスーパー・ロックが取得されます。

結合と集計関数を組み合せて使用した場合、同期マテリアライズド・ビューでの問題がさらに大きくなります。ただし、COMPLETEリフレッシュを使用する非同期マテリアライズド・ビューの場合、COMPLETEリフレッシュを使用する非同期マテリアライズド・ビュー行では、ロックが保持されるのはリフレッシュ・プロセス中のみであるため、スーパー・ロックが発生する可能性が低くなります。同期マテリアライズド・ビューのスーパー・ロックは、更新トランザクションがコミットされるまで保持されます。したがって、短時間のトランザクションの場合、同期マテリアライズド・ビューのスーパー・ロックは問題になりません。しかし、長時間のトランザクションの場合は、COMPLETEリフレッシュを使用する非同期マテリアライズド・ビューを使用すると、スーパー・ロックの影響を最小限に抑えることができます。

マテリアライズド・ビューの最新度

同期マテリアライズド・ビューは常に新しい状態に保持されており、最新のデータを戻します。非同期マテリアライズド・ビューの場合、前回の更新以降、次回のリフレッシュまで、データが最新ではなくなる可能性があります。常に最新のデータが必要な場合は、同期マテリアライズド・ビューを使用してください。アプリケーションで最新データが必要でない場合は、非同期の使用を検討できます。

たとえば、それぞれ異なる一連の分析問合せを実行するとします。この場合、非同期マテリアライズド・ビューを使用すると、問合せ間の違いによる差異と新規データまたは更新データによる差異を切り分けることができます。

オーバーヘッド・コスト

ユーザー・トランザクションではディテール表が更新されますが、非同期マテリアライズド・ビューは更新されません。非同期マテリアライズド・ビューのリフレッシュは、常に、独立したトランザクションとして実行されます。つまり、ユーザーは他のトランザクションを自由に実行できます。一方、同期マテリアライズド・ビューの場合は、1つのトランザクションがディテール表と任意の同期マテリアライズド・ビューの両方の更新を実行するため、パフォーマンスに影響を与えます。

FASTリフレッシュを使用する非同期マテリアライズド・ビューの非同期マテリアライズド・ビュー・ログにはオーバーヘッドが伴いますが、一般的に同期マテリアライズド・ビューの更新コストのオーバーヘッドより大きくありません。このことは、特に非同期マテリアライズド・ビューが結合によって複雑になっている場合に当てはまります。COMPLETEリフレッシュを使用する非同期マテリアライズド・ビューの場合、ディテール表の更新に伴うオーバーヘッドはありません。

非同期マテリアライズド・ビューのメンテナンス・コストは、遅延させることができます。非同期マテリアライズド・ビュー・ログでは単純な挿入が実行されるのに対して、同期マテリアライズド・ビューのメンテナンスではマテリアライズド・ビューと結合の差分を計算し、その結果を更新処理で適用する必要があるため、非同期マテリアライズド・ビュー・ログのコストは、同期マテリアライズド・ビューの増分メンテナンスに比べてコストがかかりません。更新は、挿入より高コストになります。同期マテリアライズド・ビューの構造が単純になると、このコストの差は縮まります。

マテリアライズド・ビューの処理

この項の内容は次のとおりです。

- マテリアライズド・ビューの作成

- マテリアライズド・ビューまたはマテリアライズド・ビュー・ログの破棄

- マテリアライズド・ビューおよびディテール表に対する制限

- マテリアライズド・ビューによるパフォーマンスへの影響

マテリアライズド・ビューの作成

マテリアライズド・ビューを作成するには、SQL文CREATE MATERIALIZED VIEWを使用します。

注意:
マテリアライズド・ビューを作成するには、適切な権限を持っている必要があります。権限の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の「SQL文」の章で、SQLの構文とともに説明されています。
所有者が、マテリアライズド・ビューが作成されるディテール表に対する権限を取り消すと、そのマテリアライズド・ビューは無効になります。詳細は、「マテリアライズド・ビューのオブジェクト権限」を参照してください。

マテリアライズド・ビューの作成時に、「主キー、外部キーおよび一意索引」の表の場合と同様の方法で、主キーおよびハッシュ表のサイズを指定できます。

マテリアライズド・ビューの例では、次の2つの表を使用します。

CREATE TABLE customer(custId int not null,
custName char(100) not null,
Addr char(100),
Zip int,
Region char(10),
PRIMARY KEY (custId));

CREATE TABLE bookOrder(orderId int not null,
custId int not null,
book char(100),
PRIMARY KEY (orderId),
FOREIGN KEY (custId) REFERENCES Customer(custId));

次の項では、マテリアライズド・ビューの作成の詳細および例を示します。

- 同期マテリアライズド・ビューの作成

- 非同期マテリアライズド・ビューの作成

- CREATE MATERIALIZED VIEW文でのSELECT問合せ

同期マテリアライズド・ビューの作成

同期マテリアライズド・ビューは、ディテール表が更新されるたびに自動的に更新されます。同期マテリアライズド・ビューは、CREATE MATERIALIZED VIEW文を使用して作成できます。

次のように入力すると、SampleMVという同期マテリアライズド・ビューが作成されます。このマテリアライズド・ビューによって、前述のcustomerおよびbookOrderディテール表の選択した列から結果セットが生成されます。

CREATE MATERIALIZED VIEW SampleMV AS
SELECT customer.custId, custName, orderId, book
FROM customer, bookOrder
WHERE customer.custId=bookOrder.custId;

非同期マテリアライズド・ビューの作成

非同期マテリアライズド・ビューは、そのマテリアライズド・ビューの作成時に構成したリフレッシュ方式およびリフレッシュ間隔に従って更新されます。

非同期マテリアライズド・ビューを作成する場合はREFRESH句を使用し、少なくとも次のいずれか1つを指定します。

- リフレッシュ方式: 非同期マテリアライズド・ビューの場合は、リフレッシュ方式としてFASTとCOMPLETEのいずれかを指定します。FASTは増分リフレッシュを示します。COMPLETEは全体リフレッシュを示します。リフレッシュ方式を省略した場合、COMPLETEがデフォルトのリフレッシュ方式になります。FASTを指定する場合は、マテリアライズド・ビューに関連付けられている各ディテール表に対して非同期マテリアライズド・ビュー・ログを作成する必要があります。

注意:
FASTリフレッシュでは、集計関数および外部結合はサポートされていません。

- リフレッシュ間隔:

- 手動更新: リフレッシュ間隔が指定されていない場合は、デフォルトで手動で更新することになります。ビューを手動でリフレッシュするには、REFRESH MATERIALIZED VIEW文を使用します(この文の詳細は、この項の最後を参照してください)。

- コミットのたびにリフレッシュを指定: NUMTODSINTERVL()を指定せずにNEXT SYSDATEを指定すると、ディテール表を更新するユーザー・トランザクションがコミットされるたびに、リフレッシュが実行されます。このリフレッシュは、常に、別個のトランザクションとして実行されます。ユーザー・トランザクションはリフレッシュの完了を待機しません。コミットのたびにリフレッシュするオプションは、高速リフレッシュ方式の場合にのみサポートされます。

- 間隔の指定: NEXT SYSDATE + NUMTODSINTERVAL(IntegerLiteral,IntervalUnit)句を使用すると、指定した間隔で非同期マテリアライズド・ビューが更新されます。このオプションは、FASTとCOMPLETEの両方のリフレッシュ方式でサポートされます。
この句は、指定した間隔でマテリアライズド・ビューがリフレッシュされることを指定します。IntegerLiteralは整数である必要があります。IntervalUnitは、'DAY'、'HOUR'、'MINUTE'、'SECOND'のいずれかの値である必要があります。

次回のリフレッシュ時刻を決めるため、最後に行われたリフレッシュの時刻が保存されます。前回のリフレッシュ以降に、非同期マテリアライズド・ビューのディテール表のいずれにも変更がなかった場合、リフレッシュはスキップされます。構成済のリフレッシュ間隔を変更するには、非同期マテリアライズド・ビューを破棄して再作成する必要があります。

FASTリフレッシュ方式を使用する場合、遅延されたトランザクションはマテリアライズド・ビュー・ログに保存されます。このため、非同期マテリアライズド・ビューを作成する前に、FASTリフレッシュを使用する非同期マテリアライズド・ビューに含まれる各ディテール表に対して、マテリアライズド・ビュー・ログを作成する必要があります。ディテール表が、FASTリフレッシュを使用する複数の非同期マテリアライズド・ビューによって使用される場合であっても、各ディテール表で持つことができるマテリアライズド・ビューは1つのみです。非同期マテリアライズド・ビューで参照されるすべての列は、対応する非同期マテリアライズド・ビュー・ログに含まれている必要があります。1つのディテール表に対して、FASTリフレッシュの非同期マテリアライズド・ビューが2つ以上作成されている場合は、そのディテール表に対して作成された複数の非同期マテリアライズド・ビューで使用されるすべての列が、非同期マテリアライズド・ビュー・ログに含まれていることを確認してください。

次の例では、作成後、1時間ごとに遅延トランザクションを更新するFASTリフレッシュを使用する非同期マテリアライズド・ビューを作成します。まず、ディテール表customerおよびbookOrderそれぞれにマテリアライズド・ビュー・ログを作成します。次の文は、customerとbookOrderに対して、FASTリフレッシュ用に遅延トランザクションを追跡するためのマテリアライズド・ビュー・ログを作成します。customerのマテリアライズド・ビュー・ログは、次のように主キーと顧客名を追跡します。

CREATE MATERIALIZED VIEW LOG ON customer WITH PRIMARY KEY (custName);

注意:
CREATE MATERIALIZED VIEW LOG構文では、WITH PRIMARY KEYを指定した場合、またはPRIMARY KEYまたはROWIDのいずれも指定しなかった場合に、主キーが含められます。マテリアライズド・ビュー・ログに含める主キー以外の列は、すべてカッコ付きの列のリストで指定する必要があります。

bookorder表のマテリアライズド・ビュー・ログは、主キーのorderIdとcustId列およびbook列を追跡します。

CREATE MATERIALIZED VIEW LOG ON bookOrder WITH (custId, book);

ディテール表customerとbookOrderの両方にマテリアライズド・ビュー・ログを作成した後、非同期マテリアライズド・ビューを作成できます。非同期マテリアライズド・ビューには、すべてのディテール表についてROWIDと主キー列のいずれかを含める必要があります。

次の例では、customerおよびbookOrderディテール表の選択された列から結果セットを生成する、SampleAMVという非同期マテリアライズド・ビューを作成します。この文では、作成時点から1時間ごとに遅延トランザクションを更新するFASTリフレッシュを指定しています。

CREATE MATERIALIZED VIEW SampleAMV
REFRESH
FAST
NEXT SYSDATE + NUMTODSINTERVAL(1, 'HOUR')
AS SELECT customer.custId, custName, orderId, book
FROM customer, bookOrder
WHERE customer.custId=bookOrder.custId;

マテリアライズド・ビューを手動でリフレッシュする場合は、REFRESH MATERIALIZED VIEW文を実行します。マテリアライズド・ビューは、REFRESH間隔が指定されていても、いつでも手動でリフレッシュできます。たとえば、ディテール表に複数の更新が発生した場合、次の文を使用してSampleAMVマテリアライズド・ビューを手動でリフレッシュできます。

REFRESH MATERIALIZED VIEW SampleAMV;

CREATE MATERIALIZED VIEW文でのSELECT問合せ

マテリアライズド・ビューの内容を定義するために使用するSELECT問合せは、『Oracle TimesTen In-Memory Database SQLリファレンス』の「SQL文」に関する説明で説明する最上位のSQL SELECT文に似ていますが、いくつかの制限があります。制限については、『Oracle TimesTen In-Memory Database SQLリファレンス』の「CREATE MATERIALIZED VIEW」を参照してください。

マテリアライズド・ビューまたはマテリアライズド・ビュー・ログの破棄

マテリアライズド・ビューを破棄するには、DROP VIEW文を実行します。

次の文では、マテリアライズド・ビューsampleMVが破棄されます。

DROP VIEW sampleMV;

表を参照している非同期マテリアライズド・ビューがない場合、その表のマテリアライズド・ビュー・ログを破棄できます。たとえば、マテリアライズド・ビューsampleAMVを破棄した場合、次の文を実行すると、関連付けられているマテリアライズド・ビュー・ログが破棄されます。

DROP MATERIALIZED VIEW LOG ON customer;
DROP MATERIALIZED VIEW LOG ON bookOrder;

SQL文の構文については、『Oracle TimesTen In-Memory Database SQLリファレンス』の「SQL文」の章を参照してください。

マテリアライズド・ビュー・ログに関連付けられている表の特定

マテリアライズド・ビュー・ログは、TimesTenのシステム表ではMVLOG$_detailTableIdという名前の表になります(ここで、detailTableId作成された表の表IDです)。表IDと表名は、どちらもSYS.TABLESに記録されます。たとえば、マテリアライズド・ビュー・ログのファイル名がMVLOG$_507244の場合、次のようにしてSYS.TABLESの表IDが507244の行から、表名を取得できます。

select tblname from sys.tables where tblid = 507244;
< T1 >
1 row found.

マテリアライズド・ビューおよびディテール表に対する制限

マテリアライズド・ビューは、読取り専用表であるため、直接には更新できません。つまり、レプリケーション、XLAまたはキャッシュ・エージェントによるINSERT文、DELETE文またはUPDATE文でマテリアライズド・ビューを更新することはできません。

たとえば、マテリアライズド・ビューの行を更新しようとすると、次のエラーが戻されます。

805: Update view table directly has not been implemented

マテリアライズド・ビューのその他の実装についてよく理解している読者にとっては一般的ですが、TimesTenのビューには、次の特性があります。

- ディテール表はレプリケートできますが、マテリアライズド・ビューはレプリケートできません。

- マテリアライズド・ビューおよびそのディテール表のいずれも、キャッシュ・グループの一部にはできません。

- また、マテリアライズド・ビューに対して参照索引は定義できません。

- マテリアライズド・ビューを破棄するには、DROP VIEW文を使用する必要があります。

- マテリアライズド・ビューを変更することはできません。DROP VIEW 文で破棄してから、CREATE MATERIALIZED VIEW文で新しいマテリアライズド・ビューを作成する必要があります。

- マテリアライズド・ビューは、アプリケーションで明示的に作成する必要があります。TimesTenの問合せオプティマイザに、マテリアライズド・ビューを自動的に作成する機能はありません。

- TimesTenの問合せオプティマイザが、ディテール表に対する問合せをリライトしてマテリアライズド・ビューを参照することはありません。マテリアライズド・ビューを使用する場合は、アプリケーションの問合せでビューを直接参照する必要があります。

- マテリアライズド・ビューの作成に使用するSQLにはいくつかの制限があります。詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE MATERIALIZED VIEWに関する説明を参照してください。

マテリアライズド・ビューによるパフォーマンスへの影響

次の項では、各タイプのマテリアライズド・ビューのパフォーマンスへの影響について説明します。

- 非同期マテリアライズド・ビューの場合のパフォーマンス管理

- 同期マテリアライズド・ビューの場合のパフォーマンス管理

非同期マテリアライズド・ビューの場合のパフォーマンス管理

パフォーマンス管理のために、マテリアライズド・ビューのリフレッシュを最適な時間まで遅延できます。マテリアライズド・ビュー・ログ、ディテール表およびマテリアライズド・ビューの行は、リフレッシュ中にロックされることがあります。ディテール表を更新するユーザー・トランザクションが、このロックによって妨げられる場合、ユーザーはリフレッシュ間隔を調整できます。パフォーマンスが最優先され、非同期マテリアライズド・ビューとディテール表の非同期化を容認できる場合は、システム負荷が低い時間にリフレッシュが実行されるようにリフレッシュ間隔を設定します。

- FASTリフレッシュでは、マテリアライズド・ビュー・ログに取得された変更内容に基づいて、マテリアライズド・ビューが増分更新されます。このリフレッシュにかかる時間は、マテリアライズド・ビュー・ログに取得された変更の数およびCREATE MATERIALIZED VIEW文で使用されているSELECT文の複雑さによって異なります。リフレッシュが実行されるたびに、マテリアライズド・ビュー・ログの処理済の行は削除されます。
リフレッシュのパフォーマンスを向上させるため、ディテール表、マテリアライズド・ビュー・ログ表およびマテリアライズド・ビューの表統計を定期的に更新してください。ビューに結合が含まれている場合は、いずれかのディテール表に行を挿入する前に表統計を更新します。表統計は、統計を計算するための2つの組込みプロシージャttOptUpdateStatsおよびttOptEstimateStatsのうち1つを使用して更新できます。

注意:
表統計の更新、および統計を更新する適切なときの詳細は、「正確な統計または推定統計の計算」を参照してください。

- 完全リフレッシュは、作成時のマテリアライズド・ビューの初期ロードに似ています。このリフレッシュにかかる時間は、ディテール表の行数によって異なります。

同期マテリアライズド・ビューの場合のパフォーマンス管理

UPDATEおよびINSERTで更新処理を行う場合、更新する表をマテリアライズド・ビューで参照していると、パフォーマンスに影響することがあります。パフォーマンスへの影響は、次のような多数の要因に応じて異なります。

- マテリアライズド・ビューの性質: ディテール表の数、外部結合または集計の使用の有無。

- ディテール表およびマテリアライズド・ビューに存在する索引のタイプ。

- 変更の影響を受けるマテリアライズド・ビュー行の数。

ビューは、問合せ結果の最新の永続コピーです。ビューを最新の状態に維持するには、ビューのディテール表の変更時に、TimesTenでビュー・メンテナンスを実行する必要があります。たとえば、表T1、T2およびT3から選択するVというビューがある場合、T1への挿入、T2への更新、T3からの削除などを実行すると常に、TimesTenでビュー・メンテナンスが実行されます。

ビュー・メンテナンスの実行には、通常のデータベース処理と同様に適切な索引が必要です。索引がない場合、ビュー・メンテナンスのパフォーマンスは低くなります。

ディテール表に対する更新文、挿入文、削除文のすべての処理には実行計画が存在します(「TimesTen問合せオプティマイザ」を参照)。たとえば、T1の行を更新すると、実行計画の第1段階が開始します。ビューVが更新された後、第2段階でT1が更新されます。

ビュー・メンテナンスを高速に行うには、次の手順を実行して、ディテール表を更新するすべての処理の計画を評価する必要があります。

1. ディテール表に対して頻繁に実行される更新文や削除文でのすべてのWHERE句を調べます。索引キーを使用する句に注目してください。たとえば、次の処理が、アプリケーションの処理時間の95%を占めているとします。

UPDATE T1 set A=A+1 WHERE K1=? AND K2=?
DELETE FROMT2 WHERE K3=?

この場合、注目するキーは(K1、K2)およびK3です。

2. ビューでこれらのすべてのキー列が選択されていることを確認します。この例では、K1、K2およびK3がビューで選択されている必要があります。

3. これらの各キーに対して、ビューの索引を作成します。この例では、(V.K1、V.K2)に対する索引およびV.K3に対する索引の2つの索引がビューに必要です。これらの索引が一意である必要はありません。この例では、ビューの列の名前は表の列の名前と同じですが、別の名前を指定することもできます。

この方法では、ディテール表を更新すると、対応するビューの更新にWHERE句が使用されます。これによって、メンテナンスは1つのバッチで行われ、パフォーマンスが向上します。

ただし、前述の方法を使用できない場合があります。たとえば、アプリケーションにディテール表を更新するメソッドが多数存在することがあります。その場合、アプリケーションがビューで非常に多数の項目を選択したり、ビューに対して非常に多数の索引を作成することになり、予想以上の領域と処理能力が使用される可能性があります。次に示す別の方法を行います。

1. ビューのFROM句に指定されている各表(ディテール表)で、UPDATE文、INSERT文およびCREATE VIEW文によって頻繁に変更されている表を確認します。たとえば、ビューのFROM句に表T1、T2、T3、T4およびT5があり、その中でT2とT3のみが頻繁に変更されているとします。

2. ビューでこれらの表のrowidが選択されることを確認してください。この例では、T2.rowidとT3.rowidがビューで選択されている必要があります。

3. これらの各rowid列に対してビューの索引を作成します。この例では、列の名前はT2rowidおよびT3rowidで、索引はV.T2rowidおよびV.T3rowidに対して作成されます。

この方法では、バッチ単位ではなく、行単位でビュー・メンテナンスが行われます。ただし、ビューとそのディテール表の間では行が非常に効率的に照合されるため、高速でメンテナンスされます。通常、最初の方法ほど高速ではありませんが、有効な方法です。

索引の理解

索引は、表の検索のパフォーマンスを大幅に向上させる補助的なデータ構造です。索引アドバイザを使用すると、特定のSQLワークロードに対して索引を推奨できます。詳細は、「索引アドバイザを使用した索引の推奨」を参照してください。

問合せの実行を高速化するために、索引は問合せオプティマイザによって自動的に使用されます。問合せオプティマイザの詳細は、「TimesTen問合せオプティマイザ」を参照してください。

索引は、表の各行で、索引を設定した列に一意の値を指定することによって一意なものとして指定できます。一意索引は、NULL値可能の列に対しても作成できます。SQL標準に従って、複数のNULL値を一意索引に指定できます。

TimesTenでは、データ値をソートする場合、NULL値はNULL以外のすべての値より大きい値とみなされます。NULL値の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のNULL値に関する説明を参照してください。

索引の作成、破棄または変更を行う処理を実行するには、適切な権限を持っている必要があります。権限の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の「SQL文」の章で、すべてのSQL文の構文とともに説明されています。

次の項では、索引の管理方法について説明します。

- 索引タイプの概要

- 索引の作成

- 索引の変更

- 索引の破棄

- 索引サイズの見積り

- 索引アドバイザを使用した索引の推奨

索引タイプの概要

TimesTenでは、表への高速アクセスが可能になる次の3つのタイプの索引があります。

- 範囲索引: 範囲索引は、特定の範囲内の列値を持つ行を検索する場合に有効です。範囲索引は、表の1つ以上の列に対して作成できます。1つの表につき最大32の範囲索引を作成できます。
範囲索引と等価結合は一致検索および範囲検索(以上、以下など)で使用できます。あるフィールドに主キーを設定してFIELD > 10かどうかを確認する場合、主キー索引では検索は効率的に行われず、別の索引の方が効率的です。

範囲索引の作成方法の詳細については、『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE INDEXに関する説明を参照してください。

- ハッシュ索引: ハッシュ索引は、一致検索の実行に便利です。ハッシュ索引は次のいずれかの方法で作成されます。

- CREATE INDEX文を使用すると、表またはマテリアライズド・ビューの1つ以上の列にハッシュ索引または一意のハッシュ索引を作成できます。

- CREATE TABLE... UNIQUE HASH ON文を使用すると、表の作成時に表の主キーに一意のハッシュ索引を作成できます。

ハッシュ索引作成の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』で、CREATE INDEXおよびCREATE TABLEに関する説明を参照してください。ハッシュ索引を作成する方法の例は、例8-4を参照してください。ハッシュ表のサイズを設定する方法の詳細は、「ハッシュ索引サイズの適切な設定」を参照してください。

注意:
完全一致検索の場合、ハッシュ索引は範囲索引よりも高速になりますが、範囲索引より多くの領域が必要となります。範囲指定の検索の場合、ハッシュ索引は使用できません。
範囲索引はインメモリー・データ管理に最適化されており、列の値に基づく効率的なソートが可能です。

TimesTenでは、問合せの実行を高速化する問合せの処理中に一時ハッシュ索引または一時範囲索引が自動的に作成されることがあります。

- ビットマップ索引: ビットマップ索引は、カーディナリティの低い列のデータを検索および取得する場合に有効です。つまり、これらの列は、使用可能な数個の一意の値のみを持つことができます。ビットマップ索引では、行内の一意の値に関する情報がビットマップにエンコードされます。ビットマップの各ビットが表の行に対応します。ビットマップ索引は、一意の値がそれほど多くない列に使用します。このような列の例として、性別を2つの値のいずれかとして記録する列があげられます。
ビットマップ索引を使用すると、ANDおよびOR演算子で連結した複数の条件を複数の列に対して指定する、複雑な問合せのパフォーマンスが向上します。

ビットマップ索引の作成方法などの詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE INDEXに関する説明を参照してください。

注意:
または、データに高速にアクセスするために、ROWIDによる検索を実行することもできます。詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のROWIDデータ型に関する説明を参照してください。

索引の作成

索引を作成するには、SQL文CREATE INDEXを実行します。TimesTenでは、索引名は大文字に変換されます。

索引には所有者が存在します。索引の所有者は、基礎となる表を作成したユーザーです。TimesTenによって作成される索引(システム表の索引など)のユーザー名はSYSですが、レプリケーション時に作成される場合はTTREPになります。

注意:
LOB列には、索引(範囲、ハッシュまたはビットマップ)を作成できません。

例8-4 索引の作成

次の文では、表NameIDの列CustIDに索引IxIDが作成されます。

CREATE INDEX IxID ON NameID (CustID);

次の文では、表作成の一部としてcustomer表に一意のハッシュ索引が作成されます。

CREATE TABLE customer
(cust_id NUMBER NOT NULL PRIMARY KEY,
cust_name CHAR(100) NOT NULL,
addr CHAR(100),
zip NUMBER,
region CHAR(10))
UNIQUE HASH ON (cust_id) PAGES = 30;

次の文では、顧客名について、customer表に一意でないハッシュ索引が作成されます。

Command> CREATE HASH INDEX custname_idx ON customer(cust_name);

各種の索引とその作成方法に関するその他の例については、『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE INDEXに関する説明およびALTER TABLEに関する説明を参照してください。

索引の変更

ALTER TABLE文を使用して主キー制約を追加(または変更)し、範囲索引またはハッシュ索引の使用を指定できます。

注意:
CREATE INDEX文で作成した索引の場合、索引を変更してハッシュ索引から範囲索引へ、または範囲索引からハッシュ索引へ変換することはできません。

ALTER TABLE文のUSE RANGE INDEX句を使用すると、主キー制約でハッシュ索引のかわりに範囲索引を使用するように指定できます。ALTER TABLE文のUSE HASH INDEX節を使用すると、主キー制約で範囲索引のかわりにハッシュ索引を使用するように指定できます。詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のALTER TABLEに関する説明を参照してください。

索引の破棄

索引を一意に参照するには、アプリケーションで所有者および名前の両方を指定する必要があります。アプリケーションで所有者を指定しなかった場合、TimesTenは、コール元のユーザー名の下にある索引を検索し、次にユーザー名SYSの下にある索引を検索します。

例8-5 索引の破棄

次の例では、IxIDという索引を破棄します。

DROP INDEX IxID;

TimesTen索引を破棄するには、SQL文DROP INDEXを実行します。表を破棄すると、その表のすべての索引が自動的に破棄されます。

索引サイズの見積り

TimesTenデータベースのサイズの増加は、最初の接続時に行うことができます。データベースのサイズを変更する必要をなくすには、データベースの最終的なサイズを少なく見積もらないようにする必要があります。任意の索引を含むデータベースのサイズの見積りには、ttSizeユーティリティを使用します。

次の例は、ttSizeユーティリティによる行数、インライン行のバイト数、表の索引のサイズおよび表の合計サイズの見積りを示します。

ttSize -tbl Pat.tab1 MyDb

Rows = 2

Total in-line row bytes = 17524
Indexes:

Bitmap index PAT.BITMAP_ID adds 6282 bytes
Total index bytes = 6282

Total = 23806

索引アドバイザを使用した索引の推奨

適切な索引セットを使用すると、問合せパフォーマンスが向上します。索引アドバイザを使用すると、特定のSQLワークロードのパフォーマンスを向上させるための索引を推奨できます。索引アドバイザは、読取り集中型の複雑な問合せを対象としています。書込み集中型のワークロードには、索引アドバイザの使用はお薦めしません。

索引アドバイザは、SQLワークロードを評価し、結合、単一表スキャン、およびORDER BYまたはGROUP BY操作のパフォーマンスを向上させることができる索引を推奨します。索引アドバイザは、マテリアライズド・ビュー用の実表やキャッシュ・グループ内の表など、特定の目的に使用する表を区別しません。SQLワークロードの問合せで表が使用されるかぎり、索引アドバイザはその表について索引を推奨することができます。

索引アドバイザは、推奨される索引ごとにCREATE文を生成し、実行する文を選択できます。索引アドバイザは次の索引を推奨できるため、データベース管理者は、新しい索引に推奨された各CREATE文を適用する前に見直す必要があります。

- 既存の索引の複製になっている索引。

- SQLワークロード時に作成および削除される表、または表の列の索引。ただし、表、または表の列を作成するDDLの後で、かつ、その削除の前で、SQLワークロードで推奨される索引にCREATE文を追加できます。

- データが一意でないデータ・セット用の一意な索引など、作成することができない索引。この場合は、この推奨を無視する必要があります。

- 索引作成オプションでは、UNIQUEまたは一意でない索引のいずれかとして索引を作成できます。索引アドバイザはどちらの索引タイプも推奨しています。推奨される両方の索引が同じ名前ため、それらの索引のうちの1つのみを作成できます。オプティマイザは、指定されたワークロードにはUNIQUE索引が適していると考えますが、一意でない索引を作成することも選択できます。列に一意の値のみが含まれている場合は、UNIQUE索引の作成を検討してください。列に一意でない値が含まれている場合は、一意でない索引の作成を検討してください。

索引アドバイザは、次のことに対応していません。

- メモリー使用率を最適化しません。

- メンテナンスのコストを考慮しません。

- 有用でない場合は既存の索引を削除するということは推奨しません。

- グローバル一時表用の索引は推奨しません。

推奨される手順では、次のように索引アドバイザを使用します。

- 索引アドバイザを実行するための準備

- 索引推奨項目を生成するために使用するデータの取得

- 索引推奨項目およびデータ収集情報の取得

- 索引アドバイザ用に収集したデータを破棄してデータをファイナライズする

索引アドバイザを実行するための準備

索引アドバイザを実行するには、オプションで次の手順を実行する必要があります。

1. 索引アドバイザは問合せ計画に依存するため、索引アドバイザを有効にしてワークロードを実行する前に、SQLワークロードに使用する関連オプティマイザ・ヒントを設定します。オプティマイザ・ヒントの詳細については、「オプティマイザ・ヒントを使用して実行計画を変更する」を参照してください。

2. SQLワークロードに含まれている表の統計を更新し、取得時に文を強制して再準備させます。これにより、データ収集の最新の統計が提供され、最新の統計に基づいて文が再準備されます。

SQLワークロードに含まれている表の統計を、組込みプロシージャttOptUpdateStats、ttOptEstimateStatsまたはttOptSetTblStatsのうちの1つで更新します。組込みプロシージャでは、invalidateパラメータを1に設定して、示されている表を参照しているすべてのコマンドを無効にし、再実行時に自動的に再準備されるようにこれらのコマンドを強制します。これにより、統計は確実に最新状態になります。

- ttOptUpdateStats組込みプロシージャは、表のすべての統計を完全に更新します。ただし、これには時間がかかります。

- ttOptEstimateStatsは、示された表のわずかな割合の行に基づいて統計を評価します。

- ttOptSetTblStatsは、ユーザーによって指定された既知の値に統計を設定します。

注意:
組込みプロシージャの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttOptUpdateStats」、「ttOptEstimateStats」および「ttOptSetTblStats」を参照してください。

次の例は、これらの表のうちの10%の行のランダム・サンプルを評価することで、現行のユーザー用のすべての表の統計を推定します。また、これらの表を参照する、すでに準備されたすべてのコマンドを無効にします。

CALL ttOptEstimateStats ( '', 1, '10 PERCENT' );

索引推奨項目を生成するために使用するデータの取得

次のようにして、ttIndexAdviceCaptureStartおよびttIndexAdviceCaptureEnd組込みプロシージャをコールして、索引アドバイザが索引推奨項目を生成するために必要な情報を取得します。

1. ttIndexAdviceCaptureStart組込みプロシージャをコールして、索引情報を収集するプロセスを開始します。

2. SQLワークロードを実行します。

3. ttIndexAdviceCaptureEnd組込みプロシージャをコールして、索引情報収集プロセスを終了します。

注意:
データ収集プロセスの終了後、「索引推奨項目およびデータ収集情報の取得」に説明されているとおりに、索引推奨項目を取得できます。

ttIndexAdviceCaptureStart組込みプロシージャをコールしてデータ収集プロセスを開始する場合、次のものを指定します。

- captureLevelパラメータでは、収集する索引情報を現行の接続向けまたはデータベース全体向けのいずれにするかを指定します。独立した接続に対して競合することなく、複数の接続レベルの取得を同時に実行できます。データベースレベルの取得は、接続レベルの取得と並行して実行できます。データベースレベルの取得と接続レベルの取得の間には競合がないため、データベースレベルの取得を開始したときにすでに進行中の未処理の接続レベルの取得は、目的どおりに完了します。ただし、最初のデータベースレベルの取得が引き続き有効な場合にデータベースレベルの取得の2番目のリクエストを開始すると、エラーが返されます。また、最初の接続レベルの取得が引き続き有効な場合に同じ接続から接続レベルの取得の2番目のリクエストが開始されるときも、エラーが返されます。
データベースレベルの取得用にttIndexAdviceCaptureStartを起動すると、すでに進行中の未処理の接続レベルの取得は完了します。

- captureModeパラメータには、次のいずれかのシナリオでデータ収集を実行することを指定します。

- SQLワークロードの現行の実行を使用して索引情報の収集を実行します。

- 索引情報の収集は、SQLワークロードの現行の実行の基盤にするのではなく、既存の計算済の統計および問合せ計画の分析の基盤にします。このシナリオでは、SQL文は準備されますが、実行はされません。このモードは、接続レベルの取得でのみ実行できます。

取得を完了するには、ttIndexAdviceCaptureEnd組込みプロシージャをコールすることで、同じ接続からの有効な接続レベルの取得、または有効なデータベースレベルの取得は終了します。データベースレベルの取得の完了には、ADMIN権限が必要です。

取得中に接続が失敗すると、次のことが起きます。

- 取得が接続レベルの取得の場合、取得は終了し、関連するすべてのリソースは解放されます。

- 取得がデータベースレベルの取得の場合、ADMIN権限を持った別のユーザーが接続してttIndexAdviceCaptureEnd組込みプロシージャを起動し、データベースレベルの取得を終了するまで、取得は続行されます。

取得中に一時領域が一杯になると、有効な取得は終了し、取得中に収集されたデータは保存されます。

注意:
取得後にttIndexAdviceCaptureDropを実行して一時領域を解放します。ttIndexAdviceCaptureDropの詳細については、「索引アドバイザ用に収集したデータを破棄してデータをファイナライズする」を参照してください。

次の例では、SQLワークロードの現行の実行に対応した接続レベルにおける索引アドバイザ用の収集を開始します。

Call ttIndexAdviceCaptureStart(0,0);

次の例では、接続レベルの取得用の収集を終了します。

Call ttIndexAdviceCaptureEnd(0)

注意:
組込みプロシージャの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttIndexAdviceCaptureStart」および「ttIndexAdviceCaptureEnd」を参照してください。

索引推奨項目およびデータ収集情報の取得

1. ttIndexAdviceCaptureInfoGet組込みプロシージャをコールして、索引アドバイザ用のデータ収集概要情報を取得します。

2. ttIndexAdviceCaptureOutput組込みプロシージャをコールして、索引推奨項目を取得します。

注意:
これらの組込みプロシージャは、データ収集概要および索引アドバイザの推奨を取得します。目的のデータのいずれか、または両方を実行します。

3. DBAが索引推奨項目の作成文を評価した後で、目的の索引作成推奨項目を適用します。

ttIndexAdviceCaptureInfoGetを使用したデータ収集情報の取得

ttIndexAdviceCaptureInfoGet組込みプロシージャは、索引アドバイザ用に収集されたデータに関する情報を取得します。接続レベルの取得とデータベース・レベルの取得のどちらでも、1行のみが返されます。

注意:
データベースレベルの取得による行は、ADMIN権限を持っているユーザーにのみ返されます。

ttIndexAdviceCaptureInfoGet組込みプロシージャがデータを取得するのは、次の場合です。

- データの取得が開始されて、終了していない場合。

- 前の取得が開始されて停止されていて、データが削除されていない場合。

注意:
進行している取得がないか、データが存在していない場合、行は返されません。

返される行には、次の情報が含まれています。

- 取得の状態: 取得が完了すると0が返されます。取得が引き続き進行中の場合は1が返されます。

- 該当する場合は接続識別子。

- この取得に設定されている取得レベルおよびモード。

- 取得間隔の間に準備されて実行された文の数。

- 取得が開始されて停止された時刻。

次に、363の準備済の文および369の実行済の文について完了した接続レベルの取得に関する取得情報を示します。

Command> CALL ttIndexAdviceCaptureInfoGet();
< 0, 1, 0, 0, 363, 369, 2012-07-27 11:44:08.136833, 2012-07-27 12:07:35.410993 >
1 row found.

注意:
この組込みプロシージャの詳細および構文は、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttIndexAdviceCaptureInfoGet」を参照してください。

ttIndexAdviceCaptureOutputを使用した索引推奨項目の取得

ttIndexAdviceCaptureOutput組込みプロシージャは、指定したレベル(接続レベルまたはデータベースレベル)で最後に記録された取得から索引推奨項目のリストを取得します。リストには、推奨索引ごとにCREATE文が含まれています。

接続レベルの取得について索引推奨項目をリクエストするには、取得を開始した同じ接続内でcaptureLevelを0に設定したttIndexAdviceCaptureOutputを実行します。データベースレベルの取得の場合、ユーザーがADMIN権限を持っている接続でcaptureLevelを1に設定したttIndexAdviceCaptureOutputを実行します。

返される行には、次のものが含まれています。

- stmtCount - 実行されるSQLワークロードを加速するために索引が役立つ回数。

- createStmt - 推奨索引を作成するために使用できる実行可能文。これらの文のすべてのデータベース・オブジェクト名は完全に修飾されます。

次の例は、HR.PURCHASE表でPURCHASE_i1という索引に対応したCREATE文を示しています。この索引は、このSQLワークロードに対して4回役立ちます。

CALL ttIndexAdviceCaptureOutput();
< 4, create index PURCHASE_i1 on HR.PURCHASE(AMOUNT); >
1 row found.

注意:
この組込みプロシージャの詳細および構文は、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttIndexAdviceCaptureOutput」を参照してください。

索引アドバイザ用に収集したデータを破棄してデータをファイナライズする

DBAによって承認された新しい索引に対してCREATE文を適用した後、索引アドバイザ用に収集した取得データを破棄できます。ttIndexAdviceCaptureDrop組込みプロシージャは、接続レベルまたはデータベースレベルの取得にできる、指定したcaptureLevel用に収集された既存のデータを削除します。

Call ttIndexAdviceCaptureDrop(0);

接続レベルとデータベースレベルの両方の取得を削除するには、この組込みプロシージャを2回コールする必要があります。同じレベルで取得が進行中の間は、この組込みプロシージャを起動することはできません。

注意:
この組込みプロシージャの詳細および構文は、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttIndexAdviceCaptureDrop」を参照してください。

「索引アドバイザを実行するための準備」と「索引推奨項目およびデータ収集情報の取得」に記載された手順を、SQLワークロードが索引推奨項目をそれ以上表示せずに実行されるまで繰り返すことができます。新しい索引が適用された表の統計を更新し続けることができ、新しい索引が推奨されるかどうかを確認するために索引アドバイザを再実行できます。

索引アドバイザの組込みプロシージャの使用例

次に、SQLワークロード用のデータ収集フロー、および索引アドバイザの組込みプロシージャによって提供される索引アドバイスを示します。

Command> CALL ttOptUpdateStats();

Command> CALL ttIndexAdviceCaptureStart();

Command> SELECT employee_id, first_name, last_name FROM employees;
< 100, Steven, King >
< 101, Neena, Kochhar >
< 102, Lex, De Haan >
< 103, Alexander, Hunold >
< 104, Bruce, Ernst >
...
< 204, Hermann, Baer >
< 205, Shelley, Higgins >
< 206, William, Gietz >
107 rows found.

Command> SELECT MAX(salary) AS MAX_SALARY
FROM employees
WHERE employees.hire_date > '2000-01-01 00:00:00';
< 10500 >
1 row found.

Command> SELECT employee_id, job_id FROM job_history
> WHERE (employee_id, job_id) NOT IN (SELECT employee_id, job_id
> FROM employees);
< 101, AC_ACCOUNT >
< 101, AC_MGR >
< 102, IT_PROG >
< 114, ST_CLERK >
< 122, ST_CLERK >
< 176, SA_MAN >
< 200, AC_ACCOUNT >
< 201, MK_REP >
8 rows found.

Command> WITH dept_costs AS (
> SELECT department_name, SUM(salary) dept_total
> FROM employees e, departments d
> WHERE e.department_id = d.department_id
> GROUP BY department_name),
> avg_cost AS (
> SELECT SUM(dept_total)/COUNT(*) avg
> FROM dept_costs)
> SELECT * FROM dept_costs
> WHERE dept_total >
> (SELECT avg FROM avg_cost)
> ORDER BY department_name;
< Sales, 304500 >
< Shipping, 156400 >
2 rows found.

Command> call ttIndexAdviceCaptureEnd();

Command> call ttIndexAdviceCaptureInfoGet();
< 0, 1, 0, 0, 9, 6, 2012-07-27 11:44:08.136833, 2012-07-27 12:07:35.410993 >
1 row found.

Command> call ttIndexAdviceCaptureOutput();
< 1, create index EMPLOYEES_i1 on HR.EMPLOYEES(SALARY); >
< 1, create index EMPLOYEES_i2 on HR.EMPLOYEES(HIRE_DATE); >
2 rows found.

Command> call ttIndexAdviceCaptureDrop();

行の理解

行は、TimesTenデータを保存するために使用されます。TimesTenでは、行内のフィールドに対して次に示すいくつかのデータ型がサポートされています。

- 1バイト、2バイト、4バイト、8バイトの整数。

- 4バイトおよび8バイトの浮動小数点数。

- ASCIIおよびUnicodeの固定長または可変長の文字列。

- 固定長および可変長のバイナリ・データ。

- 固定長の固定小数点数。

- hh:mi:ss [AM|am|PM|pm]で表現した時間。

- yyyy-mm-ddで表現した日付。

- yyyy-mm-dd hh:mi:ssで表現したタイムスタンプ。

これらのデータ型の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のデータ型に関する項を参照してください。

行の挿入または削除を行う処理を実行するには、適切な権限を持っている必要があります。権限の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の「SQL文」の章で、すべてのSQL文の構文とともに説明されています。

次の項では、行の管理方法について説明します。

- 行の挿入

- 行の削除

行の挿入

行を挿入するには、INSERTまたはINSERT SELECTを実行します。また、ttBulkCpユーティリティ使用することもできます。

例8-6 行の表への挿入

表NameIDに行を挿入するには、次の文を入力します。

INSERT INTO NameID VALUES(23125, 'John Smith';

注意:
表に複数の行を挿入する場合は、コードに準備済のコマンドおよびパラメータを使用するとより効率的です。バルク・ロードの終了後、索引を作成してください。

行の削除

行を削除するには、DELETE文を実行します。

例8-7 行の削除

次の例では、名前が文字「S」で始まるすべての行を表NameIDから削除します。

DELETE FROM NameID WHERE CustName LIKE 'S%';

シノニムの理解

シノニムとは、データベース・オブジェクトの別名のことです。シノニムは、オブジェクトの名前や所有者を隠すために使用できるため、セキュリティや利便性を目的として頻繁に使用されます。また、シノニムでSQL文を簡略化できます。シノニムによって独立性が実現するため、シノニムがどのオブジェクトを参照するかにかかわらず、変更なしでアプリケーションの動作が可能になります。シノニムはDML文の他、一部のDDLやTimesTen Cache文で使用できます。

シノニムは、次の2つのクラスに分類されます。

- プライベート・シノニム: プライベート・シノニムは、特定のユーザーが所有し、特定のユーザーのスキーマ内に存在します。プライベート・シノニムは、表名、ビュー名、順序名など他のオブジェクト名と同じネームスペースを共有します。したがって、プライベート・シノニムの名前は、同じスキーマ内の表名やビュー名と同じにすることはできません。

- パブリック・シノニム: パブリック・シノニムは、すべてのユーザーが所有され、データベースの各ユーザーからアクセスできます。パブリック・シノニムには、すべてのユーザーがアクセスでき、どのユーザー・スキーマにも属しません。したがって、パブリック・シノニムの名前は、プライベート・シノニム名や表名と同じにすることができます。

シノニムを作成して使用するには、適切な権限を持っている必要があります。権限の詳細は、「シノニムのオブジェクト権限」を参照してください。

シノニムを作成した後は、次のビューを使用して表示できます。

- SYS.ALL_SYNONYMS: 現行のユーザーがアクセスできるシノニムを表示します。詳細は、『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』のSYS.ALL_SYNONYMSに関する説明を参照してください。

- SYS.DBA_SYNONYMS: データベース内のすべてのシノニムを表示します。詳細は、『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』のSYS.DBA_SYNONYMSに関する説明を参照してください。

- SYS.USER_SYNONYMS: 現行のユーザーが所有しているシノニムを表示します。詳細は、『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』のSYS.USER_SYNONYMSに関する説明を参照してください。

シノニムの作成

シノニムは、CREATE SYNONYM文を使用して作成します。既存のシノニム廃棄せずに定義を変更するには、CREATE OR REPLACE SYNONYM文を使用します。CREATE SYNONYMおよびCREATE OR REPLACE SYNONYM文では、シノニム名およびシノニムが作成されるスキーマ名を指定します。スキーマを省略すると、シノニムはユーザーのスキーマに作成されます。ただし、パブリック・シノニムを作成する場合、スキーマ名はPUBLICネームスペースで定義されるため、指定しません。

CREATE SYNONYMまたはCREATE OR REPLACE SYNONYM文を実行するには、適切な権限を持っている必要があります(「シノニムのオブジェクト権限」を参照)。

- シノニムのオブジェクト・タイプ: CREATE SYNONYMおよびCREATE OR REPLACE SYNONYM文では、特定のオブジェクトの別名を定義します。オブジェクト・タイプは、表、ビュー、シノニム、順序、PL/SQLストアド・プロシージャ、PL/SQL関数、PL/SQLパッケージ、マテリアライズド・ビューまたはキャッシュ・グループのいずれかです。

注意:
サポートされていないオブジェクト・タイプのシノニムを作成しても、そのシノニムは使用できない可能性があります。

- ネーミングについての考慮事項: プライベート・シノニムは、表名など他のすべてのオブジェクト名と同じネームスペースを共有します。したがって、プライベート・シノニムの名前は、同じスキーマ内の表名や他のオブジェクト名と同じにすることはできません。
パブリック・シノニムには、すべてのユーザーがアクセスでき、特定のスキーマには属しません。したがって、パブリック・シノニムの名前は、プライベート・シノニム名や他のオブジェクト名と同じにすることができます。ただし、SYSスキーマのオブジェクトと同じ名前を持つパブリック・シノニムは作成できません。

次の例では、jobs表に対するプライベート・シノニムsynjobsを作成します。jobs表とsynjobsシノニムの両方にSELECT文を実行して、synjobsから選択することとjobs表から選択することが同じ結果になることを示します。最後に、作成したプライベート・シノニムを表示するため、例ではSYS.USER_SYNONYMS表に対してSELECT文を実行しています。

Command> CREATE SYNONYM synjobs FOR jobs;
Synonym created.

Command> SELECT FIRST 2 * FROM jobs;
< AC_ACCOUNT, Public Accountant, 4200, 9000 >
< AC_MGR, Accounting Manager, 8200, 16000 >
2 rows found.
Command> SELECT FIRST 2 * FROM synjobs;
< AC_ACCOUNT, Public Accountant, 4200, 9000 >
< AC_MGR, Accounting Manager, 8200, 16000 >
2 rows found.

Command> SELECT * FROM sys.user_synonyms;
< SYNJOBS, TTUSER, JOBS, <NULL> >
1 row found.

シノニムの作成および置換の詳細、例および規則については、『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE SYNONYMに関する説明を参照してください。

シノニムの削除

DROP SYNONYM文を使用して、データベースから既存のシノニムを削除します。ユーザーが所有するすべてのオブジェクト(シノニムを含む)を削除しないかぎり、そのユーザーを削除することはできません。

次の例では、パブリック・シノニムpubempを削除しています。

DROP PUBLIC SYNONYM pubemp;
Synonym dropped.

パブリック・シノニム、または他のユーザー・スキーマ内のプライベート・シノニムを削除するには、適切な権限が必要です。シノニムの作成および置換の詳細、例および規則については、『Oracle TimesTen In-Memory Database SQLリファレンス』のDROP SYNONYMに関する説明の項を参照してください。

シノニムが原因のSQL問合せの無効化または再コンパイル

シノニムまたはオブジェクトが新規作成または削除されると、一部のSQL問合せやDDL文の中が無効化されたり、再コンパイルされる場合があります。SQL問合せおよびDDL文の無効化や再コンパイルの動作を次に示します。

1. パブリック・シノニムに依存するすべてのSQL問合せは、次のいずれかのオブジェクトと同じ名前のプライベート・シノニムが作成されると無効化されます。

- プライベート・シノニム

- 表

- ビュー

- 順序

- マテリアライズド・ビュー

- キャッシュ・グループ

- プロシージャ、関数およびパッケージを含むPL/SQLオブジェクト

2. プライベート・オブジェクトまたはスキーマ・オブジェクトに依存するすべてのSQL問合せは、プライベート・オブジェクトまたはスキーマ・オブジェクトが削除されると無効化されます。

9 TimesTen問合せオプティマイザ

コスト・ベースのTimesTen問合せオプティマイザでは、アプリケーションの表の情報と使用可能な索引を使用して、データへのファスト・パスを選択します。アプリケーション開発者は、オプティマイザが選択したプランを確認して、索引が適切に使用されているかをチェックできます。またアプリケーション開発者は、必要に応じて、オプティマイザが別のプランを検討するように、オプティマイザの動作に影響を与えるヒントを提供できます。

この章の内容は次のとおりです。

- 最適化を実行するタイミング

- SQLコマンド・キャッシュに格納されているSQL文の表示

- SQL問合せ計画の表示

- 計画生成の変更

最適化を実行するタイミング

複数の実行計画が可能な場合、TimesTenによってSQL文用のオプティマイザが起動されます。オプティマイザは、最適と判断した計画を選択します。この計画は、文がアプリケーションによって無効にされるか削除されるまで保持されます。

文は次の状況で自動的に無効化されます。

- コマンドが使用するオブジェクトが破棄された

- コマンドが使用するオブジェクトが変更された

- コマンドが参照する表またはビューの索引が破棄された

- コマンドが参照する表またはビューに索引が作成された

次のいずれかの方法を使用して、文を手動で無効化できます。

- ttOptCmdCacheInvalidate組込みプロシージャを使用してSQLコマンド・キャッシュ内の文を無効化します。詳細は、「コマンドの無効化をSQLコマンド・キャッシュで制御する」を参照してください。

- ttOptUpdateStatsまたはttOptEstimateStats組込みプロシージャで、invalidationオプションを1に設定します。これらの組込みプロシージャによって、指定した表または現在のユーザーが所有するすべての表の統計も更新されます。

注意:
統計を計算するときの詳細は、「正確な統計または推定統計の計算」を参照してください。また、『Oracle TimesTen In-Memory Databaseリファレンス』のttOptUpdateStatsまたはttOptEstimateStatsに関する説明も参照してください。

無効になった文は、通常、再実行される直前に再度自動的に準備されます。つまり、その時点でオプティマイザが再度起動され、場合によっては新しい計画が作成されます。したがって、1つのコマンドが何度も準備されることがあります。

注意:
JDBCを使用しているときは、表が変更された場合に、文を手動で再度準備する必要があります。

たとえば、文で参照していた表が破棄され、同じ名前の表が作成されたときには、文を手動で準備することが必要な場合があります。文を手動で準備する場合は、準備文を、共有できるようにコミットする必要があります。文が、無効なため再コンパイルされる場合、および参照されているいずれかの表で使用されているDDLが再コンパイルに必要な場合は、準備文をコミットしてコマンド・ロックを解放する必要があります。

たとえば、ODBCでは、表T1とT2を結合するコマンドによって、次のような処理が行われます。

アクション

説明

SQLPrepare

コマンドが準備されます。

SQLExecute

コマンドが実行されます。

SQLExecute

コマンドが再実行されます。

T1に対する索引の作成

コマンドが無効化されます。

SQLExecute

コマンドが再度準備され、実行されます。

SQLExecute

コマンドが再実行されます。

T1に対するttOptUpdateStats

コマンドが無効になります(無効フラグがttOptUpdateStatsプロシージャに渡された場合)。

SQLExecute

コマンドが再度準備され、実行されます。

SQLExecute

コマンドが再実行されます。

SQLFreeStmt

コマンドが破棄されます。

JDBCでは、表T1とT2を結合するコマンドによって、次のような処理が行われます。

アクション

説明

Connection.prepareStatement

コマンドが準備されます。

PreparedStatement.execute

コマンドが実行されます。

PreparedStatement.execute

コマンドが再実行されます。

T1に対する索引の作成

コマンドが無効化されます。

PreparedStatement.execute

コマンドが再度準備され、実行されます。

PreparedStatement.execute

コマンドが再実行されます。

T1に対するttOptUpdateStats

コマンドが無効になります(無効フラグがttOptUpdateStatsプロシージャに渡された場合)。

PreparedStatement.execute

コマンドが再度準備され、実行されます。

PreparedStatement.execute

コマンドが再実行されます。

PreparedStatement.close

コマンドが破棄されます。

前述のとおり、最適化は、通常は準備のときに実行されますが、後で索引が破棄または作成されるときや、統計が変更されるときにも実行されることがあります。キャッシュ内のコマンドを準備で使用できる場合は、最適化は行われません。

コマンドの準備時にgenPlanフラグが設定されていた場合は、同じフラグが設定されて再度コンパイルされます。したがって、別の問合せのための計画がSYS.PLAN表内にある場合でも、計画は作成されます。

オプティマイザの動作をに影響を与えるオプティマイザ・ヒントをアプリケーションで指定した場合、これらのヒントはコマンドを削除するまで維持されます。詳細は、「計画生成の変更」を参照してください。たとえば、同じハンドルでODBC SQLPrepare関数またはJDBC Connection.prepareStatementメソッドが再度コールされた場合や、SQLFreeStmt関数またはPreparedStatement.closeメソッドがコールされた場合などです。つまり、無効化が原因となって発生するすべての中間の再準備で、同じヒントが使用されることになります。

SQLコマンド・キャッシュに格納されているSQL文の表示

SQL文、組込みプロシージャなど、実行されたすべてのコマンドは、一時メモリーを使用するSQLコマンド・キャッシュに格納されます。コマンドはSQLコマンド・キャッシュの制限に達するまで格納され、その後は最後に使用されたコマンドが削除された後に新しいコマンドが格納されます。SQLコマンド・キャッシュに格納されているこれらのコマンドを1つ以上取得できます。

注意:
この項では、SQLコマンド・キャッシュに格納されたコマンドの表示方法について説明します。これらのコマンドに関連付けられた問合せ計画の表示方法については、「SQLコマンド・キャッシュに格納されているコマンドに関連付けられた問合せ計画の表示」を参照してください。

次の項では、SQLコマンド・キャッシュに格納されているコマンドを表示する方法について説明します。

- パフォーマンス管理およびトラブルシューティングのコマンド

- SQLコマンド・キャッシュに格納されたコマンドの表示

パフォーマンス管理およびトラブルシューティングのコマンド

1つ以上のコマンドまたはその問合せ計画の詳細は、ttSQLCmdCacheInfoおよびttSQLCmdQueryPlan組込みプロシージャで表示できます。問合せ計画情報は、問合せの監視およびトラブルシューティングに使用します。

コマンドおよび問合せ計画を表示すると、次の作業に役立ちます。

- 索引スキャンを使用していない更新または削除の検出。

- すべての計画を確実に最適化することを目的とする、実行中の問合せの問合せ計画の監視。

- SQL文を準備しないアプリケーション、または同じ文を複数回再準備するアプリケーションの検出。

- コマンド・キャッシュ内でパフォーマンスの評価に使用されている領域の割合の検出。

SQLコマンド・キャッシュに格納されたコマンドの表示

TimesTenデータベースに対して実行されたコマンドは、SQLコマンド・キャッシュにキャッシュされます。ttSQLCmdCacheInfo組込みプロシージャを使用すると、TimesTen SQLコマンド・キャッシュにキャッシュされた特定のコマンドまたはすべてのコマンドが表示されます。デフォルトではすべてのコマンドが表示されますが、コマンドIDを指定すると、そのコマンドのみが取得されて表示されます。

コマンド・データは、次の形式で保存されます。

- コマンドID。特定のコマンドまたはそのコマンドに関連付けられた問合せ計画を取得する場合に使用されます。

- プライベート接続ID。

- 実行回数のカウンタ。

- ユーザーがこの文を準備した回数のカウンタ。

- ユーザーがこのSQL文を再準備した回数のカウンタ。

- 解放可能かどうかのステータスで、この値が1の場合、サブデーモンはガベージ・コレクタで領域を解放できます。値が0の場合、領域は解放可能ではありません。

- キャッシュ内でこのコマンドに対して割り当てられている合計サイズ(バイト)。

- コマンドを作成したユーザー。

- 最大1024文字の問合せテキスト。

- この文のために内部的に行われたフェッチの実行回数です。

- 文が開始したときのタイムスタンプです。

- 最大実行時間が秒単位で表示されます。

- 最後に測定された実行時間が秒単位で表示されます。

- 最小実行時間が秒単位で表示されます。

すべてのコマンドのリストの末尾には、キャッシュ内に格納されていたコマンド数を示すステータスが出力されます。

次の例は、ttSQLCmdCacheInfo組込みユーティリティを使用して、SQLコマンド・キャッシュにあるすべてまたは単一のコマンドを表示する方法を示しています。

- SQLコマンド・キャッシュ内のすべてのコマンドの表示

- 単一のSQLコマンドの表示

例9-1 SQLコマンド・キャッシュ内のすべてのコマンドの表示

この例では、ttIsql内で引数を指定しないでttSQLCmdCacheInfo組込みプロシージャを実行し、キャッシュされたすべてのコマンドを表示します。コマンドは、簡潔な形式で表示されます。各列に列名が付加された情報を表示するには、ttSQLCmdCacheInfoプロシージャをコールする前にvertical onを実行してください。

Command> call ttSQLCmdCacheInfo;

< 110168040, 2048, 2, 2, 0, 1, 2792, CACHEUSER                      , create
writethrough cache group update_orders from ordertab
(orderid number(10) not null primary key,
custid number (6) not null), 0, 2013-01-04 13:13:47.614000, 4.908, 4.908, 0 >
< 35681280, 2048, 0, 8, 0, 1, 5256, SYS                            , select null
from sys.obj$ where obj#=:1 and type#=:2 and obj# not in (select p_obj# from
dependency$ where p_obj# = sys.obj$.obj#), 0, <NULL>, 0, 0, 0 >
< 110189568, 2048, 1, 1, 0, 1, 4304, PAT                           , call
ttstatsconfig('connsamplefactor',0), 0, 2013-01-08 08:33:18.969000, 0, 0, 0 >
< 110176976, 2048, 1, 1, 0, 1, 4328, PAT                           , call
ttstatsconfig('sqlcmdsamplefactor',0), 2, 2013-01-08 08:32:31.751000, .000664,
.000664, .000664 >
< 110193800, 2048, 1, 1, 0, 1, 4328, PAT                           , call
ttstatsconfig('connsamplefactor','1,0'), 2, 2013-01-08 08:33:29.578000, 0, 0, 0 >
< 35291992, 2048, 0, 1, 0, 1, 2568, SYS                            , select sys25
from sys.tables where cachegroup = ?, 0, <NULL>, 0, 0, 0 >
< 40815768, 2048, 2, 1, 0, 0, 3944, SYS                            , select
u.user#, u.password, u.identification, u.astatus from sys.user$ u where u.name =
:name and u.type# = 1, 2, 2013-01-04 13:03:29.262000, 0, 0, 0 >
< 110243304, 2048, 0, 2, 0, 1, 1208, PAT                           , call
ttcmdcacheinfo(), 0, <NULL>, 0, 0, 0 >
< 35287688, 2048, 1, 1, 0, 1, 4232, SYS                            , select
cgname, cgowner, cgid, refresh_mode, refresh_state, refresh_interval, sys10,
TBLCNT, CGATTRIBUTES from sys.cache_group, 1, 2013-01-04 13:04:33.549000, 0, 0, 0 >
< 110255264, 2048, 2, 2, 0, 1, 3048, SYS                            , select
order#,columns,types from sys.access$ where d_obj#=:1, 2, 2013-01-08
08:40:44.633000, 0, 0, 0 >
< 110185240, 2048, 1, 1, 0, 1, 4312, PAT                           , call
ttstatsconfig('connsamplefactor','1,5'), 2, 2013-01-08 08:33:09.505000, 0, 0, 0 >
< 35031664, 2048, 1, 1, 0, 1, 2232, CACHEUSER                      , call
ttCacheUidPwdSet('cacheuser','oracle'), 0, 2013-01-04 13:03:43.615000, .326, .326, 0 >
< 110229864, 2048, 2, 2, 0, 1, 4240, PAT                           , call
ttstatsconfig('sqlcmdsamplefactor'), 4, 2013-01-08 08:32:10.638000, .000082,
.000082, .000082 >
< 40819648, 2048, 1, 1, 0, 0, 3904, SYS                            , select 1
from sys.sysauth$ s where (s.grantee# = :userid or s.grantee# = 1) and
(s.privilege# = :priv or s.privilege# = 67), 1, 2013-01-04 13:03:29.262000, 0, 0,
0 >
< 35038832, 2048, 1, 2, 0, 1, 3336, CACHEUSER                      , create
writethrough cache group update_cust from active_customer
(custid number (6) not null primary key,
name varchar2(50),
addr varchar2(100),
zip varchar2(12)), 0, 2013-01-04 13:06:53.452000, 19.917, 19.917, 0 >
< 110270264, 2048, 4, 4, 0, 1, 3888, SYS                            , select
piece#,length,piece from sys.idl_ub2$ where obj#=:1 and part=:2 and version=:3
order by piece#, 34, 2013-01-08 08:40:44.633000, 0, 0, 0 >
< 110266280, 2048, 4, 4, 0, 1, 3888, SYS                            , select
piece#,length,piece from sys.idl_char$ where obj#=:1 and part=:2 and version=:3
order by piece#, 14, 2013-01-08 08:40:44.633000, 0, 0, 0 >
< 35034128, 2048, 1, 1, 0, 1, 1688, CACHEUSER                      , call
ttGridCreate('ttGrid'), 0, 2013-01-04 13:04:00.891000, 0, 0, 0 >

例9-2 単一のSQLコマンドの表示

ttSQLCmdCacheInfoに入力としてコマンドIDを指定すると、SQLコマンド・キャッシュから単一のコマンドが表示されます。ttSQLCmdCacheInfo組込みプロシージャにコマンドIDを入力しなかった場合、現在のすべてのコマンドに関する情報が表示されます。このとき、コマンドIDが出力の最初の列に表示されます。

次の例は、コマンドID 527973892で識別されるコマンドを表示します。これは、簡潔な形式で表示されます(先頭に列見出しを表示するには、組込みのttSQLCmdCacheInfoをコールする前にvertical onを実行してください)。

Command> call ttSQLCmdCacheInfo(527973892);
< 527973892, 2048, 0, 1, 0, 1, 2872, PAT                        , select * from
t1 where x1 in (select x2 from t2) or x1 in (select x3 from t3) order by 1, 2, 3 >
1 row found.

SQL問合せ計画の表示

コマンドの問合せ計画を表示するには、最新の問合せ計画をシステムPLAN表に格納する方法か、またはSQLコマンド・キャッシュにキャッシュされたすべてのコマンドとその問合せ計画を表示する方法のいずれかを使用します。次の項では、この2つの方法について説明します。

- システムPLAN表からの問合せ計画の表示

- SQLコマンド・キャッシュに格納されているコマンドに関連付けられた問合せ計画の表示

システムPLAN表からの問合せ計画の表示

オプティマイザによって、問合せ計画が準備されます。実行する最後のSQL文について、計画がシステムのPLAN表に格納されるように指示することができます。

1. 計画を生成してシステムPLAN表に格納するようにTimesTenに指示します。

2. 文の準備で、その文に対してODBC SSQLPrepare関数またはJDBC Connection.prepareStatementメソッドをコールします。PLAN表に計画が格納されます。

3. SYS.PLAN表に生成された計画を読み取ります。

格納された計画は、コマンドの再準備が実行されるたびに自動的に更新されます。再準備は、次の1つ以上の状況が発生すると自動的に実行されます。

- 文内の表が変更された場合。

- 索引が作成または廃棄された場合。

- アプリケーションで、統計の更新時に、ttOptUpdateStats組込みプロシージャのinvalidateオプションを使用してコマンドが無効化された場合。

- ユーザーがttOptCmdCacheInvalidate組込みプロシージャを使用してコマンドを無効にした場合。

注意:
詳細は、「コマンドの無効化をSQLコマンド・キャッシュで制御する」を参照してください。組込みプロシージャの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttOptUpdateStatsおよびttOptCmdCacheInvalidateに関する説明を参照してください。

このような場合は、計画がどのように変更されたかをPLAN表で確認します。

計画をシステムPLAN表に格納するようにTimesTenに指示する方法

システムのPLAN表で計画を表示する前に、計画生成オプションを次のように設定して、PLAN表内でのエントリの作成を有効にします。

- トランザクション・レベルのオプティマイザのヒントについては、ttOptSetFlag組込みプロシージャを呼び出してGenPlanフラグを有効にします。

- 文レベルのオプティマイザのヒントについては、TT_GENPLAN(1)を設定します。これはこの文でのみ有効です。文が実行された後、計画生成オプションによって、トランザクション・レベルのオプティマイザ・ヒントGenPlanの値が受け入れられます。

注意:
文レベルとトランザクション・レベルのオプティマイザ・ヒントの詳細については、「オプティマイザ・ヒントを使用して実行計画を変更する」を参照してください。

これによって、それ以降にODBC SQLPrepare関数またはJDBC Connection.prepareStatementメソッドのコールがトランザクションにあれば、そのすべてのコールから得られた計画が現在のSYS.PLAN表に保存されるようになります。

SYS.PLAN表に格納できる計画は1つのみです。このため、ODBC SQLPrepare関数またはJDBC Connection.prepareStatementメソッドがコールされるたびに、その時点で表に格納されていた計画は上書きされます。

コマンドの準備時に計画生成オプションが設定されていた場合は、コマンドは計画生成時にも再度コンパイルされます。したがって、別の問合せのための計画がSYS.PLAN表内にある場合でも、計画は作成されます。

ttIsqlのshowplanを使用して問合せおよびオプティマイザのヒントをテストできます。これにより計画生成が可能になるとともに、トランザクション内にある問合せ計画も示します。自動コミット・モードを無効にする必要があります。

autocommit 0;
showplan 1;

PLAN表からの問合せ計画の読取り

計画の生成を有効にしてコマンドの準備が終了すると、SYS.PLAN表の1つ以上の行にコマンドの計画が格納されます。表の行数は、コマンドがどの程度複雑かによって変わります。それぞれの行には、『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』のシステム表に関する説明のとおり、列が7つあります。

例9-3 問合せ計画の生成

この例では、次の問合せを使用します。

SELECT COUNT(*)
FROM T1, T2, T3
WHERE T3.B/T1.B > 1
AND T2.B <> 0
AND T1.A = -T2.A
AND T2.A = T3.A

次の表に示すとおり、オプティマイザによって次の5つのSYS.PLAN行が生成されます。各行は、計画の1つのステップで、問合せの実行時に実行される処理を示します。

ステップ

レベル

処理

表名

索引名

条件

その他の条件

1

3

TblLkRangeScan

T1

IX1

2

3

TblLkRangeScan

T2

IX2(D)

T2.B <> 0

3

2

MergeJoin

T1.A = -T2.A

4

2

TblLkRangeScan

T3

IX3(D)

5

1

MergeJoin

T2.A = T3.A

T3.B/T1.B > 1

SYS.PLAN表の各列の詳細は、「PLAN表の各列の説明」を参照してください。

PLAN表の各列の説明

SYS.PLAN表には、7つの列があります。

列1(ステップ)

処理の順序を示します(常に1から開始)。例9-3は、次の順序で表ロック範囲スキャンを使用します。

1. 表T1のIX1で、表ロック範囲スキャンを実行します。

2. 表T2のIX2で、表ロック範囲スキャンを実行します。

3. T1とT2などでマージ結合を実行します。

列2(レベル)

処理を表す結合ツリー図での操作の位置を示します。例9-3の結合ツリーは、次のとおりです。

列3(処理)

実行される処理のタイプを示します。このフィールドで使用される可能性がある値とそれぞれが表す表スキャンのタイプの詳細は、『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』の「システム表」のSYS.PLANを参照してください。

オプティマイザが実行した処理内容がすべてユーザーに表示されるわけではありません。パフォーマンスの解析にとって重要な処理のみがSYS.PLAN表に表示されます。TblLkは、シリアライズ可能分離モードまたはコミット読取り分離モードでの実行時に使用可能なオプティマイザ・ヒントです。表ロックは、準備時に行ロックが無効になっている場合にのみスキャン時に使用されます。

列4(表名)

スキャンされる表を示します。この列は、実行される処理がスキャンの場合にのみ使用されます。それ以外の場合、この列はNULLです。

列5(索引名)

使用される索引を示します。この列は、処理が、既存の索引(ハッシュまたは範囲スキャン)を使用する索引スキャンの場合にのみ使用されます。それ以外の場合、この列はNULLです。スキャンが降順(小から大ではなく、大から小)の場合、範囲索引の名前に「(D)」が付きます。

列6(条件)

処理に条件が含まれる場合に、その条件を示します。条件が使用されるのは、索引スキャンとMergeJoinの処理のみです。条件文字列は、1,024文字に制限されています。

範囲スキャンの場合、この列は条件がないことを表すNULLになる場合があります。範囲スキャンに、フィルタリングの他に次のような2つの便利な特徴があるため、オプティマイザは、表スキャンよりも範囲スキャンを優先する場合があります。

- 行が(索引キーで)ソートされて戻される。

- 行を戻す処理が高速である(特に、表のデータがまばらな場合)。

例9-3では、ソートに範囲スキャンを使用しています。このスキャンでは、条件は評価されません。

列7(その他の条件)

処理の実行時に適用される他の条件を示します。これらの条件は、直接的にスキャンまたは結合で使用されることはありませんが、スキャンまたは結合によって戻された各行で評価されます。

たとえば、例9-3に対して生成された計画のステップ2では、範囲スキャンが表T2で実行されます。そのスキャンの実行時には、条件T2.B <> 0も評価されます。同様に、最後のマージ結合が終了すると、条件T3.B / T1.B > 1の評価が可能になります。

SQLコマンド・キャッシュに格納されているコマンドに関連付けられた問合せ計画の表示

問合せ計画情報は、問合せの監視およびトラブルシューティングに使用します。

注意:
ttSQLCmdQueryPlan組込みプロシージャを使用するその他の理由については、「パフォーマンス管理およびトラブルシューティングのコマンド」を参照してください。

ttSQLCmdQueryPlan組込みプロシージャを使用すると、コマンド・キャッシュ内の特定の文またはすべての文の問合せ計画が表示されます。キャッシュされているSQL問合せの詳細なランタイム問合せ計画が表示されます。デフォルトでは、すべての問合せ計画が表示されますが、コマンド出力から取得したコマンドIDを指定すると、指定したコマンドの問合せ計画のみが表示されます。

注意:
特定のコマンドの問合せ計画を表示するには、ttSQLCmdCacheInfo組込みプロシージャで表示されるコマンドIDを指定する必要があります。詳細は、「SQLコマンド・キャッシュに格納されたコマンドの表示」を参照してください。

この組込みプロシージャを実行すると表示される計画データは、次のとおりです。

- コマンドID

- 問合せテキスト(最大1024文字)

- ランタイム問合せ計画での現在の処理のステップ番号

- 問合せ計画ツリーでの現在の処理のレベル番号

- 現在のステップの処理名

- 使用された表の名前

- 表の所有者

- 使用された索引の名前

- 索引条件(使用されており、利用可能な場合)

- 索引以外の条件(使用されており、利用可能な場合)

注意:
この情報の表示方法の詳細は、「PLAN表からの問合せ計画の読取り」を参照してください。データのソースは同じでない場合がありますが、情報の位置および説明は、システムPLAN表の問合せ計画と同じです。

ttSQLCmdQueryPlan組込みプロセスには、生データ形式で問合せ計画が表示されます。また、この出力の形式化バージョンには、ttIsql explainコマンドを実行できます。詳細は、「SQL コマンド・キャッシュでの文に関する問合せ計画の表示」を参照してください。

次の例は、ttSQLCmdQueryPlan組込みプロシージャを使用して、SQLコマンド・キャッシュにあるすべてまたは1つのSQL問合せ計画を表示する方法を示しています。

- すべてのSQL問合せ計画の表示

- 単一のSQL問合せ計画の表示

例9-4 すべてのSQL問合せ計画の表示

コマンド・キャッシュに格納されている、コマンドに関連付けられたすべてのSQL問合せ計画を表示するには、ttIsqlユーティリティ内でttSQLCmdQueryPlan組込みプロシージャを使用します。

次の例は、引数を指定しないでttSQLCmdQueryPlan組込みプロシージャを実行した場合の出力を示しています(この場合、すべての有効な問合せの詳細なランタイム問合せ計画が表示されます)。無効な問合せの場合は、問合せ計画は表示されず、問合せテキストが表示されます。

問合せ計画は、簡潔な形式で表示されます。先頭に列見出しを表示するには、ttSQLCmdQueryPlan組込みプロシージャをコールする前にvertical onを実行してください。

注意: 複雑な式の場合、元の式の出力に問題が生じることがあります。

Command> call ttSQLCmdQueryPlan();

< 528079360, select * from t7 where x7 is not null or exists (select 1 from t2,t3
where not 'tuf' like 'abc'), <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>,
<NULL>, <NULL> >
< 528079360, <NULL>, 0, 2, RowLkSerialScan                , T7
, PAT                        ,                                , ,  >
< 528079360, <NULL>, 1, 3, RowLkRangeScan                 , T2
, PAT                        , I2                             , , NOT(LIKE( tuf
,abc ,NULL ))  >
< 528079360, <NULL>, 2, 3, RowLkRangeScan                 , T3
, PAT                        , I2                             , ,  >
< 528079360, <NULL>, 3, 2, NestedLoop                     ,
,                                ,                                , ,  >
< 528079360, <NULL>, 4, 1, NestedLoop(Left OuterJoin)     ,
,                                ,                                , ,  >
< 528079360, <NULL>, 5, 0, Filter                         ,
,                                ,                                , , X7 >
< 527576540, call ttSQLCmdQueryPlan(527973892), <NULL>, <NULL>, <NULL>, <NULL>,
<NULL>, <NULL>, <NULL>, <NULL> >
< 527576540, <NULL>, 0, 0, Procedure Call                 ,
,                                ,                                , ,  >
< 528054656, create table t2(x2 int,y2 int, z2 int), <NULL>, <NULL>, <NULL>,
<NULL>, <NULL>, <NULL>, <NULL>, <NULL> >
< 528066648, insert into t2 select * from t1, <NULL>, <NULL>, <NULL>, <NULL>,
<NULL>, <NULL>, <NULL>, <NULL> >
< 528066648, <NULL>, 0, 0, Insert                         , T2
, PAT                        ,                                , ,  >
< 528013192, select * from t1 where exists (select * from t2 where x1=x2) or
y1=1, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL> >
< 528061248, create index i1 on t3(y3), <NULL>, <NULL>, <NULL>, <NULL>, <NULL>,
<NULL>, <NULL>, <NULL> >
< 528070368, call ttOptSetOrder('t3 t4 t2 t1'), <NULL>, <NULL>, <NULL>, <NULL>,
<NULL>, <NULL>, <NULL>, <NULL> >
< 528070368, <NULL>, 0, 0, Procedure Call                 ,
,                                ,                                , ,  >
< 528018856, insert into t2 select * from t1, <NULL>, <NULL>, <NULL>, <NULL>,
<NULL>, <NULL>, <NULL>, <NULL> >
< 527573452, call ttSQLCmdCacheInfo(527973892), <NULL>, <NULL>, <NULL>, <NULL>,
<NULL>, <NULL>, <NULL>, <NULL> >
< 527573452, <NULL>, 0, 0, Procedure Call                 ,
,                                ,                                , ,  >
< 528123000, select * from t1 where x1 = 1 or x1 = (select x2 from t2,t3 where
z2=t3.x3), <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL> >
< 528123000, <NULL>, 0, 2, RowLkSerialScan                , T1
, PAT                        ,                                , ,  >
< 528123000, <NULL>, 1, 6, RowLkRangeScan                 , T2
, PAT                        , I2                             , ,  >
< 528123000, <NULL>, 2, 6, RowLkRangeScan                 , T3
, PAT                        , I2                             , ,  Z2 = X3; >
< 528123000, <NULL>, 3, 5, NestedLoop                     ,
,                                ,                                , ,  >
< 528123000, <NULL>, 4, 4, Materialized View              ,
,                                ,                                , ,  >
< 528123000, <NULL>, 5, 3, GroupBy                        ,
,                                ,                                , ,  >
< 528123000, <NULL>, 6, 2, Filter                         ,
,                                ,                                , ,  X1 =
colum_name; >
< 528123000, <NULL>, 7, 1, NestedLoop(Left OuterJoin)     ,
,                                ,                                , ,  >
< 528123000, <NULL>, 8, 0, Filter                         ,
,                                ,                                , ,  X1 = 1; >

例9-5 単一のSQL問合せ計画の表示

あるコマンドに関連付けられた問合せ計画を表示するには、ttSQLCmdQueryPlan組込みプロシージャの入力として、そのコマンドのコマンドIDを指定します。これにより、SQLコマンド・キャッシュから単一の問合せ計画が表示されます。値が指定されない場合、ttSQLCmdCacheInfo組込みプロシージャはTimesTenキャッシュの現在のすべてのコマンドに関する情報を表示します。

次の例は、コマンドID 528078576で識別されるコマンドの問合せ計画を表示します。これは、簡潔な形式で表示されます(先頭に列見出しを表示するには、ttSQLCmdQueryPlan組込みプロシージャをコールする前にvertical onを実行してください)。

注意: 複雑な式の場合、元の式の出力に問題が生じます。

Command> call ttSQLCmdQueryPlan( 528078576);
< 528078576, select * from t1 where 1=2 or (x1 in (select x2 from t2, t5 where y2
in (select y3 from t3)) and y1 in (select x4 from t4)), <NULL>, <NULL>, <NULL>,
<NULL>, <NULL>, <NULL>, <NULL>, <NULL> >
< 528078576, <NULL>, 0, 4, RowLkSerialScan                , T1
, PAT                        ,                                , ,  >
< 528078576, <NULL>, 1, 7, RowLkRangeScan                 , T2
, PAT                        , I2                             , ,  >
< 528078576, <NULL>, 2, 7, RowLkRangeScan                 , T5
, PAT                        , I2                             , ,  >
< 528078576, <NULL>, 3, 6, NestedLoop                     ,
,                                ,                                , ,  >
< 528078576, <NULL>, 4, 6, RowLkRangeScan                 , T3
, PAT                        , I1                             ,  ( (Y3=Y2; ) ) ,  >
< 528078576, <NULL>, 5, 5, NestedLoop                     ,
,                                ,                                , ,  >
< 528078576, <NULL>, 6, 4, Filter                         ,
,                                ,                                , ,  X1 = X2; >
< 528078576, <NULL>, 7, 3, NestedLoop(Left OuterJoin)     ,
,                                ,                                , ,  >
< 528078576, <NULL>, 8, 2, Filter                         ,
,                                ,                                , ,  >
< 528078576, <NULL>, 9, 2, RowLkRangeScan                 , T4
, PAT                        , I2                             , ,  Y1 = X4; >
< 528078576, <NULL>, 10, 1, NestedLoop(Left OuterJoin)     ,
,                                ,                                , ,  >
< 528078576, <NULL>, 11, 0, Filter                         ,
,                                ,                                , ,  >
13 rows found.
Command>

計画生成の変更

問合せ計画を変更する場合、システムPLAN表に存在する問合せ計画のみを変更できます(「システムPLAN表からの問合せ計画の表示」を参照)。問合せ計画を変更した場合、問合せ計画が置き換えられるのではなく、変更内容が含まれる新しい問合せ計画が作成されます。

次の項では、実行計画を変更する理由およびその変更方法について説明します。

- 実行計画を変更する理由

- ヒントが実行計画に与えることができる影響

- オプティマイザ・ヒントを使用して実行計画を変更する

実行計画を変更する理由

アプリケーションでは次の2つの理由で、実行計画を変更することがあります。

- 計画が、速度から見ると最適化されていても、アプリケーションには不適切なため。オプティマイザが最速の実行パスを選択しても、アプリケーション側から見れば、このパスが不適切な場合もあります。たとえば、オプティマイザが、特定の索引を選択すると、索引付けされた表で、更新や削除などの他の処理を同時に実行できなくなる場合があります。このような場合は、アプリケーションによって、これらの索引を使用できなくなる場合があります。
またオプティマイザが選択した計画で消費するメモリーが、実際の利用可能な容量より多かったり、アプリケーションで割り当てようとする容量より多い場合もあります。たとえば、計画で中間的な処理結果を保持したり、一時索引の作成が必要な場合に、このような容量不足が発生します。

- 計画のパフォーマンスが最適化されていないため。問合せオプティマイザは、表の内容、利用可能な索引、統計、様々な内部処理の相対的なコストを考慮して最速と考えられる計画を選択します。ただし、これらの情報を評価するとき、オプティマイザは予測やデータの一般化を行うことが多いため、最速の計画が選択されていない場合もあります。このような場合、よりよい計画を作成できるように、アプリケーションはオプティマイザの動作を調整できます。

ヒントが実行計画に与えることができる影響

ヒントを適用して、TimesTen問合せオプティマイザに指示を渡すことができます。問合せに対して最適な実行計画を選択するとき、オプティマイザではこれらのヒントが考慮されます。トランザクション・レベルのヒントは、トランザクション内のODBC SQLPrepare関数またはJDBC PreparedStatementオブジェクトへのすべてのコールに対して有効となります。

- 特定のヒントが有効になっている状態でコマンドの準備が実行されると、コマンドが自動的に再度準備されても、そのヒントは引き続き適用されます。このような問題は、「最適化を実行するタイミング」で説明したとおり、表の変更、索引の作成または破棄、あるいは統計の変更が行われたときに発生します。

- ヒントなしでコマンドを準備している場合は、コマンドが自動的に再準備されても、コマンドがその後のヒントの影響を受けることはありません。ヒントを有効にするには、アプリケーションでもう一度ODBC SQLPrepare関数またはJDBC Connection.prepareStatementメソッドをコールする必要があります。

例9-6 ODBC使用時の結合のチューニング

ODBCを使用する場合に開発者がT1とT2の結合を調整するには、次の図に示されている手順を実行することになります。

実行中は、アプリケーションで次の図に示されている手順が実行されます。

例9-7 JDBC使用時の結合のチューニング

JDBCを使用する場合に開発者がT1とT2の結合を調整するには、次の図に示されている手順を実行することになります。

実行中は、アプリケーションで次の図に示されている手順が実行されます。

オプティマイザ・ヒントを使用して実行計画を変更する

ヒントを適用して、TimesTen問合せオプティマイザに次のように指示を渡すことができます。

- 特定のSQL文のみにヒントを適用するには、文レベルのオプティマイザ・ヒントを使用します。

- トランザクション全体にヒントを適用するには、適切なTimesTen組込みプロシージャとともにトランザクション・レベルのオプティマイザ・ヒントを使用します。

注意:
TimesTenは読取り問合せおよび書込み問合せを同時に最適に処理します。ttOptSetFlag ('tblLock',1)などのトランザクション・レベル・オプティマイザ・ヒントまたは/*+ tt_tbllock(1) tt_rowlock(0) */などの文レベル・オプティマイザ・ヒントを使用すると、読取り専用同時実行性に対して読取り問合せを最適化できます。読取り最適化問合せと同時に処理する書込み問合せは競合する可能性があります。
ttDbWriteConcurrencyModeSet組込みプロシージャにより、同時書込み処理時に読取り最適化を制御できます。詳細は、「同時書込み処理時の読取り最適化の制御」を参照してください。

次の項では、ヒントの適用手順について説明します。

- SQL文への文レベルのオプティマイザ・ヒントの適用

- トランザクションへのトランザクション・レベルのオプティマイザ・ヒントの適用

SQL文への文レベルのオプティマイザ・ヒントの適用

文レベルのオプティマイザ・ヒントは特殊なフォーマットのSQLコメントで、SQLオプティマイザに対する命令が含まれます。文レベルのオプティマイザ・ヒントは、適用対象となるSQL文の中に、次のいずれかの方法で適用できます。

- /*+ */ ヒントは複数行にわたって定義できます。ヒントはコメント構文で囲む必要があります。プラス記号(+)はヒントの開始を示します。

- --+ ヒントは1行で、プラス記号(+)の後に指定する必要があります。

文レベルのオプティマイザ・ヒントは、SELECT、INSERT、UPDATE、MERGE、DELETE、CREATE TABLE AS SELECT、またはINSERT ... SELECT文の中に指定できます。SQL VERBのすぐ後で、コメント構文内にヒントを指定する必要があります。文レベルのオプティマイザ・ヒントの配置、ルールおよび構文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の、文レベルのオプティマイザ・ヒントに関する説明に記載しています。

「トランザクションへのトランザクション・レベルのオプティマイザ・ヒントの適用」で説明する、TimesTenの組込みプロシージャによって定義されているトランザクション・レベルのオプティマイザ・ヒントは、SQL文の中で定義されたヒントで上書きされます。

注意:
文レベルのオプティマイザ・ヒントを誤って指定した場合、そのヒントはTimesTenによって無視され、エラーは発生しません。競合するヒントを定義すると、その文で競合するヒントは一番右のヒントによってすべて上書きされます。

トランザクションへのトランザクション・レベルのオプティマイザ・ヒントの適用

トランザクション内のすべての文に対する問合せオプティマイザの動作を変更するには、ODBCプロシージャ・コール・インタフェースを使用して、アプリケーションで次の組込みプロシージャのいずれかをコールします。

注意:
トランザクション・レベルのオプティマイザのヒントについて、自動コミットがオフになっていることを確認してください。オプティマイザのすべてのフラグは、トランザクションがコミットまたはロールバックされた時点でそれぞれのデフォルト値にリセットされます。自動コミットがオンになっている状態でオプティマイザ・フラグを設定しても、各文は固有のトランザクション内で実行されるため、そのフラグは無視されます。

- ttOptSetFlag: 特定のオプティマイザ・パラメータを設定します。トランザクション・レベルのオプティマイザ・ヒントを持つオプティマイザに、特定の問合せの最適化に関する推奨事項を提供します。

- ttOptGetFlag — データベースに設定されている既存のトランザクション・レベルのヒントを確認します。

- ttOptSetOrder: アプリケーションで、表の結合順番を指定できるようにします。

- ttOptUseIndex: アプリケーションで、使用する索引の指定または特定の索引の使用の無効化をできるようにします。つまり、問合せの各相関について考慮する必要がある索引を指定します。

- ttOptClearStats、ttOptEstimateStats、ttOptSetColIntvlStats、ttOptSetTblStats、ttOptUpdateStats: TimesTen Data Managerでアプリケーションのデータに対して保持される統計を操作します。統計は、問合せオプティマイザによって様々な処理のコスト見積りに使用されます。

これらの組込みプロシージャの中には、ユーザーが実行対象のオブジェクトに対する権限を持っている必要のあるものがあります。これらの組込みプロシージャと必要な権限の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の組込みプロシージャに関する説明を参照してください。

次の例は、ttOptSetFlag組込みプロシージャの使用方法を、ODBCとJDBCのそれぞれの場合について示しています。

注意:
ttIsqlユーティリティを使用して、オプティマイザの設定を試すこともできます。tryで始まるコマンドは、トランザクション・レベルのオプティマイザのヒントを制御します。現在のトランザクション・レベルのオプティマイザのヒント設定を確認するには、optprofileコマンドを使用します。

- 例9-8、「JDBCでのttOptSetFlagの使用」

- 例9-9、「ODBCでのttOptSetFlagの使用」

例9-8 JDBCでのttOptSetFlagの使用

次のJDBCの例は、ttOptSetFlagを使用して、オプティマイザがマージ結合を選択しないようにする方法を示しています。

import java.sql.*;
class Example
{
public void myMethod() {
CallableStatement cStmt;
PreparedStatement pStmt;
. . . . .
try {
. . . . . . .
// Prevent the optimizer from choosing Merge Join
cStmt = con.prepareCall("{
CALL ttOptSetFlag('MergeJoin', 0)}");
cStmt.execute();
// Next prepared query
pStmt=con.prepareStatement(
"SELECT * FROM Tbl1, Tbl2 WHERE Tbl1.ssn=Tbl2.ssn");
. . . . . . .
catch (SQLException ex) {
ex.printStackTrace();
}
}
. . . . . . .
}

例9-9 ODBCでのttOptSetFlagの使用

次のODBCの例は、ttOptSetFlagを使用して、オプティマイザがマージ結合を選択しないようにする方法を示しています。

#include <sql.h>
SQLRETURN rc;
SQLHSTMT hstmt; fetchStmt;
....
rc = SQLExecDirect (hstmt, (SQLCHAR *)
"{CALL ttOptSetFlag (MergeJoin, 0)}",
SQL_NTS)
/* check return value */
...
rc = SQLPrepare (fetchStmt, ...)
/* check return value */
...

10 TimesTenデータベースのパフォーマンス・チューニング

TimesTen Data Managerを使用したアプリケーションは、従来のDBMSを使用したアプリケーションと比較すると、データ・アクセスのパフォーマンスが数倍向上します。ただし、アプリケーションの設計とチューニングが適切でなければ、TimesTenのメリットを活かしきれない場合もあります。この章では、TimesTenアプリケーションのパフォーマンスに影響する要因について説明します。この要因には、データ変換のように影響の少ないものから、実行時のコマンド準備などのように影響が大きいものまで様々な要因があります。

この章では、あらゆる要因を説明します。これらの要因では、次のような設問が重要になります。

- どのようにして問題を検出するか。

- パフォーマンスへの潜在的な影響はどの程度か。

- パフォーマンスが向上するタイミングはいつか。

- パフォーマンスの代償は何か。

次の項では、パフォーマンスの問題をチューニングし特定する方法について説明します。

注意:
パフォーマンス上の問題は、SYS.SYSTEMSTATS表を調査することによっても特定できます。

- システムとデータベースのチューニング

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

- SQLのチューニング

- マテリアライズド・ビューのチューニング

- トランザクションのチューニング

- リカバリのチューニング

- 複数CPUのスケーリング

- XLAのチューニング

- キャッシュとレプリケーションのチューニング

TimesTen Javaアプリケーションのチューニングの詳細は、『Oracle TimesTen In-Memory Database Java開発者ガイド』の「Javaアプリケーションのチューニング」に関する説明を参照してください。TimesTen Cアプリケーションのチューニングの詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』の「ODBCアプリケーションのチューニング」に関する説明を参照してください。

システムとデータベースのチューニング

次の項では、システムおよびデータベースのチューニングに関するヒントを示します。

- 十分なメモリーの用意

- データベースの適切なサイズ設定

- PL/SQLランタイム用の共有メモリー・サイズの計算

- LogBufMBの増加(必要な場合)

- 一時データベースの使用(適切な場合)

- 接続オーバーヘッドの回避

- 複製時のRAMへのデータベースのロード

- 自動リカバリ失敗後のデータベースのリロードを防止する

- 競合の軽減

- ロード時のオペレーティング・システムのページングの回避

- メンテナンス用の特別なオプションの検討

- 使用するドライバの確認

- トレース機能の有効化(必要な場合のみ)

- メトリックを使用してパフォーマンスを評価する

- 別のJVMの調査

- キャラクタ・セット変換を伴うデータの移行

十分なメモリーの用意

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

データベース全体がメイン・メモリーに収まるように、システムを構成してください。仮想メモリーを使用すると、パフォーマンスが大幅に低下します。パフォーマンス監視ツールによって、過度のページングや仮想メモリー・アクティビティが示される場合は、データベース(作業セット)のサイズは適切ではありません。

大容量の共有メモリーをプロセスに割り当てるには、物理メモリーの追加やシステム・ソフトウェアの設定が必要な場合もあります。データベース内の表のサイズ見積りには、TimesTenのttSizeユーティリティを使用できます。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttSize」を参照してください。

データベースの適切なサイズ設定

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

データベースの作成時には、そのサイズを指定する必要があります。具体的には、データベースの永続メモリー領域および一時パーティションのサイズを指定します。データベースおよび共有メモリーのサイズを指定する方法の詳細は、「データベースのサイズの指定」を参照してください。

PL/SQLランタイム用の共有メモリー・サイズの計算

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

PL/SQLランタイム・システムでは、TimesTenのPL/SQLオブジェクトに関するメタデータ、および現在実行中のPL/SQLプログラム・ユニットまたは最近実行されたPL/SQLプログラム・ユニットの実行可能コードの保持に、共有メモリーの領域が使用されます。この共有メモリー領域のサイズは、PLSQL_MEMORY_SIZE初期接続属性によって制御されます。

注意:
PL/SQL (PLSQL=1)を有効にすると、PL/SQLを使用しない場合でも、固定オーバーヘッドと接続ごとのオーバーヘッドの両方がPL/SQLセグメントから自動的に割り当てられます。
詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のPLSQL_MEMORY_SIZEに関する説明を参照してください。

新しいPL/SQLプログラム・ユニットは、実行の準備時に共有メモリーにロードされます。共有メモリー領域を使用できない場合は、十分な共有メモリー領域を使用できるようになるまで、キャッシュされている最近実行されたプログラム・ユニットがメモリーから廃棄されます。現在実行中のプログラム・ユニットによってすべてのPL/SQL共有メモリーが使用されている場合、新しい接続でPL/SQLの実行を試行すると、領域不足のエラー(ORA-04031など)が発生する可能性があります。この場合は、PLSQL_MEMORY_SIZEを増やします。

そのような領域不足のエラーが発生しなくても、PLSQL_MEMORY_SIZEが小さすぎる場合があります。共有メモリーにキャッシュされているPL/SQLプロシージャを実行する方が、キャッシュされていないPL/SQLプロシージャを実行するよりCPU時間において低コストになります。本番アプリケーションでは、PLSQL_MEMORY_SIZEの値を十分に大きく設定して、頻繁に実行されるPL/SQLユニットが常にキャッシュされるようにする必要があります。TimesTenの組込みプロシージャttPLSQLMemoryStatsを使用すると、この状況が発生する頻度を判断できます。PinHitRatio値として、0から1の間の実数が返されます。

- 1.0: すべてのPL/SQLがキャッシュから実行されたことを意味します。

- 0.0: 実行ごとに、プログラム・ユニットを共有メモリーにロードする必要があったことを意味します。

PLSQL_MEMORY_SIZEの適切な値は、アプリケーションによって異なります。非常に少数のPL/SQLプログラム・ユニットが繰り返し実行される場合、必要なサイズは小さい可能性があります。数百のPL/SQLプログラム・ユニットを使用するアプリケーションの場合、必要なメモリーは大きくなります。

PinHitRatioの値が大きくなると、パフォーマンスは大幅に向上します。アプリケーション・プログラムで多数のPL/SQLストアド・プロシージャを繰り返し実行して、一連の検証を行いました。PLSQL_MEMORY_SIZEに大きい値を設定した場合、このアプリケーションのPinHitRatioは約90%となり、1つのPL/SQLプロシージャの平均実行時間は0.02秒となりました。PLSQL_MEMORY_SIZEに小さい値を設定した場合、キャッシュの競合が増加したため、PinHitRatioは66%となりました。この検証における平均実行時間は、0.26秒でした。

PLSQL_MEMORY_SIZEのデフォルト値は、UNIXシステムは32MBで、Windows 32-bitシステムは32MBです。この値は、適度に複雑な数百個のPL/SQLプログラム・ユニットの実行に十分なサイズです。本番のワークロードでしばらく実行した後、PinHitRatioの値を確認します。値が0.90より小さい場合は、PLSQL_MEMORY_SIZEを増やすことを検討してください。

LogBufMBの増加(必要な場合)

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

ログ・バッファ待機は、アプリケーション処理が、トランザクション・データをログ・バッファに挿入できず、停止してログ・バッファ領域が解放されるのを待機する必要があるときに発生します。通常この理由は、ログ・フラッシャ・スレッドが十分な速さでデータをクリアしていなかったためです。これは、ログ・バッファ領域が不十分、ディスク帯域幅が不十分、ディスクへの書込みに時間がかかりすぎる、またはログ・フラッシャがCPUの能力に依存していることを示していることが考えられます。

LogBufMBおよびLogFileSizeの値を大きくすると、パフォーマンスが大幅に向上する可能性があります。LOG_BUFFER_WAITSが大きくなっている場合は、LogBufMBの値を大きくします。LogBufMbおよびLogFileSizeの値を大きくした後もログ・バッファ待機が続いている場合、前述のその他の起こり得る可能性のある問題を確認してください。

LogBufMbの値を大きくすることで生じるデメリットは、メモリーにバッファされるトランザクションが増え、プロセスがクラッシュしたときに失われるトランザクションが多くなる可能性があることです。DurableCommitsが有効になっている場合は、デフォルトのLogBufMB値を大きくしてもパフォーマンスは改善されません。

注意:
詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のLogBufMBおよびLogFileSizeに関する説明を参照してください。

一時データベースの使用(適切な場合)

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

TimesTenデータベースは、永続データベースまたは一時データベースにできます。一時データベースは、最後の接続を解放した場合、あるいはシステムまたはアプリケーションに障害がある場合に破棄されます。一時データベースの詳細は、「データベースの概要」の説明を参照してください。

データベースをディスクに保存する必要がない場合は、一時データベースを作成することで、チェックポイントのオーバーヘッドを軽減できます。

トランザクション・ログは定期的にディスクに書き込まれますが、一時データベースは、完全にチェックポイントでディスクに書き込まれることはありません。一時データベースのトランザクション・ログに書き込まれるデータの量は、永続データベースに対して書き込まれるデータの量よりも少ないため、一時データベースの方がパフォーマンスは向上します。永続データベースの場合、データベースのサイズとアクティビティによっては、チェックポイント処理がかなりのオーバーヘッドとなる可能性がありますが、一時データベースの場合は、影響はほとんどありません。トランザクション・ログ・ファイルを削除するには、チェックポイントが必要になります。

接続オーバーヘッドの回避

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

デフォルトでは、最初の接続が確立されたときにはアイドル・データベース(接続のないデータベース)がメモリーにロードされます。最後のアプリケーションのデータベースへの接続が切断されると、ディスクへのデータベースの書込み時に遅延が発生します。アプリケーションとデータベース間の接続と切断が連続して行われる場合は、メモリーへのデータベースのロードとアンロードも連続して行われる可能性があるため、過度のディスクI/Oおよびパフォーマンスの低下が発生します。同様に、使用するデータベースが非常に大きい場合は、アプリケーションでデータベースが使用される前に、メモリーにデータベースをロードしておくようにしてください。

データベースをメモリーにロードする際の遅延を回避するには、データベースのRAMポリシーを変更して、データベースがメモリーに常駐できるようにします。この方法のデメリットは、データベースがメモリーからアンロードされないため、最後の接続を切断してもチェックポイントが発生しないことです。このため、トランザクション・ログ・ファイルで占有されているディスク領域を解放するには、データベースのチェックポイント処理をアプリケーションで明示的に実行する必要があります。

また、一定期間だけデータベースをメモリーに常駐させ、新しい接続を受け入れるように指定することもできます。この期間に新しい接続が確立されなかった場合、データベースはメモリーからアンロードされ、チェックポイント処理が実行されます。また、システム管理者がデータベースを手動でメモリーからのロードとアンロードを実行できるようにも設定できます。

データベースのRAMポリシーを変更するには、ttAdminユーティリティを使用します。RAMポリシーおよびttAdminユーティリティの詳細は、このマニュアルの「RAMポリシーの指定」および『Oracle TimesTen In-Memory Databaseリファレンス』のttAdminに関する説明を参照してください。

複製時のRAMへのデータベースのロード

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

データベースを複製する際は、ttAdminユーティリティの-ramLoadオプションを使用してください。これにより、データベースは、ブロッキング・チェックポイントでアンロードされるのではなく、接続可能な状態でメモリーに配置されます。詳細は、本書の「接続オーバーヘッドの回避」と、『Oracle TimesTen In-Memory Databaseリファレンス』のttAdminに関する説明を参照してください。

自動リカバリ失敗後のデータベースのリロードを防止する

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

データベースが無効化された後TimesTenが復旧すると、新しいデータベースがリロードされます。ただし、無効化されたデータベースはそのデータベースへの接続がすべて閉じられるまでアンロードされません。したがって、無効化されたデータベースとリカバリ後のデータベースの両方が同時にRAMに存在することがあります。

無効なデータベースがメモリーにまだ存在している間に大きなデータベースをメモリーにリロードすると、使用可能RAMが一杯になることがあります。データベースの自動リロードを防止する方法の詳細は、「自動リカバリ失敗後のデータベースのリロードを防止する」を参照してください。

競合の軽減

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

データベースで競合が発生すると、アプリケーションのパフォーマンスが大幅に低下する可能性があります。

アプリケーションでの競合を軽減するには、次の手順を実行します。

- 適切なロック方法を選択します。詳細は、「最適なロック方法の選択」を参照してください。

- 複数の表またデータベースにデータを効果的に分散します。

ロックの競合および同時実行性の低下が原因でアプリケーションのパフォーマンスが低下している場合は、パフォーマンスを向上させるために、まず競合を軽減する必要があります。

ロックの競合の詳細は、SYS.SYSTEMSTATS表内のlock.locks_granted.immediate列、lock.locks_granted.wait列およびlock.timeouts列を参照してください。

- lock.locks_granted.immediateでは、ロックが使用可能になり、ロック・リクエスト時に即時に付与された回数がカウントされます。

- lock.locks_granted.waitでは、ロックが使用可能になるまでリクエストしたユーザーが待機した後でロック・リクエストが付与された回数がカウントされます。

- lock.timeoutsでは、ロックが使用可能になるまでリクエストしたユーザーが待機しなかったためロックが付与されなかった回数がカウントされます。

同時実行性が制限されたためスループットが低下している場合、またはレスポンス時間が問題となっている場合は、アプリケーションでAPI (JDBC、ODBC、またはOCI)コールを行うスレッドまたはプロセスの数を削減できます。使用するスレッドを減らすには、アプリケーション側でキューイングとスケジューリングが必要であり、この場合、競合および待機時間を減らすためにCPU時間が多少長くなります。結果として、データベースに大部分の時間を使う同時実行性の低いアプリケーションのパフォーマンスが向上します。

ロード時のオペレーティング・システムのページングの回避

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

TimesTenのプラットフォームとなるすべてのオペレーティング・システムでは、メイン・メモリーに動的ファイル・システムのバッファ・プールが作成されます。このバッファ・プールを大きくできる場合は、TimesTenとオペレーティング・システムの両方がファイルのコピーをメモリー内に格納するため、TimesTenの一部の共有セグメントがページ・アウトされます。

実装されたメモリー・サイズの半分よりも小さいデータベースの場合は、この現象が発生しないこともあります。システムによっては、ファイル・システムで使用するメイン・メモリーを制限できます。また、この効果があまりないシステムもあります。

AIXの場合は、ラージ・ページの構成によって、共有セグメントをページングできないようにメモリー内にロックすると、ページングを回避できます。AIXでラージ・ページを構成する方法の詳細は、『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』のラージ・ページ(AIX)に関する説明を参照してください。

Linuxの場合は、ラージ・ページの構成によって、共有セグメントをページングできないようにメモリー内にロックすると、ページングを回避できます。Linuxでラージ・ページを構成する方法の詳細は、『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』のラージ・ページ(Linux)に関する説明を参照してください。

メンテナンス用の特別なオプションの検討

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

最初のロードなど、特別な処理を実行する場合は、通常とは異なる別のオプションを選択できます。特に、バルク・ロードを行う場合はttBulkCpまたはttMigrateなどを使用し、データベース・レベル・ロックを使用することを検討してください。これらの設定により、ロード時のパフォーマンスを2倍にすることも可能です。

データベース・レベル・ロックに代わる方法として、同時実行性を利用する方法があります。-notblLockオプションを使用すると、ttBulkCp -iのコピーを複数実行できます。ttBulkCpのバッチ処理を最適化するには、-xp 256オプションを追加します。ttMigrateに-numThreadsオプションを指定して実行すると、個々の表または複数の表を同時にロードできます。

詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttBulkCp」および「ttMigrate」を参照してください。

使用するドライバの確認

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

TimesTen Data Managerドライバには、プラットフォームごとに、デバッグ・バージョンと本番バージョンの2種類があります。デバッグを実行しないときは、本番バージョンを使用してください。デバッグ・ライブラリを使用すると、処理がかなり遅くなることがあります。各種プラットフォームのTimesTen Data Managerドライバについては、「Data Manager DSNの指定」および「ODBCドライバの指定」を参照してください。

Windowsの場合は、ODBC Driver Managerを使用するアプリケーションが、適切なTimesTenドライバにアクセスするDSNを使用していることを確認してください。アプリケーションでは、適切なTimesTenドライバにリンクされていることを確認してください。直接接続アプリケーションの場合、TimesTen Data Managerドライバを使用します。アプリケーションからは、SQL_DRIVER_NAME引数を指定してODBC SQLGetInfo関数をコールし、使用するドライバを決定できます。

トレース機能の有効化(必要な場合のみ)

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

ODBCとJDBCには、その両方にアプリケーションをデバッグするためのトレース機能があります。パフォーマンスを重視している場合は、アプリケーションのデバッグ時を除き、トレース機能を無効に設定してください。

JDBCのトレース機能を有効にするには、次のメソッドを使用します。

DriverManager.setLogStream method:
DriverManager.setLogStream(new PrintStream(System.out, true));

デフォルトでは、トレース機能は無効です。このメソッドをコールしてから、JDBCドライバをロードする必要があります。トレース機能を有効にした後、アプリケーションの実行中はトレース機能を無効にできません。

メトリックを使用してパフォーマンスを評価する

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

ttStatsユーティリティを使用して、データベース・メトリックを収集および表示できます。ttStatsユーティリティでは、次の機能を実行できます。

- パフォーマンス・メトリックをリアルタイムでモニタリングおよび表示し、前のインターバルからの変化率を計算する。

- メトリックのスナップショットを収集してデータベースに格納し、値と変更率を記載したレポートを、指定したスナップショットのペアから生成する(これらの機能はTT_STATS PL/SQLパッケージへのコールを介して実行)。

ttStatsユーティリティは、TimesTenシステム表、ビューおよび組込みプロシージャからメトリックを収集します。レポートには、メモリー使用量、接続、ロード・プロファイルの概要などの情報が含まれ、その後に(必要に応じて) SQL文、トランザクション、PL/SQLメモリー、レプリケーション、ログとログの保持、チェックポイント、キャッシュ・グループ、キャッシュ・グリッド、ラッチ、ロック、XLAおよびTimesTen接続属性に関するメトリックが続きます。

ttStatsユーティリティの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttStatsに関する説明を参照してください。TT_STATS PL/SQLパッケージの詳細は、『Oracle TimesTen In-Memory Database PL/SQLパッケージ・リファレンス』のTT_STATSに関する説明を参照してください。

別のJVMの調査

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

JRockitおよびIBMでは、Sun JVMより高パフォーマンスのJVMが提供されています。

キャラクタ・セット変換を伴うデータの移行

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

データベースの移行時にキャラクタ・セット変換がリクエストされた場合は、キャラクタ・セット変換がリクエストされない場合よりパフォーマンスが低下します。

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

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

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

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

- タイムアウト時間の選択

- 最適なロック方法の選択

- クライアントとサーバーが同じシステム上にあるとき、共有メモリー・セグメントをIPCとして使用

- シリアライズ可能トランザクションのTT_PREFETCH_CLOSEの有効化

- SQLTransactのコール時における接続ハンドルの使用

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

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

クライアント/サーバーのパフォーマンスは、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文の総実行回数。

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

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

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

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

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

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

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

TimesTen Clientを使用してリモート・サーバー・システムにあるデータベースにアクセスする場合、接続に対してネットワーク上のオーバーヘッドが発生します。可能な場合は、TimesTen Data Managerをローカルにアクセスするようにアプリケーションを作成し、アプリケーションをTimesTen Data Managerと直接リンクするようにしてください。

タイムアウト時間の選択

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

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

詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttLockWait」を参照してください。

最適なロック方法の選択

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

複数の接続で同時にデータベースにアクセスする場合、TimesTenは、ロックを使用して様々なトランザクションが明示的に分離されて処理されるようにします。TimesTenでは、第7章「トランザクション管理」で説明される分離レベルをサポートしています。また、データベース・レベル・ロック、表レベル・ロックおよび行レベル・ロックのロック・レベルをサポートしています。LockLevel接続属性を使用すると、データベース・レベル・ロックと行レベル・ロックのどちらを使用するか指定できます。表ロックを使用するかどうかを示すオプティマイザ・ヒントを設定するには、ttOptSetFlagプロシージャを使用します。デフォルトのロック粒度は行レベル・ロックです。

注意:
詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の「LockLevel」および「ttOptSetFlag」を参照してください。

適切なロック・レベルの選択

データベースで競合がほとんど発生しない場合は、表レベル・ロックを使用します。これによって、パフォーマンスが改善され、デッドロックの可能性も低くなります。通常、トランザクションが短時間の場合または接続が少ない場合は、データベースで競合はほとんど発生しません。この場合、トランザクションが重複する可能性は低くなります。

また、表レベル・ロックは、文が表のほぼすべての行にアクセスする場合にも有効です。このような文には、1つのトランザクションで実行される問合せ、更新、削除、複数の挿入などがあります。

データベース・レベル・ロックは、単一のトランザクションに対するデータベース・アクセスを完全に制限するため、通常の操作には推奨されません。データベース・レベル・ロックを使用して長時間実行されるトランザクションは、データベースへの他のアクセスをすべてブロックし、データベースの監視と保守に必要な各種のバックグラウンド・タスクにさえ影響します。

通常、同じ行にアクセスする必要がほとんどない同時トランザクションが多数存在する場合は、行レベル・ロックを使用することを薦めします。プロセッサ数が十分で、同時実行性能が高い最新のシステム、たとえば複数のttBulkCpプロセスでは、行レベル・ロックのほうがデータベース・レベル・ロックよりパフォーマンスが高いのが普通です。

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

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

クライアントとサーバーが同じシステム上にあるとき、共有メモリー・セグメントをIPCとして使用

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

TimesTen Clientは、通常、TCP/IPソケットを使用してTimesTen Serverと通信します。TimesTen ClientとTimesTen Serverの両方が同一システム上にある場合は、プロセス間の通信(IPC)に共有メモリー・セグメントまたはUNIXドメイン・ソケットを使用することで、クライアント・アプリケーションのパフォーマンスが改善されます。

共有メモリー・セグメントをIPCとして使用するには、ttendaemon.optionsファイルでサーバー・オプションを設定する必要があります。サーバー・オプションについては、「TimesTen Serverのオプションの変更」を参照してください。

また、IPCに共有メモリー・セグメントを使用するアプリケーションでは、ネットワーク・アドレスとしてttShmHostを使用して、クライアントDSNに対する論理サーバー名を設定する必要があります。詳細は、「UNIXでのクライアントDSNの作成および構成」を参照してください。

この機能は共有メモリーを大量に必要とする可能性があります。TimesTen Serverは、既存の接続数や全接続内の文の数にかかわりなく、共有メモリー・セグメントを事前に割り当てます。

UNIXシステムでアプリケーションを実行しているときにメモリーの使用量が懸念される場合は、UNIXドメイン・ソケットを通信に使用すると、TimesTen Client ODBCドライバを使用しているアプリケーションのパフォーマンスを改善できる場合があります。UNIXドメイン・ソケットの使用によるパフォーマンスの改善は、ShmIPCを使用した場合ほど大きくありません。

ローカル接続にUNIXドメイン・ソケットを使用するアプリケーションでは、ネットワーク・アドレスとしてttLocalHostを使用して、クライアントDSNに対する論理サーバー名を設定する必要があります。詳細は、「UNIXでのクライアントDSNの作成および構成」を参照してください。また、システム・カーネル・パラメータが、必要な接続数を許容するように設定されていることも確認してください。『Oracle TimesTen In-Memory Databaseインストレーション・ガイド』のインストールの前提条件に関する説明を参照してください。

シリアライズ可能トランザクションのTT_PREFETCH_CLOSEの有効化

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

クライアント/サーバー・アプリケーションで、シリアライズ可能トランザクションのTT_PREFETCH_CLOSEを有効にします。シリアライズ可能分離モードでは、読取り専用トランザクションを含むすべてのトランザクションが実行時にコミットされる必要があります。TT_PREFETCH_CLOSEが有効になっている場合、サーバーでは、結果セット全体が読取り専用の問合せに対してフェッチされた後でカーソルが閉じられ、トランザクションがコミットされます。クライアントでは、SQLFreeStmt(SQL_CLOSE)およびSQLTransact(SQL_COMMIT)がコールされる必要がありますが、これらのコールは、クライアントで実行されるため、クライアントとサーバー間のネットワーク・ラウンドトリップを必要としません。TT_PREFETCH_CLOSEによって、クライアントとサーバー間のネットワーク通信量が削減され、パフォーマンスが向上します。

TT_PREFETCH_CLOSEが有効になっている場合、複数の文ハンドルは使用しないでください。サーバーでは、クライアントが終了する前に、結果セットのすべてがフェッチされ、トランザクションがコミットされて文ハンドルがクローズされる可能性があります。

次の例は、ODBCとJDBCでTT_PREFETCH_CLOSEオプションを使用する方法を示しています。この例では、SQLSetConnectOption ODBC関数を指定してTT_PREFETCH_CLOSEを設定します。SQLSetStmtOption ODBC関数を指定して設定することもできます。

SQLSetConnectOption (hdbc, TT_PREFETCH_CLOSE, TT_PREFETCH_CLOSE_ON);
SQLExecDirect (hstmt, "SELECT * FROM T", SQL_NTS);
while (SQLFetch (hstmt) != SQL_NO_DATA_FOUND)
{
// do the processing
}
SQLFreeStmt (hstmt, SQL_CLOSE);

この例では、JDBCを使用してTT_PREFETCH_CLOSEオプションを有効にする方法が示されています。

con = DriverManager.getConnection ("jdbc:timesten:client:" + DSN);
stmt = con.createStatement();
import com.timesten.sql
...
...
con.setTtPrefetchClose(true);
rs = stmt.executeQuery("select * from t");
while(rs.next())
{
// do the processing
}
import com.timesten.sql
....
try {
((TimesTenConnection)con).setTtPrefetchClose(true);
}
catch (SQLException) {
...
}
rs.close();
con.commit();

SQLTransactのコール時における接続ハンドルの使用

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

アプリケーションは、SQL_NULL_HDBCおよび有効な環境ハンドルを使用してSQLTransactをコールできます。

SQLTransact (ValidHENV, SQL_NULL_HDBC, fType)

または、有効な接続ハンドルを使用してコールすることもできます。

SQLTransact (SQL_NULL_HENV, ValidHDBC, fType).

アプリケーションでは、単一接続でコミットまたはロールバックするのみの場合、SQLTransactのコール時に有効な接続ハンドルを使用する必要があります。

SQLのチューニング

全体のロックおよびI/Oの方針の決定後、個々のSQL文をできるだけ効率的に実行できるようにしてください。次の項では、SQL文を簡素化する方法について説明します。

- 文のチューニングと索引の使用

- SQL文の実行時間のサンプリングを収集および評価する

- ハッシュ索引、範囲索引またはビットマップ索引の適切な選択

- ハッシュ索引サイズの適切な設定

- 外部キー制約の適切な使用

- 正確な統計または見積り統計の計算

- 現在の表統計を再生成するスクリプトを作成する

- コマンドの無効化をSQLコマンド・キャッシュで制御する

- ALTER TABLEの回避

- 問合せのネストの回避

- 文の事前準備

- 不要な準備処理の回避

- 表圧縮を使用したデータの効率的な保存

- 同時書込み処理時の読取り最適化の制御

文のチューニングと索引の使用

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

すべての文が効率的に実行されているかどうかをチェックします。たとえば、使用する問合せは、必要な結果セットを生成するために必要な行のみを参照するようにします。表t1のcol1のみが必要であれば、次の文を使用します。

SELECT col1 FROM t1...

または、次の文を使用します。

SELECT * FROM t1...

TimesTenで文を実行するために使用される計画の表示方法については、第9章「TimesTen問合せオプティマイザ」を参照してください。また、計画は、ttIsql showplanコマンドを使用して表示することもできます。アプリケーションで頻繁に実行される各文の計画を表示します。索引が条件を評価するために使用されていない場合は、索引を使用できるように、新しい索引の作成または文や問合せの再作成を検討してください。たとえば、比較条件(一致および不一致)の一方またはBETWEEN条件に単一の列が表示される場合に、索引をWHERE句を評価するためにのみ使用できます。

この比較条件が頻繁に評価される場合は、再作成するのが妥当です。

WHERE c1+10 < c2+20

これを次のように書きなおします。

WHERE c1 < c2+10

c1に索引を作成します。

索引が存在することにより、UPDATE、INSERT、DELETE、CREATE VIEWなどの書込み操作の処理速度が遅くなります。アプリケーションでの読取りが少ないものの、表への書込みが多い場合は、その表の索引によってパフォーマンスが向上するのではなく、低下する可能性があります。

場合によっては、問合せ評価の処理速度を向上するために、システムによって一時索引が作成される場合があります。このような場合が頻繁にある場合は、アプリケーション自体で索引を作成する方が効率的です。MONITOR表のCMD_TEMP_INDEXES列は、問合せ評価時に一時索引が作成された回数を示します。

表またはキャッシュ・グループに対して時間ベースのエージングを実装している場合は、タイムスタンプ列に索引を作成すると、エージングのパフォーマンスが向上します。詳細は、「時間ベースのエージング」を参照してください。

SQL文の実行時間のサンプリングを収集および評価する

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

TimesTenには、SQL操作の実行時間を測定して表示することでSQL文のパフォーマンスを判断できる組込みプロシージャがあります。追跡のかわりに、組込みプロシージャがSQL文の実行中に実行時間をサンプリングします。この組込みプロシージャは、SQLExecute API内で実行の時間を測定することで、SQL文の実行時間を測定します。

ttStatsConfig組込みプロシージャと次の名前と値のペアを使用して、サンプリング・レートと実行時間の収集方法を構成できます。

注意:
詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttStatsConfigに関する説明を参照してください。

表10-1 ttStatsConfigパラメータと値の説明

パラメータ

説明

SQLCmdSampleFactor

SQL文と実行時間タイミングのサンプルを収集する方法を構成します。デフォルトは0です。これはサンプリングをオフにするという意味です。たとえば10に設定すると、TimesTenはSQL文の実行のウォール・クロック時間を、10個の文ごとにキャプチャします。

ConnSampleFactor

個々の接続でSQL文のサンプルを収集する頻度を構成します。値は2個のパラメータがカンマで区切られ、引用符で囲まれているため、単一の値のように見えます。1番目の値は接続IDです。2番目の値はSQLCmdSampleFactorと同じで、コマンドのサンプルを取得する頻度を指定する数値です。デフォルトでは、個々の接続に対してサンプリングはオフになっています(0に設定されています)。

SQLCmdHistogramReset

0以外の値に設定すると、SQL実行時間のヒストグラム・データがクリアされます。

StatsLevel

使用する統計レベルを設定します。値はNONE、BASIC、TYPICAL、またはALLに設定できます。デフォルトはTYPICALです。レベルをALLに設定すると、パフォーマンスが低下する場合があります。

次は、ttStatsConfig組込みプロシージャで名前と値のペアを設定する方法の例です。

注意:
すべてのトランザクションをサンプリングするかわりに、ttStatsConfig組込みプロシージャのConnSampleFactorパラメータを使用して代表的な接続を選択すると、最良の結果が得られます。小さなサンプリング係数ですべてのトランザクションをサンプリングすると、パフォーマンスが低下するおそれがあります。
意味のある結果を得るには、データベースをメモリーに読み込んだままにする必要があります。データベースのアンロードとリロードを行うと、SQLコマンドキャッシュが空になるためです。

接続1で文を5個ごとにサンプリングします。

Command> call ttStatsConfig('ConnSampleFactor', '1,5');
< CONNSAMPLEFACTOR, 1,5 >
1 row found.

接続1のサンプリングをオフにします。

Command> call ttStatsConfig('ConnSampleFactor', '1,0');
< CONNSAMPLEFACTOR, 1,0 >
1 row found.

すべてのコマンドをサンプリングします。

Command> call ttStatsConfig('SqlCmdSampleFactor',1);
< SQLCMDSAMPLEFACTOR, 1 >
1 row found.

サンプリングの設定を確認します。

Command> call ttStatsConfig('SqlCmdSampleFactor');
< SQLCMDSAMPLEFACTOR, 1 >
1 row found.

データベース統計の現在の収集レベルを確認します。

Command> call ttStatsConfig('StatsLevel');
< STATSLEVEL, TYPICAL >
1 row found.

データベース統計収集をNONEに設定してオフにします。

Command> call ttStatsConfig('StatsLevel','None');
< STATSLEVEL, NONE >
1 row found.

収集する統計の構成の完了後、ttSQLCmdCacheInfo組込みプロシージャを使用すると、収集された統計が表示されます。実行時間のヒストグラムをコマンドレベルまたはデータベースレベルで表示するには、ttSQLExecutionTimeHistogram組込みプロシージャを使用します。

ttSQLCmdCacheInfo組込みプロシージャは、SQL実行時間統計に関する次の情報を表示します。

- この文のために内部的に行われたフェッチの実行回数です。

- 文が開始したときのタイムスタンプです。

- この文の最大ウォール・クロック実行時間が秒単位で表示されます。

- 最後に測定された実行時間が秒単位で表示されます。

- 最小実行時間が秒単位で表示されます。

次の例では、ディスプレイには末尾の5つの値に次の統計が表示されます。

Command> vertical call ttSQLCmdCacheInfo(135680792);

SQLCMDID:                        146250096
PRIVATE_COMMAND_CONNECTION_ID:   2048
EXECUTIONS:                      40
PREPARES:                        20
REPREPARES:                      1
FREEABLE:                        1
SIZE:                            3880
OWNER:                           ORATT
QUERYTEXT:                       select min(unique2) from big1
FETCHCOUNT:                      40
STARTTIME:                       2012-06-18 13:10:46.808000
MAXEXECUTETIME:                  .001319
LASTEXECUTETIME:                 .000018
MINEXECUTETIME:                  .000017
1 row found.

ttSQLCmdCacheInfo組込みプロシージャの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttSQLCmdCacheInfoに関する説明を参照してください。

ttSQLExecutionTimeHistogram組込みプロシージャは、SQL実行時間のヒストグラムを、単一のSQLコマンドまたはコマンドキャッシュにあるすべてのSQLコマンドに対して表示します。その際、サンプリングが有効になっていると仮定されます(SQLCmdSampleFactorが0より大きい)。

ヒストグラムには、ヒストグラムのバケットごとに1つの行が表示されます。各行には次の情報が含まれます。

- TimesTenデータベースを開始した時点、またはttStatsConfig組込みプロシージャを使用して統計をリセットした時点のいずれか以降に測定された、SQL文の実行時間操作の数。

- 累積ウォール・クロック実行時間。

- 各時間フレームを示す実行時間制限。

- 最後の行は、特定の時間フレーム内に実行されたSQL文の数を示します。

次の例は、ttSQLExecutionTimeHistogram組込みプロシージャの出力を示します。

次のttSQLExecutionTimeHistogram組込みプロシージャの例は、合計1919個の文が実行されたことを示します。1919個の文すべての合計実行時間は1.090751秒でした。この例は、SQL文が次のタイムフレーム内で実行されたことを示します。

- 0.00001562秒以下のタイムフレーム内で、278個の文が実行されました。

- 0.00001562秒より大きく0.000125秒以下のタイムフレームで、1484個の文が実行されました。

- 0.000125秒より大きく0.001秒以下のタイムフレームで、35個の文が実行されました。

- 0.001秒より大きく0.008秒以下のタイムフレームで、62個の文が実行されました。

- 0.008秒より大きく0.064秒以下のタイムフレームで、60個の文が実行されました。

Command> call ttSQLExecutionTimeHistogram;
< 1919, 1.090751, .00001562, 278 >
< 1919, 1.090751, .000125, 1484 >
< 1919, 1.090751, .001, 35 >
< 1919, 1.090751, .008, 62 >
< 1919, 1.090751, .064, 60 >
< 1919, 1.090751, .512, 0 >
< 1919, 1.090751, 4.096, 0 >
< 1919, 1.090751, 32.768, 0 >
< 1919, 1.090751, 262.144, 0 >
< 1919, 1.090751, 9.999999999E+125, 0 >
10 rows found.

ハッシュ索引、範囲索引またはビットマップ索引の適切な選択

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

TimesTenデータベースでは、ハッシュ索引、範囲索引およびビットマップ索引の各索引がサポートされています。次に、それぞれの索引の種類をいつ使用するのが適切か説明します。

ハッシュ索引は、1つ以上の列で完全一致する行を検索する場合に有効です。ハッシュ索引は、一致検索の実行に便利です。ハッシュ索引は次のいずれかの方法で作成されます。

- CREATE [UNIQUE] HASH INDEX文を使用すると、ハッシュ索引または一意のハッシュ索引を作成できます。

- CREATE TABLE... UNIQUE HASH ON文を使用すると、表の作成時に一意のハッシュ索引を作成できます。一意のハッシュ索引は、表の主キー列に対して指定します。

範囲索引は、デフォルトではCREATE TABLE文で作成します(CREATE [UNIQUE] HASH INDEX文で作成することも可能です)。範囲索引では完全一致のキーの検索を高速化でき、より柔軟性が高く、他の問合せの高速化にも利用できます。問合せにLESS THANまたはGREATER THANの比較がある場合は、範囲索引を選択します。範囲索引は、カーディナリティの高いデータ(CUSTOMER_NAMEまたはPHONE_NUMBERなどの使用可能な値が多数あるデータ)に対して効果的です。範囲索引はインメモリーのデータ管理に最適化されています。

また、範囲索引は、接頭辞問合せの高速化に使用することもできます。接頭辞問合せでは、指定されている最後のキー列以外のすべての列に一致条件を指定できます。接頭辞問合せの最後の列には、一致条件または不一致条件を指定できます。

次の表および索引の定義について考えてみます。

CREATE TABLE T(i1 integer, i2 integer, i3 integer, ...);
CREATE INDEX IXT on T(i1, i2, i3);

索引IXTを使用すると、次の問合せを高速化できます。

SELECT * FROM T WHERE i1>12;
SELECT * FROM T WHERE i1=12 and i2=75;
SELECT * FROM T WHERE i1=12 and i2 BETWEEN 10 and 20;
SELECT * FROM T WHERE i1=12 and i2=75 and i3>30;

索引IXTは次の問合せには使用されません。接頭辞プロパティが条件を満たしていないためです。

SELECT * FROM T WHERE i2=12;

i1に一致条件が指定されていません。

次のような問合せの場合、索引IXTは使用されますが、一致検索は最初の2列のみに対して実行されます。

SELECT * FROM T WHERE i1=12 and i2<50 and i3=630;

範囲索引の構造は、表サイズの変更に対応して自動的に調整される動的構造です。範囲索引は、一意にすることも一意にしないこともでき、またNULL値可能列に対して宣言することもできます。また、レコードの挿入後、索引付けされた列の値を変更することもできます。範囲索引は、ほとんどの場合、同等のハッシュ索引より単純です。

ビットマップ索引は、CREATE INDEX文で作成します。ビットマップ索引は、カーディナリティの低い列のデータを検索および取得する場合に効果的です。特に、一致問合せでANDおよびOR演算子を使用している場合に有効です。これらの索引を使用すると、ANDおよびOR演算子で連結した複数の条件を複数の列に対して指定する、複雑な問合せのパフォーマンスが向上します。ビットマップ索引は、データ・ウェアハウス環境で広く使用されています。通常、データ・ウェアハウス環境では、大量のデータおよび非定型の問合せが処理されますが、DMLの同時トランザクションは低レベルです。ビットマップ索引は、圧縮されるため、他の索引方法と比較して必要な記憶域が少なくなります。ビットマップ索引を使用する場合の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のCREATE INDEXに関する説明を参照してください。

ハッシュ索引サイズの適切な設定

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

TimesTenはハッシュ索引を、主キーの制約として、およびCREATE INDEX文の一部として指定された場合の両方で使用します。ハッシュ索引のサイズは、CREATE TABLEおよびCREATE INDEX文のUNIQUE HASH ON句で指定するPAGESパラメータで決まります。PAGESの値は、表の予想行数を256で割った値にする必要があります。たとえば、256,000行の表の場合、PAGES = 1000とします。小さい値を指定すると、ハッシュ競合の数が増加してパフォーマンスが低下し、大きい値を指定すると、パフォーマンスが多少向上するかわりに索引で追加の領域が必要になります。

表の行数が大幅に変動し、パフォーマンスが主な検討事項である場合、大きな索引を作成するのが最善です。表のサイズを正確に予測できない場合は、範囲索引を使用することを検討してください。また、索引付けする列が大きいCHAR値またはバイナリ値の場合、あるいは索引付けする列が多い場合は、一意索引の使用を検討してください。これらの場合は、一意索引の方がハッシュ索引より高速になる場合があります。

表のサイズが大きくなるにつれてレコード挿入のパフォーマンスが低下する場合は、表の予想サイズを小さく見積りすぎていた可能性があります。ALTER TABLE文を使用してUNIQUE HASH ON句のPAGES値を再設定することによって、ハッシュ索引のサイズを変更できます。SET PAGESの詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のALTER TABLEに関する説明を参照してください。

外部キー制約の適切な使用

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

外部キーを宣言しても、SELECT問合せのパフォーマンスには影響ありませんが、外部キーが定義された表でINSERTおよびUPDATEを実行する場合、および外部キーで参照される表でUPDATEおよびDELETEを実行する場合は、パフォーマンスが低下します。この低下は、表を参照する外部キーの数または表に定義されている外部キーの数に比例します。

正確な統計または見積り統計の計算

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

データベース内のデータに関する統計が利用できる場合、TimesTenオプティマイザは、コマンドを準備する際に、それらの統計を使用してデータへの最適なパスを決定します。統計がない場合、TimesTenオプティマイザは、データ配布に関して一般的な予測を行います。

注意:
詳細は、第9章「TimesTen問合せオプティマイザ」を参照してください。

情報によって問合せオプティマイザの計画がより効率的になる可能性があるため、文を準備する前に統計を計算する必要があります。パフォーマンスは統計収集プロセスの影響を受けるため、統計を収集する場合は、新しい統計を収集するとき、およびその頻度を決定する必要があります。収集の頻度は、統計収集プロセスで起こるオーバーヘッドの処理に対し、オプティマイザの正確な統計を出すタスクのバランスをとる必要があります。

統計の計算は時間がかかる処理のため、次のガイドラインを使用して統計を計算してください。

- データベースのロード後またはアプリケーションのメジャー・アップグレード後に、統計を更新します。

- トランザクションのロードが大きいときに統計を更新しないでください。

- 表、列またはPL/SQLオブジェクトに相当な作成および変更がある場合は、統計を更新します。
データベースで相当数の表、列またはPL/SQLオブジェクトを作成または変更した場合、システム表SYS.TABLES、SYS.COLUMNSおよびSYS.OBJ$に対応したデータ・ディクショナリのオプティマイザ統計を更新する必要があります。

- バルク・ロードや一括削除など、バッチ操作で表を大幅に変更する場合、バッチ操作の一環としてこれらの表の統計を収集できます。

- 表が増分的に変更されるだけの場合は、1週間に1回や1か月に1回程度の頻度で、統計を更新します。

- トランザクション負荷が低い時間帯は、定期的に実行されるスクリプトまたはバッチ・ジョブの一環として統計を更新します。

- 複数の大規模な表の統計を更新する場合は、「大規模な表の表統計のパラレルでの更新」を参照してください。

注意:
パフォーマンス上の理由から、TimesTenでは、統計が計算される際に表または行のロックは保持されません。

統計を計算するために、ttIsql statsupdateコマンド、ttOptUpdateStatsまたはttOptEstimateStatsを使用します。表名として空の文字列を指定すると、現行ユーザーのスキーマ内のすべての表の統計が更新されます。

- ttIsql内のstatsupdateコマンドは、対象の表の各行を評価し、正確な統計を計算します。

- ttOptUpdateStats組込みプロシージャは、対象となる表のすべての行を評価し、正確な統計を計算します。

- ttOptEstimateStats組込みプロシージャは、対象となる表の一部の行のみを評価し、見積り統計を計算します。これは高速に実行できますが、統計の正確性に劣ることがあります。10パーセントのサンプルで統計を計算すると、正確な統計を計算するより処理が約10倍速くなり、通常は同じ実行計画が生成されます。

注意:
ttIsqlまたは組込みプロシージャの詳細は、『Oracle TimesTen In-Memory Database開発者および管理者ガイド』の「ttIsql」および「組込みプロシージャ」に関する説明を参照してください。

大規模な表の表統計のパラレルでの更新

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

すべてのTimesTen表で表統計を最新の状態に保つことは重要です。ただし、この処理を大規模な表で実行すると、時間がかかり、パフォーマンスに負荷がかかります。複数の大規模な表の統計を更新する場合は、ttOptUpdateStats組込みプロシージャをパラレルでコールすることを検討してください。

注意:
100万行より少ない行が含まれている場合、TimesTen表は小規模な表とみなされます。1億行を超える行が含まれている場合、TimesTen表は大規模な表とみなされます。

表統計を更新する場合は、すべての大規模な表に対してttOptUpdateStats組込みプロシージャをコールします。それぞれのttOptUpdateStats組込みプロシージャをパラレルでコールしてください。ttOptUpdateStats組込みプロシージャの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttOptUpdateStatsに関する説明を参照してください。

Command> call ttOptUpdateStats('table1',0,0);
Command> call ttOptUpdateStats('table2',0,0);
...
...
Command> call ttOptUpdateStats('finaltable',0,0);

ttOptUpdateStats組込みプロシージャのコールが完了したら、表統計を更新した大規模なTimesTen表に対するトランザクションのアクセス数を確認します。トランザクション・ロード時間が短い間はttOptCmdCacheInvalidate('',1)組込みプロシージャを実行します。ttOptCmdCacheInvalidate組込みプロシージャの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttOptCmdCacheInvalidateに関する説明を参照してください。トランザクション・ロード時間が長いときに、次の組込みプロシージャを実行し、各ttOptCmdCacheInvalidate組込みプロシージャはパラレルでコールします。

Command> call ttOptCmdCacheInvalidate('table1',1);
Command> call ttOptCmdCacheInvalidate('table2',1);
...
...
Command> call ttOptCmdCacheInvalidate('finaltable',1);

表の表統計が更新され、SQLコマンド・キャッシュのコンパイルされたコマンドは無効になりました。

現在の表統計を再生成するスクリプトを作成する

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

表統計を現在の状態にリストアできるttOptStatsExport組込みプロシージャを使用して、SQLスクリプトを生成できます。これらの文を適用する場合、同じ環境を再作成します。表統計の再作成は、SQLパフォーマンスの診断に使用できます。

ttOptStatsExport組込みプロシージャをコールして、表統計を現在の状態にリストアするために必要な一連の文を返します。表を指定しない場合、ttOptStatsExportは、コール元のユーザーがアクセス権限を持っているすべてのユーザー表についての表統計をリストアするために必要な一連の文を返します。

注意:
この組込みプロシージャの詳細および構文は、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttOptStatsExport」を参照してください。

次の例では、employees表の統計をリストアするための実行に必要な一連の組込みプロシージャ・コマンドを返します。

Command> CALL ttOptStatsExport('HR.employees');

< call ttoptsetcolIntvlstats('HR.EMPLOYEES', 'EMPLOYEE_ID', 0, (6, 0, 107, 107,
(20, 20, 1 ,100, 120, 101), (20, 20, 1 ,121, 141, 122), (20, 20, 1 ,142, 162,
143), (20, 20, 1 ,163, 183, 164), (20, 20, 1 ,184, 204, 185), (1, 1, 1 ,205, 206,
205))); >
< call ttoptsetcolIntvlstats('HR.EMPLOYEES', 'FIRST_NAME', 0, (1, 0, 89, 107,
(89, 107, 0, 'Adam', 'Winston', 'Adam'))); >
< call ttoptsetcolIntvlstats('HR.EMPLOYEES', 'LAST_NAME', 0, (1, 0, 97, 107, (97,
107, 0, 'Abel', 'Zlotkey', 'Abel'))); >
< call ttoptsetcolIntvlstats('HR.EMPLOYEES', 'EMAIL', 0, (6, 0, 107, 107, (20,
20, 1, 'ABANDA', 'DGREENE', 'ABULL'), (20, 20, 1, 'DLEE', 'JKING', 'DLORENTZ'),
(20, 20, 1, 'JLANDRY', 'LOZER', 'JLIVINGS'), (20, 20, 1, 'LPOPP', 'RMATOS',
'LSMITH'), (20, 20, 1, 'RPERKINS', 'WGIETZ', 'SANDE'), (1, 1, 1, 'WSMITH',
'WTAYLOR', 'WSMITH'))); >
< call ttoptsetcolIntvlstats('HR.EMPLOYEES', 'PHONE_NUMBER', 0, (1, 0, 103, 107,
(103, 107, 0, '011.44.1343.329268', '650.509.4876', '011.44.1343.329268'))); >
< call ttoptsetcolIntvlstats('HR.EMPLOYEES', 'HIRE_DATE', 0, (1, 0, 90, 107, (90,
107, 0 ,'1987-06-17 00:00:00', '2000-04-21 00:00:00', '1987-06-17 00:00:00'))); >
< call ttoptsetcolIntvlstats('HR.EMPLOYEES', 'JOB_ID', 0, (4, 0, 19, 107, (11,
16, 5, 'AC_ACCOUNT', 'PR_REP', 'FI_ACCOUNT'), (3, 11, 30, 'PU_CLERK', 'SA_REP',
'SA_REP'), (1, 20, 20, 'SH_CLERK', 'ST_CLERK', 'ST_CLERK'), (0, 0, 5, 'ST_MAN',
'ST_MAN', 'ST_MAN'))); >
< call ttoptsetcolIntvlstats('HR.EMPLOYEES', 'SALARY', 0, (1, 0, 57, 107, (57,
107, 0 ,2100, 24000, 2100))); >
< call ttoptsetcolIntvlstats('HR.EMPLOYEES', 'COMMISSION_PCT', 0, (1, 72, 7, 107,
(7, 35, 0 ,0.1, 0.4, 0.1))); >
< call ttoptsetcolIntvlstats('HR.EMPLOYEES', 'MANAGER_ID', 0, (1, 1, 18, 107,
(18, 106, 0 ,100, 205, 100))); >
< call ttoptsetcolIntvlstats('HR.EMPLOYEES', 'DEPARTMENT_ID', 0, (3, 1, 11, 107,
(4, 10, 45 ,10, 50, 50), (2, 6, 34 ,60, 80, 80), (2, 5, 6 ,90, 110, 100))); >
< call ttoptsettblstats('HR.EMPLOYEES', 107, 0); >
12 rows found.

コマンドの無効化をSQLコマンド・キャッシュで制御する

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

TimesTenは、コンパイルされたコマンドをSQLコマンド・キャッシュにキャッシュします。これらのコマンドは無効化できます。無効になったコマンドは、通常、再実行される直前に再度自動的に準備されます。1つのコマンドが何度も準備されることがあります。

注意:
コマンドを自動的に無効化する方法の詳細は、「最適化を実行するタイミング」を参照してください。

統計を計算するとき、特定の表にある同一のロックについて、コマンドの更新とコンパイルのプロセスが競合することがあります。複数のトランザクションで統計を収集していて、統計の更新ごとにコマンドを無効にしていると、次の問題が発生することがあります。

- 複数の表を参照する結合問合せが無効化され、2回以上再コンパイルされることがあります。

- 再コンパイルに必要なロックが統計の更新に差し支え、その結果デッドロックが発生することがあります。

これらの問題を回避するには、コマンドがSQLコマンド・キャッシュで無効化されるタイミングを制御します。さらに、表と索引の基数が今後大幅に変更されることがわかっている場合には、すべてのコマンドの無効化を延期することも考えられます。

コマンドの無効化は次のように制御できます。

1. SQLコマンド・キャッシュでコマンドを無効化せずに、統計を計算します。ttIsql statsupdateコマンド、ttOptUpdateStats組込みプロシージャまたはttOptEstimateStats組込みプロシージャで、invalidateオプションを0に設定します。

2. すべての統計がttOptCmdCacheInvalidate組込みプロシージャでコンパイルされたら、SQLコマンド・キャッシュ内でコマンドを手動で無効にします。

ttOptCmdCacheInvalidate組込みプロシージャを使用すると、ある表のみに関連付けられたコマンドや、SQLコマンド・キャッシュ内にあるすべてのコマンドを無効化できます。さらに、無効化したコマンドを再コンパイルするか、使用不可としてマークするかを指定できます。

注意:
統計を最適に計算するタイミングの詳細は、「正確な統計または推定統計の計算」を参照してください。また、『Oracle TimesTen In-Memory Databaseリファレンス』のttIsql、ttOptUpdateStats、ttOptEstimateStatsまたはttOptCmdCacheInvalidateに関する説明を参照してください。

ALTER TABLEの回避

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

アプリケーションでALTER TABLE文を使用すると、表に対して列の追加および破棄を実行することができます。ALTER TABLE文自体は、ほとんどの場合、非常に高速に実行できますが、表に行った変更が原因で発生する後続の処理に時間がかかることがあります。アプリケーションで発生する実際のパフォーマンスの低下の程度は、表の変更回数および表に対して実行される処理の種類によって異なります。

VARCHAR2列およびVARBINARY列の破棄は、破棄対象の列内の既存のVARCHAR2値およびVARBINARY値に割り当てられている領域を解放するために、表をスキャンする必要があるため、他のデータ型の列の破棄より時間がかかります。

問合せのネストの回避

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

多くの行の実体化が必要な問合せのネストを回避するため、可能でばれば問合せをリライトすることをお薦めします。

次のネストした問合せの例では、実体化が必要になり、多くの行が作成される場合があります。

- GROUP BYを使用するネストした集合問合せ

- ROWNUMを参照するネストした問合せ

- UNION、INTERSECTまたはMINUSを使用するネストした問合せ

- ORDER BYを使用するネストした問合せ

たとえば、次のネストした集合問合せによって、パフォーマンスに大きく影響します。

select * from (select sum(x1) sum1 from t1 group by y1),
(select sum(x2) sum2 from t2 group by y2) where sum1=sum2;

次に、ROWNUMを参照するネストした問合せの例を示します。

select * from (select rownum rc, x1 from t1 where x1>100),
(select rownum rc, x2 from t2 where x2>100) where x1=x2;

次に、UNIONを使用するネストした問合せの例を示します。

select * from (select x1 from t1 union select x2 from t2),
(select x3 from t3 group by x3) where x1=x3;

副問合せの詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の副問合せに関する説明を参照してください。

文の事前準備

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

同じ文を複数回生成し、その生成のたびに異なる値を検索するアプリケーションが存在する場合は、パラメータ化した文を準備して、コンパイル時間を短縮します。たとえば、アプリケーションで次のような文が生成されるとします。

SELECT A FROM B WHERE C = 10
SELECT A FROM B WHERE C = 15

これらの文は、次の単一の文に置き換えることができます。

SELECT A FROM B WHERE C = ?

TimesTenでは、準備済の文はコミットされると自動的に共有されます。したがって、文の実行を準備するためのアプリケーションによるリクエストは、その文の準備済バージョンがすでにシステムに存在する場合は非常に高速に処理されます。また、同じ文を実行するリクエストを繰り返し行う場合は、その文の事前準備済バージョンを共有することによって、準備でのオーバーヘッドを回避できます。

TimesTenで準備済の文を共有できる場合でも、パフォーマンス上の理由から、パラメータ化した文を使用することをお薦めします。パラメータ化した文を使用すると、文の共有による軽減に加えて、準備でのオーバーヘッドをさらに軽減することができます。

不要な準備処理の回避

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

SQL文の準備は高コストの処理であるため、アプリケーションでは準備APIのコール回数を最小限にする必要があります。ほとんどのアプリケーションでは、接続の開始時に一連の文を準備し、接続中にこれらの文を使用します。この方法は、数百または数千のトランザクションで構成されている長時間の接続に適しています。ただし、接続が比較的短時間の場合でも、すべてのスレッドまたはプロセスのために文を準備して実行する長時間の接続を確立することをお薦めします。この場合、通信でのオーバーヘッドと準備でのオーバーヘッドのバランスを考慮する必要があり、アプリケーションごとに調べることができます。準備済の文は、接続がクローズされると無効になります。

関連情報については、『Oracle TimesTen In-Memory Databaseリファレンス』のttSQLCmdCacheInfoGetに関する説明を参照してください。

表圧縮を使用したデータの効率的な保存

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

TimesTenには、データをより効率的に保存する、列レベルでの表圧縮機能があります。このメカニズムでは、列内に重複する値が冗長的に格納されないようにすることで、表の領域を削減します。

TimesTen表の列を圧縮する場合は、次の点を考慮してください。

- 国または州の名前などの全体にわたって値が繰り返されている場合は、列を圧縮します。

- 複数の列に同時に頻繁にアクセスする場合は、列を圧縮します。

- TT_TINYINTなどの少量の記憶域を必要とするデータ型を含む列は圧縮しません。

- TimesTenはNULL値を圧縮しません。

コラム圧縮の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の表のインメモリー・コラム圧縮に関する説明を参照してください。

圧縮列グループは、表の作成時に追加するか、ALTER TABLE文を使用して後で追加できます。ALTER TABLE文を使用して、圧縮列グループ全体を削除できます。詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のALTER TABLEに関する説明およびCREATE TABLEに関する説明を参照してください。

ttSize組込みプロシージャをコールして、TimesTenが圧縮された表に対して実行した圧縮のレベルを確認できます。ttSize組込みプロシージャの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttSizeに関する説明を参照してください。

同時書込み処理時の読取り最適化の制御

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

TimesTenは読取り問合せおよび書込み問合せを同時に最適に処理します。ttOptSetFlag ('tblLock',1)などのトランザクション・レベル・オプティマイザ・ヒントまたは/*+ tt_tbllock(1) tt_rowlock(0) */などの文レベル・オプティマイザ・ヒントを使用すると、読取り専用同時実行性に対して読取り問合せを最適化できます。読取り最適化問合せと同時に処理する書込み問合せは競合する可能性があります。

ttDbWriteConcurrencyModeSet組込みプロシージャにより、同時書込み処理時に読取り最適化を制御できます。この組込みプロシージャにより、標準モードと拡張書込み同時モードを切り替えることができます。標準モードでは、オプティマイザは読取り最適化のヒントを考慮します。拡張書込み同時モードでは、オプティマイザは読取り最適化のヒントを無視し、共有の読込み表ロックまたは書込み表ロックを使用しません。

注意:
表ロックの詳細は、「ロックの粒度」を参照してください。
文レベル・オプティマイザ・ヒントの詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』の文レベル・オプティマイザ・ヒントに関する説明を参照してください。

トランザクション・レベル・オプティマイザ・ヒントの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttOptSetFlagに関する説明を参照してください。

ttDbWriteConcurrencyModeSet組込みプロシージャのmodeを1に設定して、拡張書込み同時モードを有効にし、読取り最適化を無効にします。modeを0に設定して、拡張書込み同時モードを無効にし、読取り最適化を再有効化します。

modeを1に設定すると、すべてのトランザクションおよび文の表ロック・オプティマイザ・ヒントが無視されます。これは次に影響します。

- SELECT問合せの共有読取り表レベル・ロックおよびオプティマイザ・ヒントでトリガーされる副問合せ。

- オプティマイザ・ヒントでトリガーされるDML文の書込み表ロック。

modeの設定にかかわらず、オプティマイザ・ヒントでトリガーされない表ロックは影響を受けません。

ttDbWriteConcurrencyModeSet組込みプロシージャのwaitを0に設定して、通知せずにモード切替えを実行します。ttDbWriteConcurrencyModeSet組込みプロシージャのwaitを1に設定して、モード切替えが完了するまで組込みプロシージャが待機するように強制します。

特定のSQL文を実行するとttdbWriteConcurrencyModeSet組込みプロシージャのモードが移行中のままになります。このようなSQL文は次の2つの条件に一致します。

- 書込み同時実行モードの影響を受ける場合。

- 異なる書込み同時実行モードでコンパイルされた場合。

ttdbWriteConcurrencyModeSet組込みプロシージャのモードは、このようなSQL文がすべて完了するまで移行中のままになります。ttDbWriteConcurrencyModeSet組込みプロシージャは、モード移行時にロック取得を使用して待機します。ttDbWriteConcurrencyModeSet組込みプロシージャが現在の接続のタイムアウト時間内にロックを許可されない場合、エラーが返されます。

注意:
ttDbWriteConcurrencyModeSet、ttLockWait、ttDbWriteConcurrencyModeGet組込みプロシージャの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttDbWriteConcurrencyModeSet、ttLockWait、およびttDbWriteConcurrencyModeGetに関する説明を参照してください。

マテリアライズド・ビューのチューニング

次の項では、マテリアライズド・ビューのパフォーマンスの向上に関するヒントを示します。

- 結合行の数の制限

- 結合列に対する索引の使用

- 不要な更新の回避

- 外部結合の内部表への変更の回避

- ビュー表の列数の制限

結合行の数の制限

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

結合行の数が多くなると、パフォーマンスが低下します。結合条件を制御することで、結合行の数および結合される表の数を制限できます。たとえば、ある表の1行を他の表の1行または最大数行にマップする一致条件のみを使用します。

結合列に対する索引の使用

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

結合を作成するSELECT文に指定されているディテール表の列に対して索引を作成します。また、マテリアライズド・ビュー自体に対して索引を作成することも検討します。これによって、マテリアライズド・ビューを継続して更新する場合のパフォーマンスを向上させることができます。

ディテール表でのUPDATEまたはDELETE処理が列に対する条件に基づくことが多い場合、可能であれば、その列でマテリアライズド・ビューの索引の作成を試行します。

たとえば、CustOrderは、2つの表に基づいた顧客注文のマテリアライズド・ビューです。2つの表とは、CustomerおよびbookOrderです。前者には2つの列(custNoおよびcustName)、後者には3つの列(ordNo、bookおよびcustNo)があるとします。特定の注文を変更するために、条件bookOrder.ordNo=constを使用してbookOrder表を更新することが多い場合は、CustOrder.ordNoに対して索引を作成します。また、条件bookOrder.custNo=constに基づいて更新を行うことが多い場合は、CustOrder.custNoに対して索引を作成します。

両方の条件を使用して更新することが多く、両方の索引を作成する十分な領域がない場合は、ビューにbookOrder.rowIdを追加し、これに対して索引を作成します。この場合、TimesTenは、ビュー内のすべての行を直接同時に更新するのではなく、ディテール行の更新ごとにビューを更新します。更新する行を検索するスキャンは行スキャンではなく索引スキャンであるため、結合行を生成する必要はありません。

実行計画でViewUniqueMatchScanが使用されている場合、実行速度が遅くなったり、実行に必要以上の領域が必要になる場合があります。ViewUniqueMatchScanは、マテリアライズド・ビューの直接更新または直接削除に変換できない更新または処理に使用され、結合行とマテリアライズド・ビュー内の関連行間に一意のマッピングは存在しません。これは、更新または削除される各ディテール表に対して一意キーを選択すると修正できます。

不要な更新の回避

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

結合列またはGROUP BY列の更新には古い値の削除および新しい値の挿入を実行する必要があるため、結合列の更新は行わないようにしてください。

複数の表を参照する式の更新は行わないようにしてください。この式の中のある値が更新されると、新しい値を取得する別の結合処理がTimesTenによって実行される可能性があるため、ビューを直接更新できなくなる場合があります。

次のいずれかの場合、更新または削除に基づくビュー・メンテナンスにより多くのコストがかかります。

- ビューを直接更新できない場合。たとえば、ディテール表のUPDATEまたはDELETE文に指定されているすべての列がビューで選択されているわけではありません。

- ビューの行から結合行への1対1マッピングの指示がない場合。

次に例を示します。

CREATE MATERIALIZED VIEW v1 AS SELECT x1 FROM t1, t2 WHERE x1=x2;
DELETE FROM t1 WHERE y1=1;

結合行によって1つのビュー行のみが影響を受けるようにするために追加の処理が必要であるため、追加のコストがかかります。

この問題は、x1がUNIQUEであるか、またはt1の一意キーがビューの選択リストに含まれている場合は解決されます。ROWIDは、常に一意キーとして使用できます。

外部結合の内部表への変更の回避

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

内部表に対して変更を行うと、外部結合のメンテナンスにより多くのコストがかかるため、外部結合の内部表への変更は行わないようにしてください。可能な場合は、内部表でINSERT処理を実行してから、関連する結合行を外部表に挿入します。同様に、可能な場合は、外部表でDELETE処理を実行してから、内部表での削除を実行してください。これによって、一致しない行を一致する行に変換したり、その逆の処理を行う必要がなくなります。

ビュー表の列数の制限

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

ビューSelectListに投影される列の数はパフォーマンスに影響する可能性があります。SelectList内の列の数が増えると、ディテール表に対する処理の準備時間が長くなります。また、ビューのディテール表に対する処理の実行時間も長くなります。必要のない値または式は選択しないでください。

ビューのディテール表に対する処理を準備する際に、オプティマイザは一時索引の使用を検討します。これは、処理およびビューによっては、準備時間を大幅に長くする可能性があります。準備時間が長い場合は、ttOptSetFlagを使用して、一時範囲索引および一時ハッシュ・スキャンを無効にすることを検討してください。

トランザクションのチューニング

次の項では、トランザクション使用時のパフォーマンスを向上させる方法について説明します。

- トランザクション・サイズの適切な設定

- 永続コミットの適切な使用

- 頻繁なチェックポイント処理の回避

- 自動コミット・モードの無効化

- トランザクション・ロールバックの回避

- 大量のDELETE文の回避

- コミット・バッファのキャッシュ・サイズの増加

トランザクション・サイズの適切な設定

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

トランザクション・ログ・レコードを生成する各トランザクション(INSERT、DELETEまたはUPDATEを実行するトランザクションなど)では、コミット時にディスクへの書込みが行われます。ディスクI/Oは、レスポンス時間に影響を及ぼし、グループ・コミットの有効性によっては、スループットに影響を及ぼす可能性があります。

パフォーマンスを重視するアプリケーションの場合は、コミット時に不要なディスクへの書込みが行われないようにする必要があります。パフォーマンス分析ツールを使用して、アプリケーションでディスクへの書込みにかかる時間を(CPU時間と比較して)測定します。I/Oが過剰であると思われる場合は、次の2つの手順を実行してコミット時に書込みが行われないようにできます。

- トランザクション・サイズを調整します。

- トランザクションのコミット時にディスクへの書込みを実行するかどうかを調整します。詳細は、「永続コミットの適切な使用」を参照してください。

長時間のトランザクションでは、短時間のトランザクションと比較して単位時間当たりのディスクへの書込み回数が少なくなります。ただし、長時間のトランザクションによって、同時実行性が低くなる可能性もあります(第7章「トランザクション管理」を参照)。

- データベースでアクティブな接続が1つのみの場合、長時間のトランザクションによってパフォーマンスが向上する可能性があります。ただし、長時間のトランザクションには、ロールバックが長時間になるなどのデメリットがあります。

- 複数の接続が存在する場合は、トランザクション・ログのI/Oによる遅延とロックによる遅延のバランスを考慮する必要があります。この場合、トランザクションは、その原子性および永続性に関する要件によって決定される自然な長さのままにすることをお薦めします。

永続コミットの適切な使用

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

デフォルトでは、TimesTenのトランザクションをコミットするたびに、ディスクへの書込みが発生します。これによって、システムまたはアプリケーションで障害が発生した場合でも、コミット済のトランザクションは失われなくなります。アプリケーションで非永続コミットを実行すると、これらのディスクへの書込みの一部またはすべてが行われないようにすることができます。非永続コミットでは、トランザクション・ログをディスクに書き込むことを除き、永続コミットで実行されるすべての処理が実行されます。ロックは解除され、カーソルはクローズされますが、ディスクへの書込みは実行されません。

注意:
一部のドライバは、キャッシュ・メモリーへのデータの書込みも、ディスクへの書込みも、オペレーティング・システムが書込み完了通知を受け取って一定時間が経過してから行います。この場合、停電が発生すると、永続コミットしたと思われていた一部の情報が失われる可能性があります。このようなデータの損失を回避するには、完了通知の前に記録メディアに書き込むようにディスクを構成するか、または無停電電源装置を使用します。

非永続コミットのメリットは、レスポンス時間を減らし、スループットを向上させることができることです。デメリットは、システムで障害が発生した場合に、一部のトランザクションが失われる可能性があることです。アプリケーションでは、定期的に永続コミットまたはチェックポイントを実行してディスクへのトランザクション・ログの書込みを強制実行することによって、失われる可能性があるデータの量を減らすことができます。また、TimesTen自体でも、内部バッファが一杯になった場合にログをディスクに定期的にフラッシュしているため、失われる可能性があるデータの量が制限されます。

トランザクションは、接続ごとに永続的にするか、または永続性遅延モードにすることができます。アプリケーションでttDurableCommitプロシージャをコールして、特定のトランザクションの永続コミットを強制実行できます。

非永続コミットを使用しないアプリケーションでは、書込みおよびフラッシュのかわりに同期書込みを使用することをお薦めします。同期書込みを有効にするには、初期接続属性LogFlushMethod=2を設定します。

SYS.SYSTEMSTATS表のtxn.commits.durable列は、永続コミットを実行したトランザクションの数を示します。

頻繁なチェックポイント処理の回避

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

データベースに長時間接続されているアプリケーションでは、ディスクがログ・ファイルで一杯にならないように、ttCkpt組込みプロシージャを定期的にコールしてデータベースに対してチェックポイント処理を実行する必要があります。トランザクション一貫性チェックポイントは、データベースへの排他アクセスが必要であるため、パフォーマンスに大きな影響を与える可能性があります。

通常、ttCkptをコールして非ブロッキング(ファジー)・チェックポイントを実行する方が、ttCkptBlockingをコールしてブロッキング・チェックポイントを実行するより効率的です。非ブロッキング・チェックポイントの方が時間がかかる可能性がありますが、他のトランザクションでデータベースに対して同時に処理を実行できるため、全体的なオーバーヘッドを抑えることができます。トランザクション・ログ・ファイルの蓄積に使用するディスク領域の量を増やすことによって、連続するチェックポイント間の時間隔を長くできます。

トランザクション・ログのサイズが大きくなると(チェックポイント間の間隔が長い場合)、リカバリ時間もそれに応じて長くなります。システム・クラッシュまたはアプリケーション障害の後のリカバリ時間を短くする必要がある場合は、チェックポイント処理を頻繁に実行することをお薦めします。SYS.SYSTEMSTATS表のckpt.completed列は、チェックポイント処理が正常に実行された回数を示します。

自動コミット・モードの無効化

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

AUTOCOMMITモードはデフォルトで有効になっており、文ごとにコミットが実行されます。ただし、文を実行するたびにコミットを実行すると、パフォーマンスが大幅に低下する可能性があります。このため、通常は、プログラム環境に適したAPIを使用して、AUTOCOMMITを無効にすることをお薦めします。

SYS.SYSTEMSTATS表のtxn.commits.count列は、トランザクションのコミット数を示します。

注意:
アプリケーションで明示的なコミットを指定しなかった場合、メモリー、ロックなどの重要なリソースを不必要に使い果たしてしまう可能性があります。すべてのアプリケーションで、定期的なコミットを実行する必要があります。

トランザクション・ロールバックの回避

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

誤ったデータまたはアプリケーション障害のためトランザクションに問題が発生した場合、トランザクションはTimesTenによって自動的にロールバックされます。また、アプリケーションでは、多くの場合、トランザクションのロールバックが明示的に実行され、デッドロックまたはタイムアウトの状態からリカバリされます。これは、パフォーマンスの観点から見ると、ロールバックはリソースを浪費し、トランザクション全体が無駄になってしまうため望ましくありません。

アプリケーションでは、不要なロールバックが行われないようにする必要があります。つまり、可能なかぎり、競合が発生しないようにアプリケーションを設計し、アプリケーションまたは入力データを事前にチェックしてエラーを検出する必要があります。SYS.SYSTEMSTATS表のtxn.rollbacks列は、ロールバックされたトランザクションの数を示します。

大量のDELETE文の回避

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

大量のDELETE文を回避するために次のような方法を考慮します。

- DELETE FROM文の回避

- TRUNCATE TABLE文の優先

- DELETE FIRST句の使用の考慮

DELETE FROM文の回避

1つのSQL文で表から(100,000以上)大量の行を削除しようとすると、処理に時間がかかる場合があります。TimesTenでは、処理でロールバックが必要な場合に備えて削除された各行を記録しますが、これはディスクにバインドされた操作のため、これらのログ・レコードの書込みには非常に時間がかかります。

このような大量のDELETE処理のもう1つの問題は、書込み集中型の削除トランザクションの発生中は他のデータベース操作が遅くなることです。1つのトランザクションで何百万行も削除するには、完了するまでに数分かかります。

何百万もの行を一度に削除することによる別の問題は、この表がレプリケートされるときに発生します。レプリケーションではコミット済のトランザクションのみが転送されるため、単一の、数百MB (またはGB)からなるトランザクションを転送することでレプリケーション・エージェントが遅くなります。TimesTenのレプリケーションは、多数の小規模なトランザクション用に最適化されているため、何百万もの行が1つのトランザクションで削除されるとパフォーマンスが低下します。

DELETE SQL文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のDELETEに関する説明を参照してください。

TRUNCATE TABLE文の優先

表からすべての行を削除するかわりに、TRUNCATE TABLE SQL文の使用を検討します。このSQL文には、WHERE句を指定しないDELETE (ロギングを大幅に減少)と同じ効果があります。さらに、レプリケーションを使用する際に、TRUNCATE操作は、削除される各行に対して1つの操作ではなく単一の操作して、別のデータベースにレプリケートされます。

TRUNCATE TABLE SQL文の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のTRUNCATE TABLEに関する説明を参照してください。

DELETE FIRST句の使用の考慮

大量の行を削除する必要があり、TRUNCATE TABLEが適切でない場合は、DELETE FIRST NumRows句を使用して表から行をバッチで削除することを検討します。DELETE FIRST NumRows構文では、「DELETE FROM TableName WHERE ...」を一連の「DELETE FIRST 10000 FROM TableName WHERE ...」操作に変更できます。

大量のDELETE操作をより小さい操作のバッチに分割することで、行ははるかに高速に削除され、システムおよびレプリケーション全体の同時実行性は影響を受けません。

DELETE FIRST句の詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス』のDELETEに関する説明を参照してください。

コミット・バッファのキャッシュ・サイズの増加

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

トランザクションのコミットの再要求段階の間に、TimesTenのリソース・クリーンアップが発生します。再利用要求の間、TimesTenはトランザクションの開始時点からのすべてのトランザクション・ログ記録を再調査し、実行する必要がある再利用要求操作を決定します。

大きなトランザクション・コミットの再利用要求段階では大量の処理が必要になり、リソースを大量に消費します。ただし、コミット・バッファの最大サイズを増やすことでパフォーマンスを向上させることができます。コミット・バッファとは、再利用要求操作で使用されるトランザクション・ログ記録のキャッシュです。

TimesTenのCommitBufferSizeMax接続属性を使用して、コミット・バッファの最大サイズをMB単位で指定できます。この設定のスコープは、現在のセッションです。

詳細は、「コミット・バッファの再利用操作用の構成」を参照してください。

リカバリのチューニング

次の項では、データベースのシャットダウン後またはシステム障害の発生後に、データベース・リカバリのパフォーマンスを向上させるためのヒントを示します。

- RecoveryThreadsの設定

- CkptReadThreadsの設定

RecoveryThreadsの設定

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

RecoveryThreads属性を索引またはCPUの数に設定し、リカバリ・パフォーマンスを向上させます。

CkptReadThreadsの設定

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

データベースに大量のチェックポイント・ファイル(数GB単位)がある場合、初期接続またはリカバリ操作が十分に機能せず、極端な場合には完了までに数時間もかかることがあります。大量のチェックポイント・ファイルがある場合にリカバリのパフォーマンスを改善するには、CkptReadThreads接続属性を使用して、データベースをメモリーにロードする際にチェックポイント・ファイルの読込みに使用される同時スレッドの数を増やします。

CkptReadThreads接続属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のCkptReadThreadsに関する説明を参照してください。

複数CPUのスケーリング

次の項では、複数CPUのパフォーマンスの向上に関するヒントを示します。

- プロトタイプとしてのデモ・アプリケーションの実行

- CPU当たりのデータベース集中型の接続の数の制限

- 読取り処理の使用(使用可能な場合)

- 準備、再準備および接続の制限

- リカバリ時の索引再構築のパラレル実行

- プライベート・コマンドの使用

プロトタイプとしてのデモ・アプリケーションの実行

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

TimesTenで実行される概算スケーリングを確認する方法の1つとして、使用しているシステムでいずれかのスケーラブル・デモ・アプリケーション(tptbmなど)を実行する方法があります。

tptbmアプリケーションには、マルチユーザーのスループット・ベンチマークが実装されています。これでは、TimesTen処理およびSELECT、UPDATE、INSERTなどを組み合せたトランザクションを実行するプロセス数を変更するオプションを含め、その実行方法を制御できます。tptbm -helpを実行すると、オプションの完全なリストが表示されます。

デフォルトでは、このデモは、トランザクションごとに1つの処理を実行します。トランザクションごとの処理数を増やして、実際のアプリケーションに近づけることができます。トランザクションが大きくなると、アプリケーションのプロファイルによって、スケーラビリティが向上する場合と低下する場合があります。

このデモのマルチプロセッサ・バージョンを実行すると、複数CPUシステムでのアプリケーションのパフォーマンスを予測して評価できます。デモでのスケーラビリティが高く、アプリケーションでのスケーラビリティが低い場合は、アプリケーションを簡略化して問題の箇所を確認します。TimesTenのコールをコメント・アウトしても、アプリケーションに問題があるためスケーリングが不十分なままになる場合があります。

また、たとえば、シミュレートされたアプリケーション・データの一部が正しく生成されていないため、数行の同じ行がすべての処理でアクセスされていることが発見される場合があります。アクセスでデータが変更される場合、そのタイプのローカライズされたアクセスは、スケーラビリティを大幅に阻害することになります。

tptbmおよびその他のデモ・アプリケーションの詳細は、クイック・スタートのホームページ(install_dir/quickstart.html)を参照してください。「Sample Programs」の下のODBCリンクに移動してください。

CPU当たりのデータベース集中型の接続の数の制限

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

SYS.SYSTEMSTATS表のlock.timeoutsフィールドまたはlock.locks_granted.waitフィールドを確認します。これらの値が大きい場合は、過度の競合が発生している可能性を示し、スケーリングが不十分になることがあります。

TimesTenはCPU集中型であるため、CPU当たりのデータベース集中型の接続の数を1つのみにすることで、最適なスケーリングが実現されます。4CPUシステムまたはハイパースレッド機能を持つ2CPUシステムを使用する場合、4プロセッサ・アプリケーションのパフォーマンスは良好ですが、8プロセッサ・アプリケーションのパフォーマンスは低くなります。アクティブなスレッド間での競合が多くなりすぎます。ただし、多くのトランザクションが永続的にコミットされる場合、このルールは適用されません。この場合、ディスクへのI/O操作が増加するために接続が極度にCPU集中型にはならず、システムでより多くの同時接続をサポートできるようになります。

読取り処理の使用(使用可能な場合)

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

読取り処理のスケーラビリティは、書込み処理より優れています。読取りと書込みのバランスが、アプリケーションの実際のワークロードを反映していることを確認してください。

準備、再準備および接続の制限

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

準備にはスケーラビリティがありません。複数回実行されるコマンドは事前に準備するようにしてください。SYS.SYSTEMSTATS表のstmt.prepares.count列およびstmt.reprepares.count列に、コマンドが準備された回数、または(索引の作成および削除が原因で)コマンドが自動的に再準備された回数が示されます。いずれかの値が大きい場合は、接続プーリングを実行するようにアプリケーションを変更して、接続の確立および切断がほとんど発生しないようにします。

接続にはスケーラビリティがありません。複数回実行されるコマンドは事前に準備するようにしてください。SYS.SYSTEMSTATS表のconnections.established.count列を参照してください。このフィールドの値が大きい場合は、接続プーリングを実行するようにアプリケーションを変更して、接続の確立および切断がほとんど発生しないようにします。

リカバリ時の索引再構築のパラレル実行

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

マルチプロセッサ・システムでは、RecoveryThreadsを最小値(使用可能なCPUの数、索引の数)に設定すると、リカバリが必要な場合に、索引をパラレルで再構築できるようになります。再構築が必要な場合、進行状況はユーザー・ログで確認できます。RecoveryThreadsを使用可能なCPUの数より大きい値に設定すると、リカバリに必要な時間が、シングルスレッドの場合より長くなります。

プライベート・コマンドの使用

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

マルチプロセッサ・システムでは、複数のスレッドで同じコマンドを実行する場合、スループットまたはレスポンス時間を向上させるためにPrivateCommands=1を設定します。プライベート・コマンドを使用すると、使用される一時領域の量が増加します。

XLAのチューニング

次の項では、XLAのパフォーマンスの向上に関するヒントを示します。

- XLA使用時のトランザクション・ログ・バッファのサイズの増加

- 複数の更新レコードのプリフェッチ

- XLA更新の確認

XLA使用時のトランザクション・ログ・バッファのサイズの増加

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

XLAを使用する場合は、トランザクション・ログ・バッファのサイズを大きくすることをお薦めします。XLAが有効になっている場合は、XLAに関する追加情報を格納するために追加のトランザクション・ログ・レコードが生成されます。トランザクション・ログ・バッファのサイズが適切かどうかを確認するには、SYS.MONITOR表のエントリLOG_FS_READSおよびLOG_BUFFER_WAITSの変更に注意します。パフォーマンスを最適にするには、この2つの値が0のままである必要があります。これらの値を0のままにするには、トランザクション・ログ・バッファのサイズの増加が必要な場合があります。

複数の更新レコードのプリフェッチ

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

複数の更新レコードを一度にプリフェッチする処理は、XLAから各更新レコードを個々に取得する処理より効率的です。AUTO_ACKNOWLEDGEモードを使用すると、更新がプリフェッチされないため、他のモードよりも時間がかかります。可能な場合は、更新を重複して行うことができるようにアプリケーションを設計すると、DUPS_OK_ACKNOWLEDGEの使用、または更新の明示的な確認が可能になります。各メッセージを個々に確認しないことがアプリケーションで許容される場合は、明示的に更新を確認すると、最も高いパフォーマンスを得ることができます。

XLA更新の確認

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

XLA更新を明示的に確認するには、更新メッセージに対してacknowledgeをコールします。メッセージを暗黙的に確認すると、以前のすべてのメッセージが確認されます。通常は、確認と確認の間に、複数の更新メッセージを受信および処理します。CLIENT_ACKNOWLEDGEモードを使用していて、永続サブスクリプションを将来再利用する場合は、終了する前に、acknowledgeをコールして最後に読み取られた位置にブックマークを再設定する必要があります。

キャッシュとレプリケーションのチューニング

レプリケーション操作時のパフォーマンス向上に関する推奨事項の詳細は、『Oracle TimesTen In-Memory Database開発者および管理者ガイド』のレプリケーションのパフォーマンス向上に関する説明を参照してください。

キャッシュ・グループ使用時のパフォーマンス向上に関する推奨事項の詳細は、『Oracle TimesTen Application-Tier Database Cacheユーザーズ・ガイド』の「キャッシュ・パフォーマンス」を参照してください。

用語集

.odbc.iniファイル

「ODBC初期化ファイル(ODBC initialization file: ODBC INI)」を参照してください。

ACIDトランザクション・セマンティクス

トランザクションの4つの基本的特性(原子性=atomicity、一貫性=consistency、独立性=isolation、永続性=durability)を表す英語の頭文字。

原子性

データベースにトランザクションのすべての処理を適用するか、すべての処理を適用しないかを決定するトランザクションの特性。

バックアップ・インスタンス

特定のバックアップ・パスに存在する、特定のデータベースのバックアップ情報が含まれている一連のファイル。「バックアップ・パス」、「全体バックアップ」および「増分バックアップ」も参照してください。

バックアップ・パス

ディレクトリ名およびオプションのベース名で指定する、データベースの位置。

バックアップ・ポイント

バックアップを開始する時点。「バックアップ・パス」、「全体バックアップ」および「増分バックアップ」も参照してください。

ビットマップ索引

索引は表に対する問合せの高速化に使用されます。ビットマップ索引は、カーディナリティの低い列のデータを検索および取得する場合に有効です。つまり、これらの列は、使用可能な数個の一意の値のみを持つことができます。

キャッシュ・グループ

外部キーで関連付けられている一連のキャッシュされた表。

キャッシュ・インスタンス

外部キーで関連付けられている一連の行。各キャッシュ・インスタンスには、キャッシュ・グループのルート表の行が1行のみ、またはキャッシュ・グループの他の表の行が0(ゼロ)行以上含まれます。

クライアント/サーバー

アプリケーションの処理を、クライアントなどエンド・ユーザーのシステムで実行されるコンポーネントと、ネットワーク・サーバー間で分担するアプリケーション設計および開発の1つの手法。通常、クライアント・コンポーネントにはユーザー・インタフェース要素が実装され、サーバーではデータベースに対するアクセスが制御されます。

クライアント・データソース名

「データソース名, クライアント」を参照してください。

同時実行性

複数のトランザクションでデータ・ストアにアクセスし、そのデータベースを同時に処理する機能。

接続

アプリケーションと特定のODBCデータソース間のデータ・パス。

接続属性

ODBCデータソースへの接続時に使用される接続パラメータを定義する文字列。接続属性は、name=valueの形式(nameはパラメータ名、valueはパラメータの値を表します)で指定します。「接続文字列」も参照してください。

接続リクエスト

ODBCデータソースへの接続をリクエストするためにODBCドライバを使用してアプリケーションからODBCデータソースに送信されるメッセージ。

接続文字列

ODBCデータソースへの接続時に使用される接続パラメータを定義する文字列。接続文字列は、1つ以上の接続属性をセミコロンで区切って指定します。

一貫性

トランザクションの特性。この特性によって、各トランザクション間で一貫性を保持したままデータベースが変換されます。

カーソル

アプリケーションで、SQL問合せの結果を繰り返し実行するために使用される制御構造。

データソース定義

ODBCデータソースの接続時に使用される接続パラメータを定義する接続属性の名前付きコレクション。「データソース名」も参照してください。

データソース名

エンド・ユーザーまたはアプリケーションがODBCデータソース定義を参照する場合に使用する論理名。「データソース定義」の意味に誤用される場合があります。「データソース定義」および「odbc.iniファイル」も参照してください。

データソース名, クライアント

サーバー・システム上のサーバーDSNを参照するTimesTen Clientマシンに定義されたデータソース名。

データソース名, サーバー

サーバー・システムに定義されたシステム・データソース名(システムDSN)。TimesTen Serverの稼働中は、ネットワーク上のすべてのTimesTen Clientでサーバー・データソース名を使用できます。

データソース名, システム

特定システムのすべてのユーザーがアクセスできるデータソース名。

データソース名, ユーザー

データソース名を作成したユーザーのみがアクセスできるデータソース名。

ドライバ

「ODBCドライバ」を参照してください。

DSN

「データソース名」を参照してください。

DSN, クライアント

「データソース名, クライアント」を参照してください。

DSN, サーバー

「データソース名, サーバー」を参照してください。

DSN, システム

「データソース名, システム」を参照してください。

DSN, ユーザー

「データソース名, ユーザー」を参照してください。

永続性

トランザクションの特性。この特性によって、システムに障害が発生した場合でも、コミット済のトランザクションの結果が保持されます。

環境変数

アプリケーションに構成パラメータを渡すために使用できる名前/値ペア。オペレーティング・システムで保持されます。

イベント

アプリケーション、サービスまたはオペレーティング・システムでのロギング・メカニズムで追跡できるアクティビティまたは状態変化。「ロギング」、「プロトコル・メッセージ・ロギング」および「イベント・ビューア」も参照してください。

イベント・ビューア

Windowsで、オペレーティング・システムのイベント・ログの内容を表示するために使用するユーティリティ・プログラム。

全体バックアップ

データベースの完全なコピーを作成するデータベースのバックアップ・プロシージャ。通常、データベースの最初のバックアップは、全体バックアップである必要があります。「増分バックアップ」も参照してください。

ハッシュ索引

索引は表に対する問合せの高速化に使用されます。ハッシュ索引は、1つ以上の列で完全一致する行を検索する場合に有効です。

ホスト

コンピュータの一種。通常、ネットワーク上の他のコンピュータにサービスを提供するネットワーク上のコンピュータを指します。

ホスト名

ネットワーク上の特定のコンピュータを一意に識別する文字列名。たとえば、athena、thames.mycompany.comなどです。「ホスト」も参照してください。

インライン列

値が、行のその他の列値とともに物理的に格納されている列。

増分バックアップ

最後の全体バックアップまたは増分バックアップ以降に作成されたすべてのトランザクション・ログ・レコードが既存のバックアップに追加されるデータベース・バックアップ・プロシージャ。「バックアップ・インスタンス」および「全体バックアップ」も参照してください。

初期化ファイル

「odbc.iniファイル」を参照してください。

IPアドレス

ネットワーク上のコンピュータを一意に識別する数値アドレスで、ドットで区切られた4つの数字で構成されます。インターネット・プロトコル・アドレスの略称。たとえば、123.61.129.91。

IPC

プロセス間通信。

独立性

トランザクションの特性。この特性によって、システムにトランザクションが1つのみ存在する場合と同様に各トランザクションが実行されます。

リスナー・スレッド

TimesTenサーバーで稼働しているスレッド。TimesTen Clientからの接続リクエストを受信および処理します。

ロギング

アプリケーション、サービスまたはオペレーティング・システムで、処理中に発生した特定のイベントを記録するプロセス。

マルチスレッド

1つのプロセスで複数のスレッドを制御するプログラミング・パラダイム。

ネットワーク・アドレス

ネットワーク上の特定のコンピュータを一意に識別するホスト名およびIPアドレス。たとえば、123.61.129.91、athena、thams.mycompany.comなどです。

ODBC

「Open Database Connectivity(ODBC)」を参照してください。

ODBC管理者

Windowsでデータソース定義を作成、設定および削除するためのユーティリティ・プログラム。

ODBCデータソース

「データソース名」(DSN)を参照してください。

ODBCデータソース名

「データソース名」(DSN)を参照してください。

ODBCドライバ

ODBC APIで定義されたファンクション・コールを実装し、アプリケーションによるODBCデータソースとの対話を可能にするライブラリ。

ODBCドライバ・マネージャ

ODBCアプリケーションと1つ以上のODBCドライバ間の媒介として動作するライブラリ。

ODBC初期化ファイル(ODBC INI)

odbc.iniファイルには、データソースと各データソースのプロパティのリストが含まれます。各データソース名に対してドライバのプロパティが定義されている必要があります。これにより、接続コールが実行されたときにドライバがロードされます。

Open Database Connectivity (ODBC)

アプリケーションで異機種間のリレーショナル・データベースおよび非リレーショナル・データベースに保存したデータへのアクセスを可能にする、データベースに依存しないアプリケーション・プログラミング・インタフェース。X/OpenのSQL Access Groupが開発したCall-Level Interface(CLI)仕様に基づいており、Microsoft社のWindows Platformによって初めて一般化されました。

Open Database Connectivity(ODBC)はデータベース・アクセス・プロトコルであり、これにより、データベースに接続し、そのデータベースに対してSQL文を準備して実行できます。ODBCドライバと組み合せて使用することで、Excelなどのスプレッドシートに保存されたデータなど、任意のデータソースにアプリケーションからアクセスできます。ODBCは広く使用されている標準APIであるため、ODBC標準に準拠するようにアプリケーションを記述できます。ODBCドライバは、ODBC標準とアプリケーションがアクセスする特定のデータベースとの間のマッピングをすべて実行します。データソース固有のドライバを使用することで、ODBCに準拠したプログラムは追加の開発作業なしで任意のデータソースにアクセスできます。

TimesTenには、ODBC準拠の任意のタイプのアプリケーションが、TimesTenに付属のODBCドライバを使用してTimesTenにアクセスできるように、ODBCインタフェースが備えられています。

アウトライン列

値が、行のその他の列値とは別に物理的に格納されている列。

ファントム行

同じトランザクション内で、特定の読取りでは存在し、別の読取りでは存在しない行のこと。これは、同時に実行されている他のトランザクションの処理が原因で発生します。

ping

一方のコンピュータからメッセージを送信し、他方のコンピュータでメッセージが受信されたことが確認されるまでの時間を測定して、ネットワーク上の2台のコンピュータ間の接続をテストするユーティリティ。通常、ネットワーク・ソフトウェアに付属されています。

ポート番号

「TCP/IPポート番号」を参照してください。

プロシージャ

「ストアド・プロシージャ」を参照してください。

プロセス

実行中のプログラムのインスタンス。

伝播

TimesTen Cacheを使用して、TimesTen CacheからOracle Databaseに表または行の変更を送信すること。「レプリケート」と対比してください。

プロトコル・メッセージ・ロギング

TimesTen Serverが、TimesTenネットワーク・プロトコルで受信した各メッセージを記録するために使用するプロセス。

範囲索引

索引は表に対する問合せの高速化に使用されます。範囲索引はB+ツリー索引と同様の機能を提供し、特定の範囲内の列値を持つ行を取得する場合に最適です。

レプリケート

表または行の変更をデータベース間で送信すること。「伝播」と対比してください。

結果セット

SQL問合せの結果を表す0(ゼロ)行以上のデータのコレクション。

ロールバック

トランザクションの処理を取り消すこと。これによって、トランザクションで変更されたすべての項目が元の状態に戻されます。

行バッファリング

TimesTen Clientで使用されるパフォーマンス強化機能。これによって、クライアントは、TimesTen Serverからの各メッセージでSQL問合せの複数の結果行を受信して、ネットワーク通信を軽減できます。

RPC

リモート・プロシージャ・コール。

スケーラビリティ

パフォーマンスを大幅に低下させずに、システム・リソースに対して増大している要求にシステムまたはアプリケーションで対応できる程度。

スキーマ

スキーマは、ユーザーの作成時にそのユーザーに対して自動的に作成されます。スキーマは特定のユーザーのネームスペースであり、このユーザーが所有するすべてのオブジェクトはこのスキーマに属し、すべてのオブジェクトはスキーマ修飾名で識別されます。たとえば、ユーザーPATはPATスキーマに属します。また、PATが所有するオブジェクトEMPLOYEESはPAT.EMPLOYEESとして識別されます。

ユーザーがスキーマ名なしでオブジェクトを参照すると、TimesTenはその名前をそのユーザーのスキーマで解決しようとします。オブジェクトが存在しない場合、TimesTenは名前をSYS.EMPLOYEESに解決しようとします。

ユーザーは、通常、自分のスキーマのすべてのオブジェクトに対するすべての権限を持ちます。これらの権限を取り消すことはできません。

サーバー・データソース名

「データソース名, サーバー」を参照してください。

サーバーDSN

「データソース名, サーバー」を参照してください。

システムDSN

「データソース名, システム」を参照してください。

短縮名

特定のTimesTen Serverを参照するために使用する論理名。エンド・ユーザーは、短縮名を使用すると、ホスト名およびポート番号を入力せずにTimesTen Serverに接続できます。

SMP

対称型マルチプロセッシング。2つ以上の類似したプロセッサ(各プロセッサはI/Oデバイスに等しくアクセスできる)が高帯域幅のリンクを介して接続され、1つのオペレーティング・システムで制御されるハードウェア構成。

SNMP

Simple Network Management Protocol。ネットワークでノードを管理するために使用されます。

SQL

Structured Query Language。

スタックのオーバーフロー状態

エラー状態の一種。スレッドまたはプロセスのスタック使用量が、スタックに割り当てられた領域の量を超えています。

ストアド・プロシージャ

入力パラメータおよび出力パラメータで起動したり、SQL問合せで返される結果と同様の結果を返すことができる、データベースに格納されている実行可能オブジェクトまたは名前付きエンティティ。

システム・アカウント

Windows環境で、オペレーティング・システムおよび特定のオペレーティング・システム・サービスで使用される特別なアカウント。TimesTenサービスおよびTimesTen Serverは、このシステム・アカウントによって実行されます。

システムDSN

「データソース名, システム」を参照してください。

TCP/IP

インターネット上のコンピュータで使用される通信プロトコル。Transport Control Protocol/Internet Protocolの略称です。

TCP/IPポート番号

複数の同時接続がサポートされているホストへの接続のエンド・ポイントを識別するためにTCP/IPで使用される番号。

telnet

ユーティリティ・プログラムおよびプロトコルの一種。これを使用すると、特定のコンピュータのユーザーが仮想端末をオープンし、リモート・ホストにログインして、このホストの端末ユーザーとして通信できるようになります。

スレッド

プロセス内でプログラム・コードを実行する独立した順序。「プロセス」も参照してください。

スレッドセーフODBCドライバ

マルチスレッド・サーバーおよびクライアントをサポートするODBCドライバ。TimesTen Data ManagerドライバおよびTimesTen Clientドライバはスレッドセーフです。

タイムアウト・エラー

リクエストされた処理が、指定時間内に完了しなかったことを示すエラー状態。「タイムアウト時間」も参照してください。

タイムアウト時間

処理の完了にかかる最大時間を指定する構成パラメータ。「タイムアウト・エラー」も参照してください。

TimesTen Client

(1)エンド・ユーザーがTimesTen Serverを使用してデータソースにアクセスできるようにするODBCドライバ。(2)TimesTen Clientソフトウェアをインストールしたコンピュータ。エンド・ユーザーまたはアプリケーションは、TimesTen Clientドライバを使用すると、使用可能なTimesTenサーバーで管理されているデータソースにアクセスできます。

TimesTen Client/Serverネットワーク・プロトコル

標準のTCP/IPネットワーク接続上でのデータの交換のためにTimesTen ClientおよびTimesTen Serverで使用されるプロトコル。

TimesTen Data Server

(1)ネットワーク上のTimesTen ClientでTimesTenデータソースを使用できるようにするアプリケーション・プログラム。(2)TimesTen Data Serverソフトウェアが実行されているコンピュータ。

TimesTen Serverアドレス

TimesTen Serverのインストール時に、ソフトウェアをインストールするコンピュータを識別するために使用するホスト名またはIPアドレス。

トランザクション

データベースのデータに対して実行する1つの処理または一連の処理。トランザクションに定義された処理は、処理全体を完了する必要があり、トランザクションの一部が失敗すると、トランザクション全体が失敗します。「ACIDトランザクション・セマンティクス」も参照してください。

UCS-4

固定幅で32ビットのUnicodeキャラクタ・セット。文字ごとに32ビットの記憶域が使用されます。この規格では、最初の65,536コード・ポイントはUCS-2文字となるため、各文字をUCS-2の32ビット拡張として表示できます。

UTF-16

各Unicode文字を、2バイトの整数または2バイトの整数のペアのいずれかで表す、ISO/IEC 10646規格で定義されているエンコーディング方法。ヨーロッパ言語のスクリプトおよびほとんどのアジア言語のスクリプトの文字は2バイトで表されます。サロゲート・ペアは、4バイトで表されます。サロゲート・ペアは、2バイト文字の元の範囲には含まれていなかった使用頻度の低いアジア言語の文字などを表します。

ユーザー・アカウント

ユーザー名、パスワードおよびアクセス権の組合せ。これによって、個々のユーザーにオペレーティング・システムへのアクセス権を付与します。

ユーザー・データソース名

「データソース名, ユーザー」を参照してください。

ユーザーDSN

「データソース名, ユーザー」を参照してください。

ユーザー・マネージャ

ユーザー・アカウントの作成およびアクセス権やグループ・メンバーシップの割当てに使用するWindowsのユーティリティ・プログラム。

Windowsソケット(Winsock)

Windowsプラットフォームで、TCP/IP転送用の標準的なバイナリ・インタフェースを定義したAPI。このAPIでは、最初にBerkeley UNIXで定義されたBerkeleyソケット・インタフェースにWindows固有の拡張機能が追加されています。

索引
A B C D E F G H I J L M N O P Q R S T U V W X

A

アクセントを区別しない言語ソート, 5.5.3

アクセス制御, 4

権限, 4.2.1

概要, 4.2

更新の確認, 10.8.2 アクティブなスタンバイ・ペア

エージング, 8.2.3.5

ADMIN権限, 4.2.1.1, 4.2.2 管理者

権限, 4.2.1.1

エージング

アクティブ・スタンバイ・ペア, 8.2.3.5

属性, 8.2.3.1

外部キー, 8.2.3.3

LRU, 8.2.3.1

ON DELETE CASCADE, 8.2.3.3

親表および子表, 8.2.3.3

パフォーマンス, 8.2.3.2

レプリケーション, 8.2.3.5

制限, 8.2.3

表, 8.2.3

時間ベース, 8.2.3, 8.2.3.2

使用状況ベース, 8.2.3.1

エージング, 「LRUエージング」を参照 ALLキーワード, 4.2.3.1

システム権限, 4.2.2.2

ALL_TAB_PRIVSビュー, 4.2.6 ALL_USERSビュー, 4.1.2 allfunctionsコマンド

ttIsqlユーティリティ, 6.10

-allowNetworkFilesオプション

ttendaemon.optionsファイル, 3.3.4

allpackagesコマンド

ttIsqlユーティリティ, 6.10

allproceduresコマンド

ttIsqlユーティリティ, 6.10

ALTER ANY CACHE GROUP権限, 4.2.5.2 ALTER ANY権限, 4.2.2.5.1, 4.2.3.7 ALTER SESSION SQL文, 5.7 ALTER TABLE

列の追加および削除, 8.2.1.1

パフォーマンス, 10.3.10

REFERENCES権限, 4.2.3.6

ANYシステム権限, 4.2.2.5 アプリケーション

障害

ログおよびロックの使用, 7.3.1

リンク

直接, 1.1

ドライバ・マネージャとのリンク, 1.1 停止, 3.2 非同期チェックポイント

「ファジー・チェックポイント」を参照

属性

接続, 2.2.5

データベース名, 1.6.4

PermWarnThreshold, 1.11.4

UNIXでの設定, 1.3.2.1

指定, 1.3.1.3

TempWarnThreshold, 1.11.4

ttIsqlによる表示および変更, 6.11

AUTO_ACKNOWLEDGEモード, 10.8.2 自動コミット

パフォーマンスへの影響, 10.5.4

autocommitコマンド

ttIsqlユーティリティ, 6.12

自動クライアント・フェイルオーバー, 2.2.6

B

バッチ・モード

ttIsql, 6.1

ビットマップ索引, 10.3.3

使用時, 8.5.1

バイト・セマンティクス, 5.3, 5.3

C

キャッシュ・グループ

変更, 4.2.5.2

作成, 4.2.5.2

破棄, 4.2.5.2

権限の付与, 4.2.5

権限, 4.2.1.2, 4.2.5.3

AWTに必要な権限, 4.2.5.1

時間ベースのエージング, 8.2.3.2

CACHE_MANAGER権限, 4.2.5.1 cachegroupsコマンド

ttIsqlユーティリティ, 6.9, 6.9.2

大/小文字を区別しない言語ソート, 5.5.3 キャラクタ・セマンティクス, 5.3, 5.3 キャラクタ・セット

アプリケーション,5.2.2, 5.2.2

アプリケーション・データ, 5.4

選択, 5.2

接続, 5.4

変換, 5.2.3, 5.4

エンコーディング, 5.2.1

グローバリゼーション, 5

言語, 5.2.1

長さセマンティクス, 5.3

マルチバイト, 5.2.1, 5.3

オペレーティング・システム, 5.2.2

パフォーマンス, 5.2.3, 5.4

レプリケーション, 5.2.4

選択, 5.2

シングルバイト, 5.2.1, 5.3

TIMESTEN8, 5.7.1

ttIsqlの処理, 6.8

チェックポイント

自動, 8.1.3

ファジー

期間への影響, 7.5

パフォーマンス, 10.5.3

設定と管理, 7.5.4

静的

CkptFrequency接続属性, 7.6.2.1 CkptLogVolume接続属性, 7.6.2.1 CkptReadThreads接続属性, 10.6.2 クライアント

Windowsで認証用に構成する, 2.2.5.1.2

UNIXでの自動フェイルオーバーの構成, 2.2.6.2.2

Windowsでの自動フェイルオーバーの構成, 2.2.6.2

接続属性

説明, 2.2.3, 2.2.5

DSNの作成

UNIXの場合, 2.2.5.2

Windowsの場合, 2.2.5.1.1

パフォーマンス, 10.2.2 Windowsでのタイムアウト時間の設定, 2.2.5.1.2 クライアントDSN

作成, 2.2.5.2

UNIXでの作成, 2.2.5.2

Windowsでの作成, 2.2.5.1.1

「Data Source Setup」ダイアログ・ボックス, 2.2.5.1.1

名前, 2.2.5.1.1, 2.2.5.1.1

クライアント・フェイルオーバー

自動クライアント・フェイルオーバー, 2.2.6

CLIENT_ACKNOWLEDGEモード, 10.8.3 クライアント/サーバー

共有メモリー・セグメントのサイズの変更, 3.4.5.2

通信

概要, 2.1.2

構成, 2.2 ビット・レベル間の接続, 2.2.2.2 リリース間の接続, 2.2.2.2 共有メモリー・セグメントのサイズの管理, 3.4.5.1 パフォーマンス, 10.2.1 共有メモリー, 3.4.5.2 TCP/IP通信, 2.1.2.1, 2.1.2.1 UNIXソケット通信, 2.1.2.3, 2.1.2.3 クライアント/サーバーの通信

共有メモリー, 3.4.5

TCP/IP, 3.4.5

closeコマンド

ttIsqlユーティリティ, 6.13

cmdcacheコマンド

ttIsqlユーティリティ, 6.19.2.1

異なるロック・レベルの併用 列

追加, 8.2.1.1

デフォルト値, 8.2.1.3

インライン, 8.2.1.2

NULL値可能, 8.2.1.1

コマンド

履歴

ttIsql, 6.6

無効, 9.1 無効化, 10.3.9 コマンド・キャッシュ

表示, 9.2.2

コマンド履歴

ttIsql

消去, 6.6.1

保存, 6.6.1

コミット動作

Oracle Database, 7.2.2

TimesTen, 7.2.2

コミット・バッファ

トランザクション

構成, 7.7.2

commitコマンド

ttIsqlユーティリティ, 6.12

CommitBufferSizeMax接続属性, 7.7.2 commitdurableコマンド

ttIsqlユーティリティ, 6.12

圧縮

表, 10.3.14

同時実行性

ロック, 7.4, 10.2.4.1

独立性のタイプ, 7.4

構成

クライアント/サーバー, 2.2

接続

接続文字列の使用, 1.8

connectコマンド

ttIsqlユーティリティ, 6.20.2

接続

ロック, 10.2.4

ロック, 10.2.3

パフォーマンスのオーバーヘッド, 10.1.6

setAutoCommitメソッド, 7.2.1

Windowsでのテスト, 2.2.5.1.4

タイムアウト時間, 10.2.3

接続

setAutoCommitメソッド, 7.2.1

接続属性

CommitBufferSizeMax, 7.7.2

接続, 2.2.3

LockLevel, 10.2.4

LogFlushMethod, 10.5.2

PermSize, 1.11, 1.11

PLSCOPE_SETTINGS, 1.6.3

PLSQL_MEMORY_ADDRESS, 1.6.3

PLSQL_MEMORY_SIZE, 1.6.3

PLSQL_OPTIMIZE_LEVEL, 1.6.3

TempSize, 1.11, 1.11

UID, 8.1.2

UNIX, 1.3.2.1

接続キャラクタ・セット, 2.2.5.1.1, 5.4 接続文字列

接続に使用, 1.8

ConnectionCharacterSet接続属性, 5.4 Connection.prepareStatementメソッド, 9.3.1

実行計画の生成, 9.4.2

Connection.prepareStatementメソッド, 9.3.1 Connection.setAutoCommitメソッド, 7.2.1 競合

ロック, 10.1.9

CREATE ANY CACHE GROUP権限, 4.2.5.2 CREATE ANY権限, 4.2.2.5.1 CREATE ANY SYNONYM文, 4.2.3.8 CREATE ANY TABLE権限, 4.2.5.2 CREATE CACHE GROUP権限, 4.2.5.2 CREATE INDEX文, 8.5.2 CREATE OR REPLACE SYNONYM文, 4.2.3.8, 8.7.1 CREATE権限, 4.2.2.5.1 CREATE PUBLIC SYNONYM文, 4.2.3.8 CREATE SESSION権限, 4.2.2.3, 4.2.2.3 CREATE SYNONYM文, 4.2.3.8, 8.7.1 CREATE TABLE権限, 4.2.5.2 createandloadfromoraqueryコマンド, 6.18, 6.18.1

取消し, 6.18.1

作成, 8.5.2 カスタム設定, Windows, 1.1.1

D

デーモン

制御処理, 3.3.3

Windowsでの情報メッセージ

リスナー, 3.3.1

IPv4プロトコル, 3.3.1.1

リスニング・アドレス, 3.3.1, 3.3.1 オプションの変更, 3.4.1 オプション, 3.3 オプション, 「ttendaemon.optionsファイル」を参照 概要, 3 開始

UNIX, 3.1.2, 3.1.2

Windows, 3.1.1, 3.1.1

停止

UNIX, 3.1.2, 3.1.2

Windows, 3.1.1, 3.1.1

データ

永続, 1.11

一時, 1.11

Data Manager

開始, 3.1.1

サービスの開始, 3.1.1

停止, 3.1.1

サービスの停止, 3.1.1

Data Managerサービス, 3.1.1 データソース名, 「DSN」を参照 データベース

ローカル・システムでのアクセス, 2.1.2.3

リモート・システムでのアクセス, 2.1.2.1

自動リカバリ, 1.9.1, 1.9.2

サイズの変更, 1.11

キャラクタ・セット, 「キャラクタ・セット」を参照

コンポーネント, 8.1.1, 8.1.1

接続, 4.2.2.3, 4.2.2.3

競合, 10.1.9

定義, 1

デフラグ, 1.14

ttIsqlによる情報の取得, 6.9

メモリーへのロード, 1.10.1

ロックの競合, 10.1.9

所有者, 8.1.2

パス名, 環境変数, 1.3.2.2

永続, 8.1.3

接頭辞の名前, 1.3.2.1

自動リロードの防止, 1.9.2

リカバリ, 7.8

policyInactiveモード, 1.9.1

UNIXでの属性設定, 1.3.2.1 サイズ指定, 10.1.2 指定, 1.7.2 サイズの指定, 10.1.2 統計, 10.1.14 TCP/IP Client/Serverアクセス, 2.1.2.1 一時, 1.6.2, 8.1.3, 10.1.5

パフォーマンス, 10.1.5

UID接続属性, 8.1.2 UNIX構成ファイル, 1.7.3 UNIXソケットのクライアント/サーバー・アクセス, 2.1.2.3 メモリーからのアンロード, 1.10.2 ユーザー名, 8.1.2 ユーザー, 8.1.2 DatabaseCharacterSet属性, 5.2 データベース・レベル・ロック, 7.4.2, 7.4.2, 7.4.2 DBA_SYS_PRIVSビュー, 4.2.2, 4.2.2.1, 4.2.6 DBA_TAB_PRIVSビュー, 4.2.2.1, 4.2.6 DBA_USERSビュー, 4.1.2 DDLCommitBehavior接続属性, 7.2.2 デフォルトの列値, 8.2.1.3 デフォルトDSN, 1.6.1 デフラグ

データベース, 1.14

パーティション, 1.14

DELETE ANY権限, 4.2.2.5 DELETE権限, 4.2.3.2 削除

行, 8.6.2

Windowsのサーバー名, 2.2.4.1

describeコマンド

ttIsqlユーティリティ, 6.9, 6.9.1, 6.13

ディテール表, 8.4.1 診断

SNMPトラップ, 1.11.4

ドライバ

JDBC, 1.3.1.1

DRIVER属性, 1.3.2.1 ドライバ・マネージャ

JDBC, 1.1.2

リンク, 1.1

ODBC, 1.1

DriverManager.getConnectionメソッド, 2.2.5, 2.2.5 破棄

マテリアライズド・ビュー, 8.4.2.2

マテリアライズド・ビュー・ログ, 8.4.2.2

DROP ANY CACHE GROUP権限, 4.2.5.2 DROP ANY権限, 4.2.2.5.1 DROP ANY SYNONYM文, 4.2.3.8 DROP PUBLIC SYNONYM文, 4.2.3.8 DROP SYNONYM文, 8.7.2 破棄

索引, 8.5.4

表, 例, 8.2.2.2

DSN, 4.2.2.3

クライアント, 1.2.2, 2.2.5.1.1

クライアント, 1.2.2, 2.2.5

接続属性, Data Manager, 1.2.3

Data Manager, 1.2.2

デフォルト, 1.6.1

例, 1.6

例, Windows

優先順位による検索, 1.5

最大長, 1.2

ネーミング規則, 1.2

サーバー・プロセスの数, 3.4.4.2

.odbc.iniファイル, 1.2.1

属性の設定, 1.6.4

システム, 1.2.1

ユーザー, 1.2.1

dssizeコマンド

ttIsqlユーティリティ, 6.9, 6.9.3

DUPS_OK_ACKNOWLEDGEモード, 10.8.2 永続性

概要, 7.3.2

永続コミット

パフォーマンス, 10.5.2

トランザクション, 10.5.1

E

ttIsqlのeditline機能, 6.5

-enableIPv6オプション

ttendaemon.optionsファイル, 3.3.1.1

-enablePolicyInactiveオプション

ttendaemon.optionsファイル, 1.9.1, 3.3.6

エンコーディング

キャラクタ・セット, 5.2.1

拡張書込み同時モード, 10.3.15 環境変数

データベースのパス名, 1.3.2.2

TTISQL, 6.2

例

索引の作成, 8.5.2

表の作成, 8.2.2.1

マテリアライズド・ビューの破棄, 8.4.2.2

マテリアライズド・ビュー・ログの破棄, 8.4.2.2

表の破棄, 8.2.2.2

PLAN行, 9.3.1.2

execコマンド

ttIsqlユーティリティ, 6.13

execandfetchコマンド

ttIsqlユーティリティ, 6.13

EXECUTE ANY権限, 4.2.2.5 EXECUTE権限, 4.2.3.7 実行計画

生成, 9.1, 9.4.2

SQLPrepare, 9.4.2

生成, 9.4.2

Connection.prepareStatement, 9.4.2

変更, 9.4.1, 9.4.3, 9.4.3 explainコマンド

ttIsqlユーティリティ, 6.19.2.2

実行計画

表示, 6.19.2.2

F

-facilityオプション

ttendaemon.optionsファイル, 3.3.2

フェイルオーバー, 2.2.6

UNIXでのクライアントの構成, 2.2.6.2.2

Windowsでのクライアントの構成, 2.2.6.2

fetchallコマンド

ttIsqlユーティリティ, 6.13

fetchoneコマンド

ttIsqlユーティリティ, 6.13

ファイル

odbc.ini, 1.2.1, 1.7.3

ttendaemon.options, 3.3, 3.3.3, 3.4.5

初期接続属性, 4.2.2.3

CkptReadThreads, 10.6.2

PLSQL_MEMORY_SIZE, 10.1.3

FLUSH ANY CACHE GROUP権限, 4.2.5.2 FLUSH権限, 4.2.5.3 外部キー

制約

パフォーマンス, 10.3.5

REFERENCES権限, 4.2.3.6 断片化

ブロック・レベル, 1.11.3

freeコマンド

ttIsqlユーティリティ, 6.13

関数

オブジェクト権限, 4.2.3.7

functionsコマンド

ttIsqlユーティリティ, 6.10

ファジー・チェックポイント, 定義

G

getConnectionメソッド, 2.2.5

グローバリゼーション, 5

キャラクタ・セット, 5

GRANT ALLコマンド, 4.2.2.2, 4.2.3.1 GRANTコマンド, 4.2.2, 4.2.3

H

ハッシュ索引, 10.3.3

定義, 8.5.1, 10.3.3

概要, 8.5.1, 10.3.3

サイズ指定, 10.3.4

使用する場合, 8.5.1, 10.3.3

ヒント

概要, 9.4.3

文レベル, 9.4.3.1

トランザクション・レベル, 9.4.3.2

historyコマンド, 6.6 ホスト・バインド

ttIsqlの使用, 6.13

I

IFコマンド, 6.17

索引, 8.5.2

エージングのパフォーマンス, 8.2.3.2

自動作成, 8.2.1.5, 8.2.1.5

作成, 8.2.1.5, 8.5.2

例, 8.5.2

破棄, 8.5.4, 8.5.4 サイズの見積り, 8.5.5 明示的な作成, 8.2.1.5 概要, 8.5 所有者, 8.5.2 パフォーマンス, 10.3.1 推奨項目, 8.5.6 参照, 8.5.4 「範囲索引」を参照 「ビットマップ索引」を参照 「ハッシュ索引」を参照 一意, 8.5, 8.5 索引アドバイザ

データの取得, 8.5.6.2

データ収集情報, 8.5.6.3

収集されたデータの削除, 8.5.6.4

例, 8.5.6.5

概要, 8.5.6

索引推奨項目の取得, 8.5.6.3

INDEX権限, 4.2.3.2, 4.2.3.5 索引のサイズ

見積り, 8.5.5

ttSizeユーティリティ, 8.5.5

情報メッセージ

変更, 3.3.2

インライン列, 8.2.1.2 INSERT ANY権限, 4.2.2.5 INSERT権限, 4.2.3.2 行の挿入, 8.6.1 対話モード

ttIsql, 6.1

I/O

パフォーマンス, 10.5.1

IPC

クライアント/サーバーの通信, 3.4.5

isolationコマンド

ttIsqlユーティリティ, 6.12

分離レベル

パフォーマンス, 10.2.4.2

分離モード

記述, 7.4

パフォーマンス, 10.2.4.2

シリアライズ可能, 7.4.1

PLAN表のIXNAME列, 9.3.1.3.5

J

JDBC

ドライバ, 1.1.2

ドライバ・マネージャ, 1.1.2

JDBCドライバ, 1.1.2 JDBCトレース, 10.1.13

L

ラージ・ページのサポート

Linux, 3.3.5

最低使用頻度エージング, 「LRU」も参照 長さセマンティクス, 5.3 PLAN表のLEVEL列, 9.3.1.3.2 言語索引, 5.5.5 言語ソート

アクセントを区別しない, 5.5.3

大/小文字を区別しない, 5.5.3

単一言語, 5.5.1

多言語, 5.5.2

Linux

ラージ・ページのサポート, 3.3.5

-linuxLargePageAlignmentオプション

ttendaemon.optionsファイル, 3.3.5

-listenaddrエントリ

ttendaemon.optionsファイル, 3.3.1

-listenaddrオプション

ttendaemon.optionsファイル, 3.3.1

-listenaddr6オプション

ttendaemon.optionsファイル, 3.3.1.1

LOAD ANY CACHE GROUP権限, 4.2.5.2 LOAD権限, 4.2.5.3 LockLevel接続属性, 10.2.4 ロック

異なるレベルの併用

同時実行性, 10.2.4.1

データベース・レベル, 7.4.2, 10.2.4.1

概要表, 7.3.1

パフォーマンス, 10.2.4

競合の軽減, 10.1.9

行レベル, 7.4.2, 10.2.4.1

「ttLockLevel」を参照

待機時間の設定, 7.4.2.1

表レベル, 7.4.2, 10.2.4.1

タイムアウト時間およびパフォーマンス, 10.2.3

LockWait属性, 7.4.2.1 ログ・ファイル

蓄積, 7.6.2, 7.6.2.3

CkptFrequency属性, 7.6.2.1

CkptLogVolume属性, 7.6.2.1

保持, 7.6.2.2

監視, 7.6.2, 7.6.2.3

消去, 7.6.2.1

順序番号, 7.6.2.3

ttCkpt組込みファンクション, 7.6.2.1

LogFlushMethod接続属性, 10.5.2 ロギング

管理, 3.4.6

概要表, 7.3.1

一時データベース, 8.1.3

論理サーバー

ネットワーク・アドレス, 2.1.2.3, 2.2.4.1, 2.2.4.2

論理サーバー名

UNIXでの作成, 2.2.4.2

LRUエージング, 8.2.3, 8.2.3.1, 8.2.3.1

属性, 8.2.3.1

M

メンテナンス・オプション

パフォーマンスへの影響, 10.1.11

マテリアライズド・ビュー

非同期

作成, 8.4.2.1.2

概要, 8.4.1.2

作成, 8.4.2.1 ディテール表, 8.4.1 削除, 8.4.2.2, 8.4.2.2 無効, 4.2.3.5.1 パフォーマンス, 8.4.2.4.2 権限, 4.2.3.5 制限, 8.4.2.3 SELECT問合せ, 8.4.2.1.3 同期

作成, 8.4.2.1.1

概要, 8.4.1.1

チューニングの推奨項目, 10.4

外部結合, 10.4.4

理解, 8.4 マテリアライズド・ビュー・ログ

削除, 8.4.2.2, 8.4.2.2

-maxConnsPerServerオプション

ttendaemon.optionsファイル, 3.4.4

名前の最大長, 8.2.1.4 -maxsubsオプション

ttendaemon.optionsファイル, 3.3.3

-maxsupportlogfilesオプション

ttendaemon.optionsファイル, 3.3.2

-maxsupportlogsizeオプション

ttendaemon.optionsファイル, 3.3.2

-maxuserlogfilesオプション

ttendaemon.optionsファイル, 3.3.2

-maxuserlogsizeオプション

ttendaemon.optionsファイル, 3.3.2

メモリー

データベースのロード先, 1.10.1

永続, 1.11

データベースのロード・ポリシー, 1.9

領域, 1.11

一時, 1.11

メモリーからのデータベースのアンロード, 1.10.2

メッセージ

情報, 2.3.1, 3.3.2

サーバー・ログ, 2.3.1

無効化, 3.3.2

メタデータ, TimesTen, 8.2.1.7 -minsubsオプション

ttendaemon.optionsファイル, 3.3.3

実行計画の変更

概要, 9.4

monitorコマンド

ttIsqlユーティリティ, 6.9, 6.9.5

N

名前

ログ・ファイル, 7.6.1

最大, 8.2.1.4

ネストされた副問合せ

パフォーマンス, 10.3.11

論理サーバーのネットワーク・アドレス

ttLocalHost, 2.1.2.3

ttShmHost, 2.1.2.2

UNIX, 2.2.4.2

Windows, 2.2.4.1

NFSマウント・システム

制限, 3.3.4

NLS_LENGTH_SEMANTICS接続属性, 5.3 NLS_LENGTH_SEMANTICS一般接続属性, 5.3 NLS_SORT接続属性, 5.5.4 NLSSORT SQL関数, 5.5.4 非永続コミット, 10.5.2 非永続コミット

メリットおよびデメリット, 10.5.2

-noserverlogオプション

ttendaemon.optionsファイル, 3.4.6

非インライン列, 8.2.1.2 NULL値, ソート, 8.5 NULL値可能列

定義, 8.2

NULL値不可の主キー, 8.2.1.6

O

オブジェクト権限

ALLキーワード, 4.2.3.1

関数, 4.2.3.7

付与, 4.2.1.2, 4.2.3

マテリアライズド・ビュー, 4.2.3.5

オブジェクト

キャッシュ・グループ, 4.2.5.3

概要, 4.2.1.2 パッケージ, 4.2.3.7 プロシージャ, 4.2.3.7 取消し, 4.2.3 順序, 4.2.3.4 表, 4.2.3.2 ユーザーに付与された権限の表示, 4.2.6 ビュー, 4.2.3.3 ODBC

関数の取消し, 6.20.1

JDBCドライバ, 1.1.2

timing関数コール, 6.20.2

トレース機能とパフォーマンス, 10.1.13

UNIXドライバ, 1.3.2.1

odbc.iniファイル, 1.2.1, 1.2.1, 1.7.3

デフォルトDSN, 1.6.1

エントリの例, 1.7.3

形式, 1.7.3

形式, 1.7.3

オンライン・ヘルプ, 6.4 オペレーティング・システム

ページング, 10.1.10

PLAN表のOPERATION列, 9.3.1.3.3 オプティマイザ

アプリケーション・ヒント, 9.1

統計の計算, 8.4.2.4.1

使用例, 9.1, 9.1

計画の生成, 9.3.1.1

ヒント, 9.4.3

文レベル, 9.4.3.1

ttOptSetFlag組込みプロシージャ, 10.2.4

無効な統計, 9.1, 10.3.9 実行計画の変更, 9.4 PLAN行の例, 9.3.1.2 問合せ計画, 9.3.1 計画の読取り, 9.3.1.2 ヒントの指定, 9.4.3 optprofileコマンド

ttIsqlユーティリティ, 6.19.1

PLAN表のOTHERPRED列, 9.3.1.3.7 OUTパラメータ, 6.16 メモリー不足の警告, 1.11.4 所有者

索引, 8.5.2

P

パッケージ

オブジェクト権限, 4.2.3.7

packagesコマンド

ttIsqlユーティリティ, 6.10

パラメータ化済のSQL文, 6.13 パーティション

デフラグ, 1.14

パフォーマンス

ALTER TABLE, 10.3.10

変更済の表, 10.3.10

アプリケーションのチューニング

自動コミット・モード, 10.5.4

チェックポイント, 10.5.3

接続オーバーヘッド, 10.1.6

永続コミット, 10.5.2

メンテナンス・オプション, 10.1.11

ODBCトレース, 10.1.13

トランザクション・ロールバック, 10.5.5

トランザクション・サイズ, 10.5.1

自動コミット, 7.2.1, 7.2.1 索引の自動作成, 8.2.1.5 キャラクタ・セット, 5.2.3

変換, 5.4

チェックポイント, 10.5.3 クライアント, 10.2.2 クライアント/サーバー統計, 10.2.1 データベースのチューニング

ドライバの使用, 10.1.12

サイズの指定, 10.1.2

一時データベースのパフォーマンス, 10.1.5

外部キー制約, 10.3.5 索引, 10.3.1 分離モード, 10.2.4.2 ロックのタイムアウト時間, 10.2.3 マテリアライズド・ビューの推奨項目, 10.4 マテリアライズド・ビュー, 10.4.4 ネストした副問合せ, 10.3.11 SQL

実行時間, 10.3.2

ヒストグラム, 10.3.2

データのサンプリング, 10.3.2

統計, 10.3.2

SQLのチューニング

索引, 10.3.1

準備処理, 10.3.13

一時データベース, 10.1.5 一時データベース, 10.1.4 トランザクションの推奨項目, 10.5 チューニング, 10 権限の使用, 4.2.3.2 ローカル処理, 10.2.2 永続データベース, 8.1.3

自動チェックポイント, 8.1.3

永続メモリー領域, 1.11.1 PermSize属性, 1.11, 1.11

監視, 1.11.3

指定, 10.1.2

PermWarnThreshold属性, 1.11.4 ファントム, 10.2.4.2 計画

「実行計画」を参照, 9.3.1.3

PLAN行, 9.3.1.2 PLAN表

列, 9.3.1.3

IXNAME列, 9.3.1.3.5

LEVEL列, 9.3.1.3.2

OPERATION列, 9.3.1.3.3

OTHERPRED列, 9.3.1.3.7

PRED列, 9.3.1.3.6

STEP列, 9.3.1.3.1

TBLNAME列, 9.3.1.3.4

PLSCOPE_SETTINGS接続属性, 1.6.3 PL/SQL

ブロックの作成および実行, 6.15

ホスト変数

ttIsqlの使用, 6.13

オブジェクト

ttIsqlによる表示, 6.10

共有メモリーのサイズ指定, 10.1.3 PLSQL_MEMORY_ADDRESS接続属性, 1.6.3 PLSQL_MEMORY_SIZE接続属性, 1.6.3, 10.1.3 PLSQL_OPTIMIZE_LEVEL接続属性, 1.6.3 policyInactiveモード, 1.9.1 PLAN表のPRED列, 9.3.1.3.6

長さの制限, 9.3.1.3.6

複数更新レコードのプリフェッチ, 10.8.2 prepareコマンド

ttIsqlユーティリティ, 6.13

準備済のSQL文, 6.13 PreparedStatementオブジェクト, 9.4.2, 9.4.2 文の準備, 9.3.1, 9.3.1 主キー, 8.2.1.6

NULL値可能, 8.2.1.6

「一意の索引」も参照

権限

ADMIN, 4.2.1.1, 4.2.2

管理者, 4.2.1.1

ALLキーワード, 4.2.3.1

ALLキーワード・システム権限, 4.2.2.2

ALTER ANY, 4.2.2.5.1, 4.2.3.7

ANY, 4.2.2.5

権限, 4.2.1

キャッシュ・グループ, 4.2.1.2, 4.2.5, 4.2.5.3

CACHE_MANAGER, 4.2.5.1

CREATE ANY, 4.2.2.5.1

CREATE SESSION, 4.2.2.3

CREATEシステム権限, 4.2.2.5.1

定義, 4.2.1

DELETE, 4.2.3.2

DELETE ANY, 4.2.2.5

DROP ANY, 4.2.2.5.1

EXECUTE, 4.2.3.7

EXECUTE ANY, 4.2.2.5

初期接続属性, 4.2.2.3

システム権限の付与, 4.2.2

権限の付与, 4.2.1

システム権限の付与, 4.2.1.1

階層のルール, 4.2.1.4

INDEX, 4.2.3.2

INSERT ANY, 4.2.2.5

レベル, 4.2.1

オブジェクト, 4.2.1.2

キャッシュ・グループ, 4.2.5.3

関数, 4.2.3.7

付与, 4.2.1.2, 4.2.3

マテリアライズド・ビュー, 4.2.3.5

パッケージ, 4.2.3.7

プロシージャ, 4.2.3.7

取消し, 4.2.3

順序, 4.2.3.4

表, 4.2.3.2

ビュー, 4.2.3.3

概要, 4.2 親表および子表のルール, 4.2.8 パフォーマンス, 4.2.3.2 REFERENCES, 4.2.3.2 レプリケーション, 4.2.1.2 システム権限の取消し, 4.2.2 ALLの取消し, 4.2.2.2 ロール, 4.2.1.3 SELECT, 4.2.3.2, 4.2.3.3, 4.2.3.4, 4.2.3.5 SELECT ANY, 4.2.2.5 システム

概要, 4.2.1.1

UPDATE, 4.2.3.2 UPDATE ANY, 4.2.2.5 ユーザーに付与された権限の表示, 4.2.6 XLA, 4.2.2.4 プロシージャ

オブジェクト権限, 4.2.3.7

proceduresコマンド

ttIsqlユーティリティ, 6.10

PUBLICロール, 4.2.1.3

ロール

PUBLIC, 4.2.1.3

PWD接続属性, 2.2.5.1.2

Q

問合せ

計画, 9.3.1

問合せオプティマイザ

計画, 9.1

ttIsqlを使用した表示, 6.19.1

「オプティマイザ」を参照 問合せ計画

表示, 6.19.2.2

ヒント, 9.4.3.1

R

RAMポリシー

データベース無効化後の変更, 1.9

失敗後の変更, 1.9.1

定義, 1.9

設定, 1.9

範囲索引, 10.3.3

概要, 8.5.1

再要求操作

トランザクション, 7.7

コミット・バッファの構成, 7.7.2

リカバリ, 1.9.1, 1.9.2, 7.8

チューニング, 10.6

REF CURSOR

ttIsqlの使用, 6.13

REFERENCES権限, 4.2.3.2, 4.2.3.5, 4.2.3.6 索引の参照, 8.5.4 REFRESH ANY CACHE GROUP権限, 4.2.5.2 REFRESH権限, 4.2.5.3 リモート・データベース

UNIXでのアクセス, 2.2.4.2, 2.2.5.2, 2.4, 2.4.1

Windowsでのアクセス, 2.2.5.1.3

削除

列, 8.2.1.1

行, 8.2.1.1

レプリケーション

エージング, 8.2.3.5

キャラクタ・セット, 5.2.4

権限, 4.2.1.2

一時メモリー領域, 1.11.1

TimesTenデーモン, 3

.resファイル, 7.5.2 表の名前に対する制限, 8.2.1.4 REVOKE ALLコマンド, 4.2.2.2, 4.2.3.1 REVOKEコマンド, 4.2.2, 4.2.3 ロール

PUBLIC, 4.2.1.3

ロールバック

ログおよびロック, 7.3.1

パフォーマンスへの影響, 10.5.5

rollbackコマンド

ttIsqlユーティリティ, 6.12

行レベル・ロック, 7.4.2 行

追加, 8.2.1.1

削除, 8.6.2

インライン部分およびアウトライン部分, 8.2.1.2

挿入, 8.6.1

理解, 8.6

S

スキーマ

定義, 用語集

SELECT ANY権限, 4.2.2.5 SELECT権限, 4.2.3.2, 4.2.3.3, 4.2.3.4, 4.2.3.5, 4.2.3.5 セマンティクス

バイト, 5.3

文字, 5.3

長さに関する考慮点, 5.3

順序

オブジェクト権限, 4.2.3.4

シリアライズ可能分離モード, 7.4.1 シリアライズ可能トランザクション

パフォーマンス, 10.2.6

サーバー

制御, 3.4.2

DSNの作成, 2.2.3, 2.2.3

論理名の作成, 2.2.4.1

UNIXの場合, 2.2.4.2

説明, 2.3 オプションの変更, 3.4.1 名前, 2.2.4.1, 2.2.5.1.1

Windowsでの作成, 2.2.4.1

プロセスの数, 3.4.4.2 ポート番号, 3.4.2 プロセスの事前生成, 3.4.3 「Server List」ダイアログ, 2.2.4.1 「Server Name Setup」ダイアログ・ボックス, 2.2.4.1 接続の数の指定, 3.4.4 開始, 2.3, 3.4.2 停止, 2.3 スレッドのスタック・サイズ, 3.4.4.3 Serverデーモン

オプションの変更, 3.4.1

サーバー・ログ・メッセージ

制御, 3.4.6

-serverオプション

ttendaemon.optionsファイル, 3.4.2

-serverpoolオプション

ttendaemon.optionsファイル, 3.4.3

-serverShmIpcオプション

ttendaemon.optionsファイル, 3.4.5

-serverShmSizeオプション

ttendaemon.optionsファイル, 3.4.5.2

-serversPerDSNオプション

ttendaemon.optionsファイル, 3.4.4.2

-serverStackSizeオプション

ttendaemon.optionsファイル, 3.4.4.3

サービス

「デーモン」を参照

setjoinorderコマンド

ttIsqlユーティリティ, 6.19.1

setuseindexコマンド

ttIsqlユーティリティ, 6.19.1

共有メモリー

サイズの変更, 3.4.5.2

クライアント/サーバーIPC, 3.4.5

クライアント/サーバー, サイズの管理, 3.4.5.1

IPC対応サーバー, 3.4.5

サイズ指定, 10.1.3

共有メモリー・キー

範囲指定, 3.3.7

共有メモリー・セグメント

サイズの管理, 3.4.5.1

サイズ, 3.4.5.2

-shmkeyrangeデーモン・オプション, 3.3.7 -showdateオプション

ttendaemon.optionsファイル, 3.3.2

showplanコマンド, 6.13, 6.19.1

ttIsqlユーティリティ, 6.19.1

サイズ

データベース, 1.11

サイズ指定

ハッシュ索引, 10.3.4

トランザクション, 10.5.1

SNMPトラップ

説明, 1.11.4

NULL値のソート, 8.5 SQL

パラメータ化済の文, 6.13

準備済の文, 6.13

問合せ計画, 9.3.1

チューニングおよびパフォーマンス, 10.3

SQLコマンド・キャッシュ

無効, 9.1

無効化, 10.3.9

コマンドの表示, 6.19.2.1

SQLPrepare, 9.3.1

実行計画の生成, 9.4.2

パフォーマンスへの影響, 10.3.13

sqlquerytimeoutコマンド

ttIsqlユーティリティ, 6.12

静的チェックポイント, 定義 統計

収集済, 10.1.14

計算, 10.3.6

評価, 10.2.1

リストア用スクリプトの生成, 10.3.8

再計算, 9.1, 9.1, 10.3.9

SQL文, 10.3.2

ツール, 10.2.1

ttOptEstimateStats, 8.4.2.4.1, 10.3.6

ttOptUpdateStats, 8.4.2.4.1, 10.3.6

更新, 8.5.6.1

PLAN表のSTEP列, 9.3.1.3.1 サブデーモン

定義, 3.3.3

必要最低数, 3.3.3

許容数の設定, 3.3.3

許容範囲の指定, 3.3.3

副問合せ

ネスト

パフォーマンス, 10.3.11

-supportlogオプション

ttendaemon.optionsファイル, 3.3.2

同期チェックポイント

「静的チェックポイント」を参照

シノニム

作成, 8.7, 8.7.1

定義, 8.7

削除, 8.7.2

無効化, 8.7.3

プライベート, 8.7

パブリック, 8.7

再コンパイル, 8.7.3

必要な権限, 4.2.3.8

表示, 8.7

表のSYS所有者, 8.2.1.4 syslog

機能の指定, 3.3.2

SYS.MONITOR表, 1.11.3 SYS.SYSTEMSTATS表, 7.6.2.3, 10.2.1, 10.5.2, 10.8.1 システムDSN, 1.3.1.1, 2.2.4.1, 2.2.5.1.4 システム障害

ログ結果およびロック結果, 7.3.1

システム権限

ANY, 4.2.2.5

キャッシュ・グループ, 4.2.5

CREATE, 4.2.2.5.1

デフォルトの権限, 4.2.2.1

付与, 4.2.1.1, 4.2.2

ALLの付与, 4.2.2.2

概要, 4.2.1.1

取消し, 4.2.2

ユーザーに付与された権限の表示, 4.2.6

システム表

アクセス, 4.2.2.1

索引, 8.5.2

概要, 8.2.1.7

T

表

サイズの計算, 6.9.4

圧縮, 10.3.14

統計の計算, 8.4.2.4.1

作成, 例, 8.2.2.1, 8.2.2.1

行の削除, 8.6.2

破棄, 例, 8.2.2.2, 8.4.2.2

サイズの見積り, 8.2.2.3

書式, 8.2

インライン列と非インライン列の比較, 8.2.1.2

行の挿入, 8.6.1

Oracle Databaseデータのロード, 6.18

書式の変更, 8.2.1.1

名前の長さ, 8.2.1.4

名前, 8.2.1.4

制限, 8.2.1.4

NULL値可能列, 8.2 オブジェクト権限, 4.2.3.2 所有者, 8.2.1.4 パフォーマンス, 10.3.10 サイズ

見積り, 8.2.2.3

ttSizeユーティリティ, 8.2.2.3

SYS所有者, 8.2.1.4 システム, 4.2.2.1 行の理解, 8.6 一意索引 表レベル・ロック, 7.4.2 tablesizeコマンド, 6.9

ttIsqlユーティリティ, 6.9.4

PLAN表のTBLNAME列, 9.3.1.3.4 TCP/IP

クライアント/サーバー

通信, 2.1.2.1

一時属性

パフォーマンス, 10.1.4, 10.1.5

一時データベース, 8.1.3

ロギング, 8.1.3

一時メモリー領域

レプリケーション, 1.11.1

TempSize属性, 1.11, 1.11

監視, 1.11.3

指定, 10.1.2

Windowsでの接続テスト, 2.2.5.1.4 スレッド・プログラミング,1.13 時間ベースのエージング, 8.2.3.2 Timeout接続属性, 2.2.5.1.2 タイムアウト時間

Windowsでの設定, 2.2.5.1.2, 2.2.5.1.2

TimesTen

ODBCドライバ, 1.1.1

TimesTenデーモン

オプション, 3.3

TIMESTEN8キャラクタ・セット, 5.7.1 timestend, 3 timingコマンド

ttIsqlユーティリティ, 6.20.2

トランザクション

コミット

バッファのサイジング, 影響, 10.5.7

ログおよびロック, 7.3.1

永続コミット, 10.5.1 ロック, 10.2.4 ログ・ファイル, 7.6.2.1

蓄積, 7.6.2, 7.6.2.3

CkptFrequency属性, 7.6.2.1

CkptLogVolume属性, 7.6.2.1

保持, 7.6.2.2

制御方法, 7.6.1

監視, 7.6.2

監視, 7.6.2.3

名前, 7.6.1

消去, 7.6.2.1

順序番号, 7.6.2.3

ロギング, 7.6.1 管理

分離レベル, 7.4

ロック,7.3.1

ロギング, 7.3.1

セマンティックス, 7.3.1

パフォーマンス, 7.6.3.3, 10.5.1, 10.5.2 再要求操作, 7.7

コミット・バッファの構成, 7.7.2

ロールバック

ログおよびロック, 7.3.1

パフォーマンスへの影響, 10.5.5

ttXactAdminユーティリティ, 7.6.2.2

シリアライズ可能

パフォーマンス, 10.2.6

サイズ指定, 10.5.1 ttIsqlユーティリティ, 6.12 チューニングの推奨項目, 10.5 XLA, 10.8.1 tryhashコマンド

ttIsqlユーティリティ, 6.19.1

trymergejoinコマンド

ttIsqlユーティリティ, 6.19.1

trynestedloopjoinコマンド

ttIsqlユーティリティ, 6.19.1

tryrangeコマンド

ttIsqlユーティリティ, 6.19.1

tryrowidコマンド

ttIsqlユーティリティ, 6.19.1

tryserialコマンド

ttIsqlユーティリティ, 6.19.1

trytbllocksコマンド

ttIsqlユーティリティ, 6.19.1

trytmphashコマンド

ttIsqlユーティリティ, 6.19.1

trytmprangeコマンド

ttIsqlユーティリティ, 6.19.1

trytmptableコマンド

ttIsqlユーティリティ, 6.19.1

TT_PREFETCH_CLOSE接続オプション, 10.2.6 TT_STATS PL/SQLパッケージ, 10.1.14, 10.2.1 ttAdminユーティリティ

-autoreload, 1.9.2

-noautoreload, 1.9.2

ttAgingLRUConfig組込みプロシージャ, 8.2.3.1 ttBlockInfoユーティリティ, 1.11.3 ttCkpt組込みファンクション, 7.6.2.1, 7.6.2.1 ttCkptHistory組込みプロシージャ, 7.6.2.3 ttCommitBufferStats組込みプロシージャ, 7.7.2 ttCommitBufferStatsReset組込みプロシージャ, 7.7.2 ttdaemon.optionsファイル

変更, 3.3

ttDbWriteConcurrencyModeGet組込みプロシージャ, 10.3.15 ttDbWriteConcurrencyModeSet組込みプロシージャ, 10.3.15 ttDurableCommitプロシージャ, 10.5.2 ttendaemon.optionsファイル, 3.3, 3.3.2, 3.3.2, 3.3.3, 3.4.5

-allowNetworkFilesオプション, 3.3.4

-enableIPv6, 3.3.1.1

-enablePolicyInactiveオプション, 1.9.1, 3.3.6

-facilityオプション, 3.3.2

-linuxLargePageAlignmentオプション, 3.3.5

-listenaddrエントリ, 3.3.1

-listenaddrオプション, 3.3.1

-listenaddr6オプション, 3.3.1.1

-maxConnsPerServerオプション, 3.4.4

-maxsubsオプション, 3.3.3

-maxsupportlogfilesオプション, 3.3.2

-maxsupportlogsizeオプション, 3.3.2

-maxuserlogfilesオプション, 3.3.2

-maxuserlogsizeオプション, 3.3.2

-minsubsオプション, 3.3.3

-noserverlogオプション, 3.4.6

-serverオプション, 3.4.2

-serverpoolオプション, 3.4.3

-serverShmlpcオプション, 3.4.5

-serverShmSizeオプション, 3.4.5.2

-serversPerDSNオプション, 3.4.4.2

-serverStackSizeオプション, 3.4.4.3

-shmkeyrangeデーモン・オプション, 3.3.7

-showdate, 3.3.2

syslog機能の指定, 3.3.2

-supportlogオプション, 3.3.2

メッセージの無効化, 3.3.2

-verboseオプション, 3.3.2

ttIndexAdviceCaptureDrop組込みプロシージャ, 8.5.6.4 ttIndexAdviceCaptureEnd組込みプロシージャ, 8.5.6.2 ttIndexAdviceCaptureInfoGet組込みプロシージャ, 8.5.6.3 ttIndexAdviceCaptureOutput組込みプロシージャ, 8.5.6.3 ttIndexAdviceCaptureStart組込みプロシージャ, 8.5.6.2 ttIsql, 6.4

autocommitコマンド, 6.12

組込みコマンドの使用方法, 6.9, 6.12, 6.13, 6.19.1

cachegroupsコマンド, 6.9, 6.9.2

コマンド履歴の消去, 6.6.1

cmdcacheコマンド, 6.19.2.1

コマンド履歴, 6.6

commitコマンド, 6.12

commitdurableコマンド, 6.12

connectコマンド, 6.20.2

コマンド・プロンプトのカスタマイズ, 6.3

行の削除, 8.6.2

describeコマンド, 6.9, 6.9.1

データベース情報の表示, 6.9

dssizeコマンド, 6.9, 6.9.3

editline機能, 6.5

エラー・リカバリ, 6.21

explainコマンド, 6.19.2.2

IFコマンド, 6.17

isolationコマンド, 6.12

モード, 対話およびバッチ, 6.1

monitorコマンド, 6.9, 6.9.5

オンライン・ヘルプ, 6.4

rollbackコマンド, 6.12

コマンド履歴の保存, 6.6.1, 6.6.1

showplanコマンド, 6.19.1

sqlquerytimeoutコマンド, 6.12

tablesizeコマンド, 6.9.4

timingコマンド, 6.20.2

Timing ODBC関数コール, 6.20.2

使用, 6

OUTパラメータの使用, 6.16

変数, 6.14, 6.14.2

接続属性の表示および設定, 6.11

オプティマイザ計画の表示, 6.19.1

WHENEVER SQLERROR, 6.21

キャラクタ・セットの処理, 6.8

パラメータ化したSQL文の処理, 6.13

準備済のSQL文の処理, 6.13

トランザクションの処理, 6.12

TTISQL環境変数, 6.2 ttIsqlユーティリティ

createandloadfromoraqueryコマンド, 6.18, 6.18.1

historyコマンド, 6.6

ttLoadFromOracle組込みプロシージャ, 6.18, 6.18.2

取消し, 6.18.2

ttLocalHost

論理サーバー・アドレス, 2.1.2.3

ttLogHolds組込みプロシージャ, 7.6.2.3 ttMigrateユーティリティ

デフラグメンテーションでの使用, 1.14

オフライン, 1.14.1

オンライン, 1.14.2

ttmodinstallユーティリティ, 3.3 ttOptClearStats組込みプロシージャ, 9.4.3.2 ttOptCmdCacheInvalidate組込みプロシージャ, 10.3.9 ttOptEstimateStats組込みプロシージャ, 8.4.2.4.1, 8.5.6.1, 9.4.3.2

統計の計算, 8.4.2.4.1, 10.3.6

ttOptGetFlag組込みプロシージャ, 9.4.3.2 ttOptSetColIntvlStats組込みプロシージャ, 9.4.3.2 ttOptSetFlag組込みプロシージャ, 8.5.6.1, 9.4.3.2, 10.2.4 ttOptSetOrder組込みプロシージャ, 9.4.3.2 ttOptSetTblStats組込みプロシージャ, 8.5.6.1, 9.4.3.2 ttOptStatsExport組込みプロシージャ, 10.3.8 ttOptUpdateStats組込みプロシージャ, 8.5.6.1, 9.4.3.2 ttOptUseIndex組込みプロシージャ, 9.4.3.2 ttRamPolicyAutoReloadSet組込みプロシージャ, 1.9.2 ttRepAdminユーティリティ

デフラグメンテーションでの使用, 1.14

オンライン, 1.14.2

ttShmHost

論理サーバー・アドレス, 2.1.2.2

ttSizeユーティリティ, 1.11.1 ttSQLCmdCacheInfo組込みプロシージャ, 6.19.2.1, 9.2.2, 10.3.2 ttSQLCmdQueryPlan組込みプロシージャ, 6.19.2.2 ttSQLExecutionTimeHistogram組込みプロシージャ, 10.3.2 ttStatsユーティリティ, 10.1.14, 10.2.1 ttStatsConfig組込みプロシージャ, 10.3.2 ttStatusユーティリティ, 1.10.2 ttTableSchemaFromOraQueryGet組込みプロシージャ, 6.18, 6.18.2

取消し, 6.18.2

ttWarnOnLowMemoryプロシージャ, 1.11.4 ttXactAdminユーティリティ, 7.6.2.2

U

UID接続属性, 2.2.5.1.2, 8.1.2

一意の索引, 8.5

作成, 8.2.1.6

「主キー」を参照

UNIX

構成ファイル

odbc.ini, 1.7.3, 1.7.3

属性の設定, 1.3.2.1 ソケット

クライアント/サーバーの通信, 2.1.2.3

デーモンの停止, 3.1.2 UNLOAD ANY CACHE GROUP権限, 4.2.5.2 UNLOAD権限, 4.2.5.3 unsetjoinorderコマンド

ttIsqlユーティリティ, 6.19.1

unsetuseindexコマンド

ttIsqlユーティリティ, 6.19.1

UPDATE ANY権限, 4.2.2.5 UPDATE権限, 4.2.3.2 使用状況ベースのエージング, 8.2.3.1 USER_SYS_PRIVSビュー, 4.2.2, 4.2.6 USER_TAB_PRIVSビュー, 4.2.6 USER_USERSビュー, 4.1.2 -userlogオプション

ttendaemon.optionsファイル, 3.3.2

UTL_RECOMPパッケージ, 4.2.2.1

V

変数

自動作成, 6.14.2

宣言, 6.14

-verboseオプション

ttendaemon.optionsファイル, 3.3.2

ビュー

作成, 8.3.1

削除, 8.3.2

オブジェクト権限, 4.2.3.3

概要, 8.3

制限, 8.3.3

SELECT問合せ, 8.3.1.1

W

WHENEVER SQLERRORコマンド, 6.21

Windows

タイムアウト間隔の設定, 2.2.5.1.2

開始, 3.1.1

停止, 3.1.1

X

XLA

パフォーマンス, 10.8.1

権限, 4.2.2.4

更新

確認, 10.8.3

オラクル社の法律上の注意点について

コピーライトについて

Copyright © 1994-2015, Oracle and/or its affiliates.All rights reserved.

商標と登録商標について

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

制限付権利

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション（人的傷害を発生させる可能性があるアプリケーションを含む）への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性（redundancy）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

ドラフトのアルファ版およびベータ版ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。オラクル社およびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。