2007年05月26日
sqexplain.out and GLS
SET EXPLAIN ON を使ってSQLのアクセス・プランを調べている途中で、不思議なことに気づきました。
sqexplain.outに出力される内容のエンコーディング ( encoding ) が、場所により異なるGLS環境変数によって決定されているようです。

1.SQL識別子
2.ユーザー・インターフェース文字列
確認した限りでは、クライアント側で設定したCLIENT_LOCALE, SERVER_LOCALEなどの値には左右されないようでした。sqexplain.outファイルはデータベース・サーバー・コンピューター上に生成されるので、これで問題ないとは思います。しかし同一データベース・インスタンス上に複数のコードセットや言語でデータベースを作成しているような場合には、それぞれのデータベースのDB_LOCALEと、oninit起動時のSERVER_LOCALEとの間でのコード変換がサポートされているか、注意が必要ですね。また、DBLANGとSERVER_LOCALEの値が違っていると、言語によってはsqexplain.outファイルの一部が文字化けして判読できない、というケースも発生します(特に日本語、中国語、韓国語でUTF-8とそれ以外のコードセットを混在している場合)。sqexplain.outのエンコーディングに使用されるDBLANGやSERVER_LOCALEを変更する場合、一度インスタンスを止めてから環境変数を設定しなおす必要があるようなので、それも注意してください。
----------------------------------------
Codesets used in sqexplain.out:
* SQL identifiers
- Table names, Column names, Index names, ...
- Codeset determined by SERVER_LOCALE value of "oninit" (note1)
* User Interface strings
- Translation of "QUERY", "Estimated cost", ...
- Codeset determined by DBLANG values (note2)
note2: Priority1: "oninit"'s DBLANG
Priority2: "oninit"'s CLIENT_LOCALE
Prioirty3: client's DBLANG
:
What I learned..:
* Changing codesets for sqexplain.out file
- You can not control them per session
- oninit needs to be restarted with new environment values
* SQL Identifier names
- oninit does codeset conversion from DB_LOCALE to DBLANG
--------------------------------------------------
sqexplain.outに出力される内容のエンコーディング ( encoding ) が、場所により異なるGLS環境変数によって決定されているようです。

1.SQL識別子
表名や列名に含まれる文字は、oninitを起動した時の環境変数SERVER_LOCALEに従ってエンコードされています。表名や列名は、それらが含まれるデータベースのDB_LOCALEによってエンコーディングされてシステムカタログに格納されていますが、必要に応じてDB_LOCALEとSERVER_LOCALEとの間のコードセット変換をしているようです。
2.ユーザー・インターフェース文字列
sqexplain.outファイルには、"Estimated Cost" (見積もりコスト)など、内容を見やすくするための決まり文句(ここではユーザー・インターフェース文字列と呼んでいます)が含まれています。ユーザー・インターフェース文字列の言語やエンコーディングは、oninitを起動した時の環境変数DBLANG(もし設定されていなければ、同CLIENT_LOCALE)によって決定されているようです。
確認した限りでは、クライアント側で設定したCLIENT_LOCALE, SERVER_LOCALEなどの値には左右されないようでした。sqexplain.outファイルはデータベース・サーバー・コンピューター上に生成されるので、これで問題ないとは思います。しかし同一データベース・インスタンス上に複数のコードセットや言語でデータベースを作成しているような場合には、それぞれのデータベースのDB_LOCALEと、oninit起動時のSERVER_LOCALEとの間でのコード変換がサポートされているか、注意が必要ですね。また、DBLANGとSERVER_LOCALEの値が違っていると、言語によってはsqexplain.outファイルの一部が文字化けして判読できない、というケースも発生します(特に日本語、中国語、韓国語でUTF-8とそれ以外のコードセットを混在している場合)。sqexplain.outのエンコーディングに使用されるDBLANGやSERVER_LOCALEを変更する場合、一度インスタンスを止めてから環境変数を設定しなおす必要があるようなので、それも注意してください。
----------------------------------------
Codesets used in sqexplain.out:
* SQL identifiers
- Table names, Column names, Index names, ...
- Codeset determined by SERVER_LOCALE value of "oninit" (note1)
* User Interface strings
- Translation of "QUERY", "Estimated cost", ...
- Codeset determined by DBLANG values (note2)
note2: Priority1: "oninit"'s DBLANG
Priority2: "oninit"'s CLIENT_LOCALE
Prioirty3: client's DBLANG
:
What I learned..:
* Changing codesets for sqexplain.out file
- You can not control them per session
- oninit needs to be restarted with new environment values
* SQL Identifier names
- oninit does codeset conversion from DB_LOCALE to DBLANG
--------------------------------------------------
ちなみに、ユーザーセッション毎の環境変数の設定状況は、
onstat -g ses で対象のセッションIDを調べてから、
onstat -g env <セッションID>を実行すると確認できます。
WindowsのクライアントからSolaris上のIDSに接続した時に、Windows側の環境変数PATHの内容がサーバーに送られてきているのにはびっくりしました。
onstat -g ses で対象のセッションIDを調べてから、
onstat -g env <セッションID>を実行すると確認できます。
WindowsのクライアントからSolaris上のIDSに接続した時に、Windows側の環境変数PATHの内容がサーバーに送られてきているのにはびっくりしました。
Posted by oninit at 02:36│Comments(0)
│ちょっと細かいテックネタ
※このブログではブログの持ち主が承認した後、コメントが反映される設定です。