TSQL 設定
設定は、コンパイラとカラー表示機能の動作を調整するために使用します。TSQL 構成オプションは、標準の InterSystems IRIS 構成の一部です。
InterSystems IRIS® データ・プラットフォームでは、以下の TSQL 設定がサポートされています。
これらの値は、対応する ^%SYS("tsql","SET",...) グローバル配列値の設定に使用します。
InterSystems IRIS の管理ポータルや、%SYSTEM.TSQLOpens in a new tab Get および Set クラス・メソッドを使用して、これらの設定を表示および変更できます。
-
InterSystems IRIS 管理ポータルに移動します。[システム管理]、[構成]、[SQL およびオブジェクトの設定]、[TSQL 互換性] の順に移動します。ここでは、DIALECT (Sybase または MSSQL。既定では Sybase) を指定したり、ANSI_NULLS、CASEINSCOMPARE および QUOTED_IDENTIFIER をオンまたはオフに設定したりできます。
1 つまたは複数の構成設定を変更した場合、画面左上の管理ポータルのパスのすぐ後にアスタリスク (*) が表示され、変更したことが示されます。例えば、[システム] > [構成] > [TSQL設定] (構成設定)* のように表示されます。構成の変更を有効にするには、[保存] ボタンをクリックする必要があります。
-
$SYSTEM.TSQL.CurrentSettings()Opens in a new tab メソッドを呼び出して次の設定を表示します。
DO ##class(%SYSTEM.TSQL).CurrentSettings()
%SYSTEM.TSQLOpens in a new tab クラス・メソッドを使用して、これらの設定を取得または設定できます。これらのメソッドは言語文字列を取り、現在の言語と指定された設定の両方を変更します。TSQL 言語ごとに個別の設定はありません。例えば、CaseInsCompare を変更すると、Sybase および MSSQL の両方に対する構成設定が変更されます。
InterSystems IRIS の構成設定を変更して、TSQL との互換性やパフォーマンスを向上させることもできます。この章で説明する構成可能なオプションは以下のとおりです。
ANSI_NULLS
ANSI_NULLS 構成オプションを使用すると、NULL 値に対する比較で True と False のどちらが返されるかを指定できます。既定値は OFF です。
-
ON : NULL 値に対する比較はすべて不明と評価されます。例えば、Age が NULL の場合でも、Age = NULL は False を返します。NULL は不明になります。そのため、NULL=NULL の指定は False/不明になります。
-
OFF : それぞれの行について、フィールドに値が含まれていない場合、フィールド値と NULL の比較は True と評価されます。例えば、Age に値が含まれていないそれぞれの行について、Age = NULL は True を返します。ただし、ANSI_NULLS OFF を使用して、2 つの異なるフィールドの NULL 値を比較することはできません。値が含まれていない 2 つのフィールドの比較は常に False です。例えば、Age = DateOfBirth と Age != DateOfBirth は、両方のフィールドに値が含まれていない場合はどちらも False を返します。
以下のように、%SYSTEM.TSQLOpens in a new tab クラス・メソッドを使用するか、または TSQLAnsiNullsOpens in a new tab プロパティから、現在の ANSI_NULLS 設定を確認できます。
SET context=##class(%SYSTEM.Context.SQL).%New()
WRITE "ANSI_NULLS is = ",context.TSQLAnsiNulls
現在の設定を返すには、$SYSTEM.TSQL.GetAnsiNulls()Opens in a new tab を使用します。このメソッドは、現在の既定の言語と現在の ANSI_NULLS 設定の両方をコンマ区切りの文字列 (例 : MSSQL, ON) として返します。
ANSI_NULLS をシステム全体で有効 (ON) または無効 (OFF) にするには、InterSystems IRIS の管理ポータルまたは $SYSTEM.TSQL.SetAnsiNulls()Opens in a new tab メソッドを使用します。
WRITE ##class(%SYSTEM.TSQL).SetAnsiNulls("Sybase","OFF")
このメソッドは既定の言語と ANSI_NULLS 設定の両方を設定し、以前の設定をコンマ区切りの文字列 (例 : MSSQL, ON) として返します。
TRACE
TRACE 構成オプションでは、TSQL プロシージャの実行ログ・ファイルを作成します。TRACE をアクティブにして TSQL ストアド・プロシージャ (メソッドまたはシステム・ストアド・プロシージャ) をコンパイルした場合、TSQL プロシージャを実行すると、アクティブな tsql ログ・ファイルにトレース・メッセージが記録されます。
TSQL プロシージャの実行元のプロセスごとに別個の tsql トレース・ログ・ファイルが作成されます。トレースはシステム全体でアクティブになります。トレース・ログ・ファイルはネームスペース固有です。
TRACE の設定に管理ポータルは使用しません。このオプションは、$SYSTEM.TSQL.SetTrace()Opens in a new tab メソッドを使用してシステム全体について設定できます。言語は指定されません。
WRITE ##class(%SYSTEM.TSQL).SetTrace("ON")
現在の設定を返すには、$SYSTEM.TSQL.GetTrace()Opens in a new tab を使用します。
以下の ObjectScript コマンドを使用すると、システム全体で TRACE をアクティブ (=1) または非アクティブ (=0) に設定できます。
SET ^%SYS("tsql","TRACE")=1
現在のトレース設定を返すには、以下のコマンドを使用します。
WRITE ^%SYS("tsql","TRACE")
TRACE ログ・ファイルには、各操作のタイムスタンプ、各操作の経過時間、グローバル参照の数、および %ROWCOUNT (該当する場合) が記録されます。TRUNCATE TABLE は常に %ROWCOUNT -1 を返します。操作にシャード・テーブルが含まれる場合、グローバル参照の数は、プロシージャが実行されたプロセスのみが対象です。その他のシャードに送信された作業は、グローバル参照の数に含まれません。
TRACE ログ・ファイルは、内部一時テーブル名を使用する一時テーブルを表します。ユーザが指定した対応する #TempTable 名が /* mytemptable */ コメントに表示されます。
TRACE ログ・ファイルは、InterSystems IRIS インスタンスの mgr ディレクトリにある、現在のネームスペースを表すサブディレクトリ内に作成されます。ファイルには現在のプロセス番号を使用して名前が付けられます。例えば、IRIS/mgr/user/tsql16392.log のようになります。以下に一般的な TRACE ログ・ファイルを示します。
IRIS TSQL Log, created 07/06/2020 13:44:41.020101 by process 16392
Version: IRIS for Windows (x86-64) 2020.2 (Build 211U) Fri Jun 26 2020 13:19:52 EDT
User: glenn
07/06/2020 13:44:41.020488
PREPARE EXECUTEPROC: Sample.StuffProc
07/06/2020 15:02:44.270773
PREPARE EXECUTEPROC: sp_addtype
07/06/2020 15:04:50.625108
PREPARE EXECUTEPROC: sp_addtype
Log restarted: 07/06/2020 15:15:42
07/06/2020 15:15:42.623033
CALLSP:: CreateMyTableProc()
07/06/2020 15:15:42.624807
EXECUTE CREATE TABLE Sample.MyTable (Name SHORTSTR, BigName MIDSTR):
Elapsed time = .313114s # Global Refs = 17,446
RETURN:: CreateMyTable with value = 0
07/06/2020 15:15:42.938084
context object: 154@%Library.ProcedureContext
Context status is OK
07/06/2020 15:23:42.171761
CALLSP:: CreateMyTable()
07/06/2020 15:23:42.174175
EXECUTE CREATE TABLE Sample.MyTable (Name SHORTSTR, BigName MIDSTR):
ERROR: -201 Table 'Sample.MyTable' already exists
SQLCODE = -400 Elapsed time = .002356s # Global Refs = 151
RETURN:: CreateMyTable with value = 0
07/06/2020 15:23:42.176979
context object: 485@%Library.ProcedureContext
Error:
ERROR #5540: SQLCODE: -201 Message: Table 'Sample.MyTable' already exists
クエリ・キャッシュのソース
デバッグに役立つように、クエリ・キャッシュのソース・コードと生成されたクエリ・キャッシュを保持することも推奨します。このオプションは次のように構成できます。
SET status=$SYSTEM.SQL.Util.SetOption("CachedQuerySaveSource",1,.oldval)
データの照合と文字列の切り捨て
InterSystems SQL の既定の照合は SQLUPPER です。これは、TSQL のネイティブの照合順に最適には一致しません。
Sybase では、複数のソート順がサポートされています。既定値はバイナリです。この既定値の説明は次のとおりです。「すべてのデータをその文字セットの数値のバイト値に従ってソートします。バイナリ順では、ASCII の大文字はすべて小文字より先にソートされます。アクセント付き文字または表意 (マルチバイト) 文字はそれぞれの標準の順序でソートされ、これは任意の順序である可能性があります。すべての文字セットでバイナリ順が既定値になっています」
このバイナリ照合順は InterSystems IRIS の SQLSTRING の照合順に最適に一致します。 したがって、SQL の照合順を SQLUPPER から SQLSTRING に変更するのが最適な互換性オプションであると考えられますが、すべての文字で正しいとは保証されません。
-
現在のネームスペースの既定の照合を設定するには、SET status=$$SetEnvironment^%apiOBJ("COLLATION","%Library.String","SQLSTRING") とします。
-
システム全体の既定の照合を設定するには、SET ^%oddENV("collation","%Library.String")="SQLSTRING" とします。
SQLSTRING 照合では、データがデータベースにロードされる際に文字列内の末尾の空白スペースが保持されます。このような文字列をストアド・プロシージャで処理する場合、末尾に空白スペースがあることでエラーが発生する可能性があります。したがって、読み取り時に文字列を切り捨てるように文字列データ型を構成することをお勧めします。文字列データ型は次のように構成できます。
SET status=$$SetSysDatatypes^%SYS.CONFIG(,"CHAR","%Library.String(MAXLEN=1,TRUNCATE=1)")
SET status=$$SetSysDatatypes^%SYS.CONFIG(,"CHAR(%1)","%Library.String(MAXLEN=%1,TRUNCATE=1)")
SET status=$$SetSysDatatypes^%SYS.CONFIG(,"VARCHAR","%Library.String(MAXLEN=1,TRUNCATE=1)")
SET status=$$SetSysDatatypes^%SYS.CONFIG(,"VARCHAR(%1)","%Library.String(MAXLEN=%1,TRUNCATE=1)")
SET status=$$SetSysDatatypes^%SYS.CONFIG(,"VARCHAR(%1,%2)","%Library.String(MAXLEN=%1,TRUNCATE=1)")
タイムスタンプと時刻精度
InterSystems SQL の既定のタイムスタンプ・データ型は %TimeStamp です。TSQL データベースに日時フィールドが多数ある場合 (金融データベースによく見られます)、%PosixTime を既定のタイムスタンプ・データ型として使用すると、必要なディスク容量を減らすことができるため、読み取りと書き込みの両方で行アクセス速度を向上させることができます。タイムスタンプ・データ型は次のように構成できます。
SET status=$$SetSysDatatypes^%SYS.CONFIG(,"DATETIME","%Library.PosixTime")
SET status=$$SetSysDatatypes^%SYS.CONFIG(,"DATETIME2","%Library.PosixTime")
SET status=$$SetSysDatatypes^%SYS.CONFIG(,"TIMESTAMP","%Library.PosixTime")
また、以下の例に示すように、既定の時刻精度を、任意の小数点以下の有効桁数に構成することもできます。
SET status=$SYSTEM.SQL.Util.SetOption("DefaultTimePrecision",6,.oldval)
一時データベースの設定
パフォーマンスを向上させるために、一時データベースと作業データベースの設定を変更して標準のチェックを解除すると効果的な場合があります。これらの変更は一部の TSQL 環境には適さない場合があります。作業テーブルは本質的に一時的ですが、あるストアド・プロシージャで使われた後に別のストアド・プロシージャで使われて存在し続ける可能性があることに注意してください。