TSQL 設定
設定は、コンパイラとカラー表示機能の動作を調整するために使用します。TSQL 構成オプションは、標準の InterSystems IRIS 構成の一部です。
InterSystems IRIS® データ・プラットフォームでは、以下の TSQL 設定がサポートされています。
-
CASEINSCOMPARE (文字列比較で大文字と小文字を区別しない。)
これらの値は、対応する ^%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 との互換性やパフォーマンスを向上させることもできます。この章で説明する構成可能なオプションは以下のとおりです。
DIALECT
DIALECT 構成オプションでは、Transact-SQL 言語を選択できます。選択可能なオプションは Sybase および MSSQL です。既定値は Sybase です。現在の設定を返すには、$SYSTEM.TSQL.GetDialect()Opens in a new tab を使用します。このオプションをシステム全体で設定するには、InterSystems IRIS の管理ポータルまたは $SYSTEM.TSQL.SetDialect()Opens in a new tab メソッドを使用します。
WRITE ##class(%SYSTEM.TSQL).SetDialect("Sybase")
このメソッドは、以前の言語設定を返します。
DIALECT=MSSQL の場合、DECLARE 文はホスト変数値を結合します。
DIALECT=Sybase の場合、ホスト変数値は更新され、各カーソルを OPEN にします。
以下のように InterSystems SQL の既定値を上書きすることにより、Transact-SQL のソース・コードを処理するように InterSystems SQL を設定することもできます。
InterSystems ダイナミック SQL で Transact-SQL 言語を設定する
管理ポータルの SQL インタフェースで Transact-SQL 言語を設定する
InterSystems SQL シェルで Transact-SQL 言語を設定する
JDBC で Transact-SQL 言語を設定する
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) として返します。
CASEINSCOMPARE
CASEINSCOMPARE 設定では、'A'='a' のように大文字と小文字を区別せずに、同様に比較します。既定値は OFF です。このオプションを ON に設定すると、比較演算子 = および <> を使用した演算では、ほとんどのコンテキストで大文字と小文字が区別されなくなります。ただし、次の場合は大文字と小文字が区別されます。
-
JOIN で比較条件が ON のとき。
-
いずれかのオペランドがサブクエリのとき。
InterSystems SQL では上記の場合に %SQLUPPER 演算子を受け付けないため、これらは例外になっています。
以下のように、%SYSTEM.TSQLOpens in a new tab クラス・メソッドを使用するか、または TSQLCaseInsCompareOpens in a new tab プロパティから、現在の CASEINSCOMPARE 設定を確認できます。
SET context=##class(%SYSTEM.Context.SQL).%New()
WRITE "ANSI_NULLS is = ",context.TSQLCaseInsCompare
現在の設定を返すには、$SYSTEM.TSQL.GetCaseInsCompare()Opens in a new tab を使用します。CASEINSCOMPARE をシステム全体で有効 (ON) または無効 (OFF) にするには、InterSystems IRIS の管理ポータルまたは $SYSTEM.TSQL.SetCaseInsCompare()Opens in a new tab メソッドを使用します。
WRITE ##class(%SYSTEM.TSQL).SetCaseInsCompare("Sybase","OFF")
このメソッドは、以前の CASEINSCOMPARE 設定を返します。
QUOTED_IDENTIFIER
QUOTED_IDENTIFIER 構成オプションにより、引用符で囲まれた識別子をサポートするかどうかを選択できます。既定はオフ (サポートしない) です。このオプションは、InterSystems IRIS 管理ポータルを使用して設定されます。QUOTED_IDENTIFIER がオンの場合、二重引用符が識別子の区切り文字として解析されます。QUOTED_IDENTIFIER がオフの場合、二重引用符が文字列リテラルの代替の区切り文字として解析されます。文字列リテラルの望ましい区切り文字は一重引用符です。
以下のように、%SYSTEM.TSQLOpens in a new tab クラス・メソッドを使用するか、または TSQLQuotedIdentifierOpens in a new tab プロパティから、現在の QUOTED_IDENTIFIER 設定を確認できます。
SET context=##class(%SYSTEM.Context.SQL).%New()
WRITE "ANSI_NULLS is = ",context.TSQLQuotedIdentifier
現在の設定を返すには、$SYSTEM.TSQL.GetQuotedIdentifier()Opens in a new tab を使用します。QUOTED_IDENTIFIER をシステム全体で有効 (ON) または無効 (OFF) にするには、InterSystems IRIS の管理ポータルまたは $SYSTEM.TSQL.SetQuotedIdentifier()Opens in a new tab メソッドを使用します。
WRITE ##class(%SYSTEM.TSQL).SetQuotedIdentifier("Sybase","OFF")
このメソッドは、以前の QUOTED_IDENTIFIER 設定を返します。
等値リテラル置換
等値リテラル置換構成オプションは、メソッドを使用して設定します。管理ポータルから設定することはできません。これは、TSQL コンパイラの動作を制御します。現在の設定を返すには、$SYSTEM.TSQL.GetEqualLiteralReplacement()Opens in a new tab を使用します。既定値は ON です。
等値リテラル置換をシステム全体で有効 (ON) または無効 (OFF) にするには、$SYSTEM.TSQL.SetEqualLiteralReplacement()Opens in a new tab メソッドを使用します。
WRITE ##class(%SYSTEM.TSQL).SetEqualLiteralReplacement("Sybase","OFF")
SetEqualLiteralReplacement("Sybase","OFF") を設定すると、WHERE 節の等号 (=) 述語または IN(...) 述語を含む TSQL クエリは、等号の左側や右側のリテラル値、または IN 述語内のリテラル値についてリテラル置換を実行しません。これは、異常値があるフィールドが条件に含まれている場合にクエリ・オプティマイザがより効率的なプランを選択するうえで役立つことがあります。
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 環境には適さない場合があります。作業テーブルは本質的に一時的ですが、あるストアド・プロシージャで使われた後に別のストアド・プロシージャで使われて存在し続ける可能性があることに注意してください。