Caché SQL 入門
Caché SQL は、Caché データベースに格納されているデータに対し、徹底した標準リレーショナル・アクセスを提供します。
Caché SQL には、以下のような利点があります。
-
優れた性能とスケーラビリティ — Caché SQL は、従来のリレーショナル・データベース製品に比べ、高い性能とスケーラビリティを有しています。また、ラップトップ・コンピュータから高性能のマルチ CPU システムまで、さまざまなハードウェアやオペレーティング・システム上で実行します。
-
Caché オブジェクト・テクノロジとの統合 — Caché SQL は、Caché オブジェクト・テクノロジと密接に統合されています。データへのリレーショナル・アクセス、およびオブジェクト・アクセスの性能を低下させることなく、両方のアプローチを併用できます。
-
メンテナンスの低減 — 従来のリレーショナル・データベースとは異なり、Caché アプリケーションは、配置されたアプリケーションでインデックスの再構築、およびテーブルの圧縮を行う必要がありません。
-
標準 SQL クエリをサポート — Caché SQL は、SQL-92 標準構文とコマンドをサポートします。したがって、既存のリレーショナル・アプリケーションを簡単に Caché に移行することができ (特殊な場合を除く)、Caché のより高度なパフォーマンスと高性能なオブジェクトをご利用いただけます。
Caché SQL は、さまざまな用途に使用できます。
-
オブジェクト・ベース・アプリケーションと Web ベース・アプリケーション — Caché オブジェクトのアプリケーションや Caché Server Page アプリケーションで SQL クエリを使用して、検索などの高性能なデータベース操作を行うことができます。
-
オンライン・トランザクション処理 — Caché SQL は挿入や更新で優れた性能を発揮し、また、トランザクション処理アプリケーションにおけるクエリのタイプを提供します。
-
ビジネス・インテリジェンスとデータ保存 — Caché の多次元データベース・エンジンとビットマップ・インデックス・テクノロジの組み合わせにより、最高のデータ保存用アプリケーションを提供します。
-
任意クエリ (問い合わせ) とレポート — Caché SQL に含まれているフル装備の ODBC と JDBC ドライバ を使用して、一般のレポート・ツールやクエリ・ツールに接続できます。
-
エンタープライズ・アプリケーションの統合 — Caché SQL ゲートウェイにより、ODBC および JDBC 準拠の外部リレーショナル・データベースに保存されているデータへの、継続的な SQL アクセスが可能になります。これにより、さまざまなソースからのデータを、Caché アプリケーション内で簡単に統合できます。
アーキテクチャ
Caché SQL の核となる部分は、以下のようなコンポーネントから成り立ちます。
-
統一データ・ディクショナリ — 一連のクラス定義として保存されている、すべてのメタ情報の集積する場所。Caché は、統一ディクショナリに保存されるすべての永続クラスに対するリレーショナル・アクセス (テーブル) を、自動的に生成します。
-
SQL プロセッサとオプティマイザ — SQL クエリを解析し分析する一連のプログラム。これは、(高性能コスト・ベース・オプティマイザを使用して) 既存のクエリに最も適した検索方法を決定し、クエリを実行するコードを生成します。
-
Caché SQL サーバ — Caché ODBC および JDBC ドライバとのすべての通信を担う、一連の Caché サーバ・プロセス。また、最も頻繁に使用されるクエリのキャッシュも管理します。同じクエリが何度も実行される場合、その実行プランは、再度オプティマイザによって処理を行うのではなく、クエリ・キャッシュから取り出すことができます。
機能
Caché SQL には、すべての標準的なリレーショナル機能が装備されています。これには、以下のものがあります。
-
テーブルやビューを定義します (DDL または Data Definition Language)。
-
テーブルやビューに対しクエリを実行します (DML または Data Manipulation Language)。
-
INSERT、UPDATE、DELETE 操作などの、トランザクションを実行します。並行オペレーションを実行する際、Caché SQL は行レベル・ロックを使用します。
-
効率的にクエリを実行するために、インデックスを定義し使用します。
-
ユーザ定義タイプも含め、さまざまなデータ型に対応します。
-
ユーザとロールを定義し、それらに特権を与えます。
-
外部キーや、その他の整合性制約を定義します。
-
INSERT、UPDATE、DELETE の各トリガを定義します。
-
ストアド・プロシージャを定義、実行します。
-
クライアント・アクセスには ODBC モード、サーバ・ベース・アプリケーション (CSP ページなど) で使用するには表示モードというように、異なる形式でデータを返します。
インターシステムズは、今後も引き続き Caché SQL のその他の機能のサポートを提供します。もし、このリリースでサポートされていない機能をご希望の方は、インターシステムズのサポート窓口Opens in a new tabに、今後の新しいリリースにその機能が追加されるかどうかなど確認してください。
SQL-92 準拠
SQL-92 標準は算術演算子の優先順位に関して不明確です。この件に関する前提は SQL の実装間で異なります。Caché SQL は、SQL 算術演算子の優先順位についてシステム全体に適用される 2 つの選択肢をサポートしています。
-
既定では、Caché SQL には演算子の優先順位はなく、算術式は必ず左から右の順番で解析されます。これは、ObjectScript で使用される規則と同じです。例えば、3+3*5=30 となります。演算順位を指定するには、括弧を使用します。例えば、3+(3*5)=18 となります。
-
Caché SQL は、ANSI の優先順位を使用して算術式を解析するように構成できます。この優先順位では、乗算演算子と除算演算子の優先順位が、加算演算子、減算演算子、および連結演算子よりも高く設定されます。例えば、3+3*5=18 となります。この優先順位は、必要に応じて括弧を使用することでオーバーライドできます。例えば、(3+3)*5=30 となります。
Caché SQL は、下記の例外を除き、すべての初級 SQL-92 標準をサポートします。
-
テーブル定義に CHECK 制限を別途追加することはできません。
-
SERIALIZABLE 分離レベルはサポートされていません。
-
区切り識別子は、大文字と小文字を区別しません。SQL-92 標準では、大文字と小文字を区別する必要があります。
-
HAVING 節に含まれるサブクエリ内で、通常であれば、その HAVING 節で “使用可能な” 集合を参照できるようになっています。これはサポートされていません。
拡張機能
Caché SQL は、多数の便利な拡張機能をサポートします。これらは、Caché がデータに対し同時にオブジェクト・アクセスとリレーショナル・アクセスを提供できるという機能に基づきます。
以下は、その拡張機能の例の一部です。
-
ユーザ定義のデータ型と機能をサポートします。
-
後続のオブジェクト参照のための特別構文が使用できます。
-
サブクラスと継承をサポートします。
-
他のデータベースに保存されている外部テーブルに対するクエリをサポートします。
-
最高の性能を実現するために、テーブルの保存構成を管理するさまざまなメカニズムを提供します。
相互運用性
Caché SQL は、他のアプリケーションやソフトウェア・ツールをリレーショナルに相互運用する多くの方法をサポートします。
JDBC
Caché には、標準に対応するレベル 4 (すべて純正 Java コード) JDBC クライアントが含まれています。
Caché JDBC ドライバには、以下のような特徴があります。
-
高性能
-
純正 Java の実装
-
Unicode サポート
-
スレッドの安全性
JDBC をサポートするものであれば、あらゆるツール、アプリケーション、開発環境で Caché JDBC をご利用いただけます。互換性について問題が発生した場合やご質問等がございましたら、インターシステムズのサポート窓口Opens in a new tabまでお問い合わせください。
ODBC
Caché SQL における C 言語の呼び出しレベルのインタフェースは、ODBC です。他のデータベース製品とは異なり、Caché ODBC ドライバはネイティブのドライバであり、他のメーカー独自のインタフェース上に構築されたものではありません。
Caché ODBC ドライバには、以下のような特徴があります。
-
高性能
-
移植性
-
ネイティブの Unicode のサポート
-
スレッドの安全性
ODBC をサポートするものであれば、あらゆるツール、アプリケーション、開発環境で Caché ODBC をご利用いただけます。互換性について問題が発生した場合やご質問等がございましたら、インターシステムズのサポート窓口Opens in a new tabまでお問い合わせください。
埋め込み SQL
ObjectScript では、Caché SQL は埋め込み SQL をサポートします。つまり、メソッド (またはその他のコード) の本体内に SQL 文を配置できます。埋め込み SLQ を使用すると、単一のレコードを照会できます (複数のレコードを照会するにはカーソルを定義して使用します)。埋め込み SQL はコンパイルされます。既定では、ObjectScript ルーチンと同時にコンパイルされますが、埋め込み SQL のコンパイルを実行時まで延期することもできます。
埋め込み SQL を Caché のオブジェクト・アクセス機能と併せて使用すると、非常に高い性能を発揮できます。例えば、以下のメソッドは、既存の SKU コードにより Product のオブジェクト ID を見つけて、これを使用してメモリ内のオブジェクト・インスタンスを生成します。
ClassMethod FindBySKU(sku As %String)
{
&sql(SELECT %ID INTO :id FROM Product WHERE SKU = :sku)
If (SQLCODE = 0) {
// ask the product to display details about itself
Set product = ##class(Product).%OpenId(id)
Do product.DisplayDetails()
}
}
詳細は、“埋め込み SQL の使用法” の章を参照してください。
ダイナミック SQL
Caché は、標準ライブラリの一部として %SQL.StatementOpens in a new tab クラスを提供しており、(実行時に定義される) ダイナミック SQL 文を実行するときに使用できます。ダイナミック SQL は、ObjectScript と Caché Basic のメソッド内で使用できます。例えば、以下のメソッドでは、21 世紀に誕生した人物について、指定した人数分のクエリを実行します。このクエリは、1999 年 12 月 31 日より後に誕生したすべての人物を選択し、選択したレコードを誕生日順に並べ替えて、上位 x 件のレコードを選択します。
ClassMethod Born21stC(x) [ language = cache ]
{
SET myquery=2
SET myquery(1) = "SELECT TOP ? Name,%EXTERNAL(DOB) FROM Sample.Person "
SET myquery(2) = "WHERE DOB > 58073 ORDER BY DOB"
SET tStatement = ##class(%SQL.Statement).%New()
SET qStatus = tStatement.%Prepare(.myquery)
IF qStatus'=1 {WRITE "%Prepare failed:" DO $System.Status.DisplayError(qStatus) QUIT}
SET rset = tStatement.%Execute(x)
DO rset.%Display()
WRITE !,"End of data"
}
クエリを準備すると、そのクエリの最適化されたバージョンがクエリ・キャッシュとして保存されます。それ以降にクエリを呼び出すと、このクエリ・キャッシュが実行され、実行のたびにクエリを再び最適化するオーバーヘッドがなくなります。
詳細は、“ダイナミック SQL の使用法” の章を参照してください。
制約
以下に、Caché SQL の制約を示します。
-
NLS を使用して、個々のグローバルおよび現在実行しているプロセスのローカル変数に特定の国言語ロケール動作の $ORDER の動作を指定できます。 Caché SQL は、あらゆる国言語ロケール内で使用でき、正常に動作します。 ただし、特定のプロセスの場合に Caché SQL が参照する関連グローバルではすべて、現在のプロセスのロケールと同じ国言語ロケールを使用している必要があるという制約があります。このガイドの “照合” の章にある “SQL 照合と NLS 照合” を参照してください。