2004/05 に、CA(Computer Associates International) が、Ingres を オープンソース化する事を発表しました。 また、実際に、2004/08/04 付けで、同社ホームページにて、ソースコードと、Linux 用の 評価版が公開されました。 (2004/12/22 時点で、Linux と、Windows の RC 版が公開されています) CA Open Source Project Site - Ingres 日本国内においては、あまり反響は無かったようですが、 私のように、長年、数少ない日本国内のユーザーとして、使ってきた者にとっては、 驚きと同時に、多少の期待もあります。 今後の展開にも注目していきたいと思います。 Ingres の特徴を挙げれば、これまでオープンソースとして公開されている、 どのデータベースよりも、スケーラビリティ(大規模なシステムへの適用)と 可用性で、優れていると思われます。 例えば、大企業(従業員 1,000人以上)の基幹システムにも使える性能と、 機能を既に持っています。 さらに、今回のオープンソース化と併せて、クラスタリングへの対応が 図られているようです。これは、Oracle9i 以降のクラスタリング(RAC)と同等のものを 目指していると述べられています。 (かなり昔から、OpenVMS 上では、クラスタ環境をサポートしていた) 現状でも、Ingres は、DB2、Oracle、SQL Server(Enterprize) に匹敵する性能と 機能を持っています。 これが、無償で使えるとなれば、これまで、オープンソースの適用が難しかった、 全社展開するような業務システムの分野でも、高価な商用 RDBMS を使わずに、 システムを構築できる機会が、増すものと思われます。 なお、CA は、商売を諦めた訳ではなく、「有償サポート」というメニューを 用意しているようです。料金設定の詳細についてはわかりませんが、 必要なサポートに対する対価であるならば、それは結構な事かと思います。 少なくとも、ソースが公開されていれば、「サポート切れ」等の心配から 解放されます。 私は、「全てのケースで、同じデータベース製品を使う事が望ましい」、 というような考えは持っておりません。 例えば、Windows 環境で、ちょっとした情報共有なら、 MS SQL Server(または、MSDE) が最適だと思います。 管理も簡単ですし、特別なチューニングを行わなくても、そこそこの性能が出ます。 Office 製品との親和性も良いです。 Linux(UNIX)なら、MySQL、PostgreSQL が良いと思います。 MySQL や、PostgreSQL は、いろいろなツールとの組み合わせで、使われる実績が多く、 ともかく、情報が豊富です。 しかし、それ以上になると、どうでしょう? 「Windows サーバーは、メモリリークを良く起こし不安定だから、 UNIX(Linux)を使いたい」とか、「ユーザーが増えたので、2GB 以上の メモリを使いたい」とか、「信頼性を上げる為に、クラスタやレプリケーション構成 にしたい」「負荷を下げる為に、分散データベース構成にしたい」とか、そうなると、 突如として、技術的にも、金銭的にも、大きなものになりがちです。 昨今の、サーバーのハードウエア価格は、非常に安くなりました。 OS も、Linux のように、安価で、安定性のある環境が手に入ります。 ハイエンドの DBMS 製品だけが、依然割高だと思うのは、私だけでしょうか? Ingres はまさに、そういった用途に使うのに、現状では適していると思います。 発表後も、特に有益な情報が、日本国内で見つからないので、 私の経験も踏まえて、このページを作成し、皆様に、少しでも 興味を持っていただけたらとの思いで、公開する事に致しました。 また、もし、有益な情報等がございましたら、ぜひ、御一報をお願い致します。 ここでは、Redghat 9.0 での Ingres の使い方を中心に、機能の概要を紹介して いきたいと思います。 また、Windows 版も公開されていますので、管理ツールは、Windows 版に付属する GUI ツールも使って、初めての方でも、解り易く解説していきたいと思います。 |
2004/09/20 付けで、WINDOWS バイナリのベータ版が公開されました。 CA の Ingres オープンソースプロジェクト から Linux 版と同様に、ダウンロードできます。 ※ 2004/12/22 付けで、RC 版が公開されています。 ここでは、Windows2000(Pro) 環境にインストールしてみました。 インストール自体は非常に簡単です。 ZIP で圧縮されたファイルを展開し、フォルダーの Install.exe を実行するだけです。 インストールしたユーザー(例えば、"Administrator")が、Ingres の"システム管理者" として登録されます。 ("Administrator" である必要はありません。むしろ、UNIX との相互運用を 考えた場合、"ingres" というユーザーを作成して、特権を与えたほうが良いでしょう) |
Ingres のファイルは、以下から入手できます。 CA の Ingres オープンソースプロジェクト ユーザー登録が必要ですが、無料ですし、ユーザ名と、E-Mail 程度の簡単な情報です。 2004/08 現在では、全ソースと、Linux 用(i386)の RPM ファイルが公開されています。 (2004/11/03 現在は、GA 版になっています) ソースは、tar ボールで、80MB 程度あります。 ここでは、RPM ファイルを使ってインストールする例をご紹介します。 Ingres の製品自体は、Windows、UNIX、OpenVMS 等、多くのプラットフォームに 対応していますし、日本語等のマルチバイトにも対応しています。 ただ、オープンソースで公開するにあたっては、ビルド方法を構築し直しているようで、 Linux、Windows を皮切りに、順次対応していくようです。 また、2004/09 の RC1 版までは、日本語に対応していませんでしたが、 GA 版で、日本語も使えるようになりました。注意)日本語を使いたい方は、ソースからビルドして下さい。 ここで試した限り、RPM では、2004/11/01 の GA 版でも日本語は有効にならないようです。 別に方法があるのかも知れませんが...。まず、個々のファイルを個別にダウンロードするか、 tar ファイルをダウンロードして、展開します。 Ingres のサーバーを実行するアカウントとして、"ingres" というユーザーを 作成しておきます。 RPM のインストール自体は、root 権限で行う必要があります。 RPM のインストールに先立って、ingres-CATOSL スクリプトを実行し、ライセンスの 許諾をする必要があります。# ./ingres-CATOSL次に、一つ一つ RPM をインストールする変わりに、スクリプトを実行する事で、 簡単にインストールできます。 日本語を使う場合は、設定を先に行っておく必要があります。$ export II_TIMEZNE_NAME=JAPAN $ export II_CHARSET=kanjieuc続いて、# ./ingres_express_installメッセージで、正常にインストールされた事を確認します。 |
ここでは、インストール直後の環境設定について解説します。 管理者として、"ingres" アカウントでログインします。インストール直後では、データベースサーバーは既に稼動しているはずです。 RPM 版でインストールした場合、/etc/rc.d/init.d/ingresII というスクリプトが 登録されますので、マシンを再起動した場合でも動作しているはずです。 もし、稼動していないようなら、以下の環境設定を行った後に、 ingstart コマンドでも起動する事が出来ます。まず、ユーザの環境変数の設定を行います。 (ここでは、bash を使う場合を例示します) "ingres" ユーザのログインディレクトリには、既に、.ingIIbash というスクリプトが 作成されているはずです。 これを、ログインスクリプト内で、実行するようにします。$ ls -a $ vi ~/.bash_profilesource .ingIIbash の行を追加します。 これで、Ingres の環境変数と、コマンド等へのパスが設定されます。 データベースを使用する、他のユーザについても、同様に行う必要があります。 では、テストしてみましょう。 何でも良いのですが、ここでは、"sql" という、「対話型 SQL モニタ」を 起動してみます。 |
インストール後に、使用するにあたって、最初にデータベースを作成する必要があります。インストール時に作成されている "iidbdb" 等のデータベースは、システム用で、 通常、直接更新する事はありません。 Ingres では、"データベース"は、複数作成できます。 ただし、同じサーバー上であっても、異なるデータベースのデータを、 同じセッション(接続)ではアクセス出来無いので注意して下さい。 例えば、部門ごとにデータベースを分けるというような使い方は、 共通なデータの参照が困難になるので、なるべく避けたほうが良いです。Windows 版には、ビジュアルツールが付いていますので、 Ingres が初めての人でも、比較的簡単に操作できます。 Linux 上で動作しているサーバーも、操作出来ます。 コマンドで行いたい場合は、この章の終りを参照して下さい。 データベースの作成は、「Visual DBA」というツールを使います。 「Nodes」を展開して、「{local}」を選択し、「Connect/DOM」を実行します。Linux 上のサーバー、または、別のホストで稼動している、 Ingres を操作する場合は、「vnode」を登録する必要があります。 登録後、「local」の代わりに vnode 名 を選択します。 |
データベース内に、テーブルを作成してみましょう。 Windows の「Visual DBA」を使ってもテーブルの作成は出来ますが、 ここでは、より一般的に、SQL ツールを使って、SQL 文で行う方法を紹介します。 Ingres では、コンソール上で、データベースへアクセスし、SQL 文を実行する ツールには、2つあります。 一つは、「sql」コマンド(「sql モニタ」)で、行モードの(履歴編集機能が無い)の ツールです。 sql コマンドは、SQL 文をファイルに作成しておいて、リダイレクトを利用した、 実行に便利です。 もう一つは、「isql」コマンドで、「フォーム」ベースの全画面型のツールです。 isql では、行編集だけでなく、履歴の編集、画面のスクロール等が可能です。 「全画面」と言っても、今では、Window による、GUI が多い中で、 今更、"文字ベース"というのも何ですが、ちょっとした用途には、お手軽で、便利です。 Linux では、「フォーム」ベースのツールについては、設定が必要です。 ここでは、sql コマンドを使ってみましょう。$ sql testdb continue * create table test_t (i1 integer, a1 varchar(40)); * insert into test_t values(1,'abc'); * insert into test_t values(2,'123'); * insert into test_t values(3,'漢字'); * select * from test_t; * commit; * \g * \q +-------------+----------------------------------------+ |i1 |a1 | +-------------+----------------------------------------+ | 1|abc | | 2|123 | | 3|漢字 | +-------------+----------------------------------------+「sql モニタ」の内部コマンドは、バックスラッシュ(日本では、"\")文字で始まります。 簡単に、コマンドを例示します。 (ファイルに作成し、リダイレクト出来ますので、覚えるのは、この程度で十分と思います) \g 実行 \q 終了Ingres と同じ源流をもつ、PosgreSQL でも、isql コマンドは、同じコマンドが使えます。 最近では、Oracle のように、";" での実行を好むようです。 |
Ingres は、GUI ツールより、CUI ツールの歴史の長いデータベースです。 その中で、ユーザーインターフェースを容易にする方法として、 「フォーム」ベースのインターフェースが使われるようになりました。 今でも、多くのユーティリティが、この共通のインターフェースを使って 構築されています。「フォーム」は、"curses" と同様な、画面ライブラリです。 FRS(Form Runtime System) と呼ばれ、ユーティリティに限らず、 ユーザー自身が、これを使って、アプリケーションを開発する事もできます。最近では、Windows で動く GUI の管理ツールもありますが、 UNIX 上では、X-Windows が不要なので、上級者の場合、このほうが便利な 場合もあります。 具体的な操作ですが、X-Windows 上の ターミナル(Kterm 等)より、 カスタマイズの容易さから、別途、Windows マシンから、「TeraTerm」を 使ったほうが、使い易いでしょう。 以後の説明は、TeraTerm を使っている事を前提とします。 isql コマンドを実行してみましょう。$ isql testdbコマンドは、画面下の一行にガイダンスが表示されています。
|
まず、最初に、Ingres の「ユーザー認証」の考え方について述べておきます。 Ingres では、「SQL Server」や「Oracle」等と違い、基本的に 「データベース認証」という考え方はありません。 (IMB の「DB2」に近いかもしれません) つまり、Ingres で独自に、ユーザー名とパスワードを登録して、OS の認証と無関係に、 データベースを参照させる、という事はありません。 あくまで、OS の認証と連動しています。 ですので、ユーザー登録を行う場合は、サーバー OS 上で、ユーザーが登録されている 事が前提になります。クライアントから接続する場合にも同様です。 ただし「インストールパスワード」を設定する事で、サーバーの認証ではなく、 クライアント側の認証だけで済ます事も出来ます。 (一種の"信頼関係"を結ぶと考えると良いと思います) この場合、クライアントマシンが適切に運用されていないと、データベース全体に セキュリティ上の大きな穴が空くことになるので、注意が必要です。ユーザーの登録は、accessdb ユーティリティや、「Visual DBA」を使えば、 対話形式で、簡単に登録出来ます。 ここでは、あえて、Ingres のユーザー登録の仕組みを知る上で、 SQL コマンドを使ってみます。 大量のユーザー登録や、ユーザー登録を自動化する場合に便利です。 新しいユーザーを登録する場合、iidbdb データベースに接続して行います。 iidbdb は、「データベースのデータベース」と思っていただければ良いと思います。 (「SQL Server」で言えば、ちょうど、"master" データベースにあたります) Ingres のユーザーは、"接続"出来るユーザーの登録と、データベースごとの アクセス権限とは別になっています。(これも、「SQL Server」と似ています) 次は、ユーザーの作成と、そのユーザーが、testdb にアクセス出来るようにする例です。$ sql iidbdb * create user ユーザー名; * grant all on database testdb to ユーザー名; * \g * \qパスワードを設定していない(できない)点に注意して下さい。 ユーザー名は、あくまで、サーバー OS 上で認証されるユーザーです。 なお、サーバー OS 上に登録されていないユーザーも登録はできます。 (ネットワーク経由では、「インストールパスワード」を使えば、 使用可能な場合があります) この場合、そのサーバー上(Localhost)から、そのユーザーでアクセスする事は 出来ない訳ですが、特権ユーザーだけは、Ingres のデータベース 接続時のオプションで、ユーザーを明示して接続する事が出来ます。 例えば、$ isql -uユーザー名これを良く「成り代わり」と読んでいます。 これには、「Security Administrator」特権が必要になります。 (かなり強力なので、通常は付与しません) 既存の登録されたユーザーを見る場合、iidbdb の iiusers システムカタログを 参照できます。$ sql iidbdb * select * from iiusers * \g * \q |
Ingres のテーブルは、データベースの接続を許可されたユーザーは、 誰でも作成出来ます。 ただし、作成されたテーブルは、そのロールの下でのみ参照可能です。 例えば、ユーザー baba で作成した場青、 create table test_t ( i1 integer ) このテーブルは、baba.test_t というテーブルになります。 自分で参照する場合は、test_t だけでも参照できます。 さらに、これを、他のユーザーに参照させる事が出来ます。grant all on baba.test_t to public他ユーザーは、この場合、必ず、baba.test_t でアクセスする必要があります。synonym(別名) も作成出来ますが、Ingres の synonym は、oracle で言う synonym とは、かなり異なります。 名前の通り、別名をつけるだけで、あくまで、"ロール名.synonym名" が定義されるだけです。 Ingres では、synonym を使う場面は少ないでしょう。データベース所有者が作成するテーブルだけは、事情が異なります。 この場合、上記と同様に、grant まで与えると、ユーザーは、 ロール名を省略して、テーブルにアクセス出来ます。 また、その場合、もし同じ名前で、自分が作成たテーブルがある場合は、 自分の作成したテーブルの方が優先されます。 明示的にテーブルを参照したい場合は、ロール名を付ます。これらの参照の仕組みは、SQL Server と良く似ています。よって、共通で参照するテーブルは、データベース管理者が作成すると都合が良いでしょう。 なお、データベース管理者を、"ingres" のままにしておくと、権限が強すぎる場合があります。 Ingres システムの管理者と、各データベース管理者を分離したい場合は、 各データベースごとに、管理者を分ける事が出来ます。Ingres は、「成り代わりオプション」が使えるので、各データベースへのアクセス権限を 間接的に持っている事になります。 逆に言えば、データベース管理者に、安易に「成り代わり権限」を与えてはなりません。 |
Ingres のテーブルやインデックスには、データがディスク上に 格納される、記憶構造があります。 サポートしている形式は、 heap、hash、isam、btree、rtree があります。 テーブルは全て、"heap" になっています。Ingres 1.2 までは、テーブルにも上記の構造が適用されましたが、 現在は、無いようです。 (代わりに、"主キー"を指定した場合、その構造のインデックスが作成されます)テーブルの参照は、SQL 文で、 help table テーブル名 で、参照できます。 主な特徴として、 hash は、主にキーアクセスしかしないデータに向いています。 isam は、データの追加や更新が、余り無いようなデータに向きます。 btreeは、データの追加や更新が起こった場合でも、索引がある程度、最適になるよう保たれます。 rtreeは、(私は、正直良くわかりませ) GIS 等の図形のように、複数の範囲で対象を絞り込みを行う用途に 適しているようです。 という事で、通常は、btree を指定するのが無難だと思います。 ・ページサイズ データは、ページ単位で管理されます。 古くは、2K バイトでしたが、現在は、2K 〜 64K まで可変です。 デフォルトでは、8K バイトまでは、自動で行われるようです。 SQL Server 2000 が、8KB である事を考えると、8K、16K あたりが適当ではないでしょうか。 パフォーマンス的な要素はともかく、ページサイズが直接影響するのは、レコードに実際に 格納できるデータの合計が、ページサイズを越えられません。(BLOB 等特殊な型は除く) 後で、変更する事も可能ですが、事前に解っていれば、作成時に指定しておいたほうが無難です。 2048、2096、8192、16384、32468、65536 が指定可能です。 例) create table test_t ( i1 integer not null primary key with structure = btree ) with page_size = 8192char、varchar 型は、1〜32000 まで長さを指定出来ます。 ページサイズは、これより小さくてもかまいませんが、実際にデータを格納できる大きさは、 ページサイズによって制限されますので、大きめにしておいたほうが良いでしょう。 なお、cbf コマンドで、予め、データベースのデフォルトを変えておくのも良いでしょう。16K 以上のページサイズを指定する為には、$II_SYSTEM/ingres/files/cinfig.dat で、 サーバーのメモリサイズを変更しておく必要があります。 具体的には、 ii.nfssv01.dbms.private.*.cache.p16k_status: OFF -> ON のように変更するだけです。テーブルの構造は、作成後、SQL の modify コマンドで変更出来ますが、 データを全て移す為の時間や、スペースが必要ですので、百万レコードを超えるような、 データ量が多い場合は、注意して下さい。 |
コマンドラインでの管理が苦手な方には、Windows で動く、VisualDBA ツール によるリモート管理が便利かもしれません。 リモートのサーバーに接続する為には、まず「vnode」の登録が必要です。 「VisualDBA」を起動し、「Nodes」にフォーカスを当て、メニューの「Node」 「Add...」を選択します。 |
以下に、Ingres が使用できるデータ型を示します。
select date('today')
1-aug-2004
のような文字列で返ります。
$ export II_DATE_FORMAT=iso4では、 20040801という結果が返ります。 残念ながら、日本でお馴染みの、"2004/08/01" のようなスラッシュの付いた フォーマットは無いようです。 なお、入力に関しても、この書式が有効です。("US" 形式のものもは常に入力時も受け付けます) 例えば、II_DATE_FORMAT=iso4 なら、
select date('20040801')
select date('1-oct-2004')
でも同様に受け付けられます。
さて、日付については、歴史のある DBMS は、多かれ少なかれ、いずれも過去の仕様を引きずっている
ものです。
そのせいか、ANSI SQL 標準に照らすと、SQL Server にしても、Oracle にしても、
かなり、おかしなものがありますが、Ingres は特にそれが強いようです。
利点もあるのですが、さすがに、標準に準拠しないのは、ややマイナス面があります。
Ingres には、時間型(timestamp) がありません。
date 型がその役割ももっています。
また、Ingres の日付型は、"+" と、"-" による演算が可能です。
例えば、次のような SQL を実行してみましょう。
select date('today')+date('1 days')
で、明日の日付が返ります。
select date('now')-date('today')
17 hrs 5 mins 27 secs
というように、この場合は、時間文字列が返ります。
このように、日付を「演算子」で計算できるところが、恐らく、こういった仕様に なったのだろうと想像します。 日付と時間を計算する四則演算関数を幾つも揃えるより、スマートだと考えたのでしょう。 もっとも、そのおかげだろうと思いますが、今だに、「ユーザー定義関数」機能が 無いのは、実装が面倒がからだと想像します。さらに、日付に「空文字列」が許される という特徴を持っています。 これは、NULL とは別に扱われます。
日付の内部形式は、単純な、ある日時からの経過時間を持っているのではなく、
年、月、日、秒数(ms)で管理されています。
また、インターバル、日時、空白かの識別フラグを持っています。
(日付の内部形式は、アプリケーションの「動的 SQL」で取得可能です)
月と秒を別に持っている事で、次の結果が、当年が閏年か否かにかかわらず、常に正しくなります。
日付にスペースが許される理由は良くわかりませんが、NULL 不許可(not null)で運用する
場合には、更新されたか否かの識別が出来ますので、便利です。
例えば、日付の検索で、変数に、実行時に何が入るかわからない場合でも、
select * from tableA where update_date_column > ?
で済みます。何も入力されていない"日"を探す場合、"is null" と場合分けする
必要が無いので、プログラムが簡単になります。
日付の空文字は、「いかなる日付、時間より小さい」と定義されています。
経験上、Ingres でテーブルを定義する際、全て、not null にしておくと、
後で、プログラムは楽になります。(null をいちいち判断しなくて済む)
金額型については、日本の場合、"\" が付く以外は、あまり使う意味が
無いかもしれません。
小数以下をもつ通貨の場合、使うメリットが多少ありますが、
逆にそうでないと、long integer に比べ、精度桁が少ないのと、演算時に、誤差を持ちます。
(内部表現があくまで、8 byte で、小数以下2桁をもつ)
money 型の表示を "$"->"\"に変える場合は、
export II_MONEY_FORMAT='L:\'
export II_MONEY_PREC=0
とします。
・型変換規則
これも、他の DBMS とかなり違います。
Ingres には、SQL の convert 文がありません。
明示的に型変換を行う関数として、型と同じ名前の関数があります。
例えば、数字を文字に変える場合、
select varchar(123)
の様に出来ます。
一方、暗黙的な型変換が行われるのも特徴です。例えば、
select date('today') + '1 day'
普通の DBMS で考えれば、日付と文字の演算は"無効"ですが、
Ingres では、日付と文字の演算は、文字が日付に型変換される規則になっています。
これらは、いろいろな場合に適用されます。
select 123 + '456'
\579
なぜ、money 型になるかと言えば、文字と数値の演算は、文字列は money に変換され、
money 型と他の数値型では、money 型が優先されます。
※ あまり便利だとは思いません。型は、関数で、明示したほうが無難です。
|
Ingres のロック機構は、SQL Server や、DB2 と似ています。
一応、行ロックには対応していますが、ロックリストで管理する点は
同じです。
当然、ロックのエスカレーション(ページや、テーブルロックに上がる)が起こり得ます。
ロックの競合を避ける為にも、その仕組みを知っておく事が大事です。
まず、トランザクションを処理する原則は、速やかに、ロックを解放する事です。
これは、どのようなデータベースを使っていても同じだと思います。
まれに、座席の予約システムのように、競合があるとまずい場合にのみ、
ロックをかけたまま、オペレーションを待つ、という処理が想定できますが、
その用途には、この程度の行ロック機構で、十分かと思われます。
Ingres のロック制御は、「ロックレベル」と、「読取りロックモード」の2つの
組み合わせになります。
また、ロックタイムアウトもロックを制御する要素です。
ロックレベルは、3種類あります。
row 行単位
page ページ単位
table テーブル単位
session セッションのデフォルト
system システムのデフォルト
読取りロックモードは、3種類あります。
nolock ロックをかけない
shared 共有ロック
exclusive 排他ロック
session セッションのデフォルト
system システムのデフォルト
Ingres でのロック制御は、Set コマンドで、トランザクションでのモードを
指定します。
(対して、Oracle や、SQL Server では、select 文にロックオプションを指定します)
デフォルトでは、page 単位の shared ロックになります。
(ANSI SQL の「トランザクション分離レベル」では READ COMMITTEDです)
※ ANSI SQL を考慮して、set transaction コマンドがありますが、上記の指定の
ほうが細かく制御できます。
それ以外では、locktimeout と、maxlocks を指定できます。
locktimeout は、一定時間(秒数)待った場合、タイムアウトエラーで、制御が
アプリケーションに戻ります。長い時間ロックが掛かる場合に有効です。
maxlocks は、ロックエスカレーションをコントロールする事が出来ます。
(ロック資源は、システムでグローバルですので、あまり大きくすると、不足します)
・ダーティリード
ANSI SQL の分離レベルでは、「uncommitted read」での処理に当たります。
よく言われる事ですが、Ingres、それに、SQL Server や、DB2 等では、デフォルトでは、
読取りロックが shared(共有ロック) の為、ロックが掛かっていると、リストや、検索だけの処理でも
待たされる場合があります。
Oracle や、PostgreSQL、InterBase 等は、仕組み上、デフォルトで、ロックを待たずに処理が行えます。
利点である事は確かですが、同様な事は、Ingres、DB2、SQL Server でも、
ダーティリード(nolock モード)を使えば可能です。
「ダーティ」という言葉は、まだ commit されていないデータを読んでしまうので、
整合性が取れていかなったり、取り消される(rollback)かもしれないデータまで読んでしまうからです。
ロック待ちが生じないデータベースの場合、逆に、トランザクションが開始された後に
commit されたデータは読めません。
実のところ、何かを集計する際には、過去の更新日付等を条件に入れる場合が多く、
また、検索でも、後で取り消される(rollback)事が問題になるようなケースは
まれだと思います。
ですので、個人的には、ダーティリードを多様してもかまわないと思っているのですが。
(当然、更新においては、注意が必要な事は、言うまでもありません)
Ingres で便利だと思うのは、Set コマンドで、select 文の外で指定できる点です。
|
Ingres でのアプリケーション開発には、ODBC や、JDBC といった、汎用的な インターフェースを用いる方法と、ABF(4GL) や、ICE(Webコンテナ) のような、 Ingres 独自の開発環境を使う方法があります。 Ingres では、クライアントと通信する為の手段として、Oracle の "Net8"、 SQL Server の "TDS" に相当するもとして、"Ingres/NET" という機能があります。 クライアントから、リモートで使う場合は、先に、クライアント側に、Ingres/NET を インストールし、"vnode 名" 等の設定をしておく必要があります。 (JDBC、.NET の場合は、不用です) 汎用的なインターフェースとして、以下のものがサポートされています。
例えば、「SQL Reference Guide」では、ESQL の構文が併記されている事からも うかがえます。 API(CLI) が公開されたのも、つい最近の、IngresII からだったと思います。クライアントからの接続は、データベース名に、vnode 名を 付加するだけで、サーバーにアクセス出来ます。 vnode名::データベース名 ESQL/C での開発の詳細は、別の章で詳しく解説します。 Oracle で言う、"OCI" にあたる、CLI(Call Level Interface) も 用意されていますが、Ingres の ESQL/C はかなり強力なので、 まず使う必要は無いと思います。 ODBC Ingres の ODBC ドライバは、内部で、CLI(Call Level Interface) を使います。 Windows および、Linux 上でも使用する事が出来ます。 (このあたりは、特定のプラットフォームしかサポートしない、 Oracle や、Microsoft より優れています) Windows 環境での設定例を以下に載せておきます。
※ 2004/12/22 のバージョンでは、日本語がうまく使えません。 不具合の個所は、私が報告済みですので、次のバージョンでは使えるはずです。Linux の場合は、別途、「ODBC ドライバマネジャ」が必要です。 ここでは、「unixODBC」を使った例を示します。 ※ unixODBC のインストール方法については、別途、お調べ下さい。 Ingres の ODBC ドライバは、 $II_SYSTEM/ingres/lib/libiodbcdriver.1.so です。 次に示すのは、ODBC の「データソース名」を、unixODBC の「システム DSN」に登録する例です。 "ingres" という名前のデータソースを登録します。 vnode 名は、"server" に指定するか、"server" は指定せず、"database" に、 "vnode名::データベース名" を指定するか、どちらでもかまいません。 $ vi /usr/local/etc/odbc.ini※ RPM 等で unixODBC をインストールした場合、パスが異なる場合があります。 [ODBC Data Sources] ingres = ingres ODBC Driver [ingres] driver=/opt/CA/IngresII/ingres/lib/libiiodbcdriver.1.so server=vnodename database=testdbテストは、unixODBC 付属の isql ユーティリティを使います。 なお、2004.08.04 の RPM 版は、サポート言語が、"English" だけだったので、 II_LANGUAGE を下記のように設定しておかないとエラーになりましたが、 2004.09.20 版では、修正されているようです。 $ export II_LANGUAGE=English $ /usr/local/bin/isql -v ingres※ Ingres の isql ユーティリティと同じ名前なので、フルパスで指定します。 ユーザー名とパスワードを指定すれば、そのユーザーでも接続できます。 $ /usr/local/bin/isql -v ingres username password JDBC Java は、サーバー側で、JDBC 用プロセス(iigcd)が別途動く事から、 Ingres/NET(iigcc) とは、仕組みが異なります。 現状では、JDBC は、Type-3 のドライバに位置付けられるようです。 JDBC での開発の詳細は、別の章で詳しく解説します。 .NET プロバイダ Microsoft の .NET Framework に対応した、ネイティブなモジュールです。 サーバー側では、JDBC と共用のプロセス(iigcd)と通信を行います。 Ingres/NET(iigcc) とは、仕組みが異なります。 .NET での開発の詳細は、機会があれば取上げたいと思います。 |
データベースにアプリケーション開発環境があるのは、今では主流ではありません。 Ingres では、過去の歴史的な経緯で、現在でも、独自の開発環境がいくつか残っています。 特に、FRS(Form Runtime System) という画面制御ライブラリを使ったものは、 現在でも、Ingres のユーティリティとして使われています。 「Ingres/4GL」「QUEL」「Reportwriter」「ice」があります。 「QUEL」は、SQL 言語が主流になる前の、独自の照会言語ですので、過去の遺物です。 まず使う事は無いと思います。(私も使った事はあいません) 「4GL」は、その名の通り、4GL 全盛時代の、これも遺物と言って良いと思います。 言語製品ですが、「ABF」(Application By Form) という IDE(開発環境)を使います。 クライアントに、主に、Telnet を使う、キャラクタ(文字)ベースの画面しか使えないので、 まず使われないでしょう。私は仕事柄、今も 4GL と付き合っていますが、生産性は、非常に高いですし、 C 言語にコンパイルされ、実行イメージになるので、高速です。 しかし、ユーザーインターフェース(今では見向きもされない、文字ベース)が言語仕様と、 一緒になっているところが、良くありません。「ICE」は使った事がありませんが、Web で使うスクリプト言語環境 (アプリケーションサーバ)のようです。 「ReportWriter」は、レポート作成用の簡易言語です。 日本人好みの罫線機能はありません。ReportWriter は、データベース中に、中間言語を格納するインタプリタなので、 OS 非依存とは言え、実行速度は、非常に遅いです。「FRS」(Form Runtime System) は、言語ではなく、curses のような画面制御ライブラリです。 また、「VIFRED」というフォーム(画面)を設計する為のツールがあります。 フォームは、4GL や、ESQL/C から共通で使う事が出来ます。 Ingres のフォームベースのユーティリティもこの FRS を使って作られています。 |
Ingres のメインの言語である、ESQL/C について解説します。 ESQL/C 自体の仕様は、どの DBMS でも似たようなものですから、 ここでは、ビルド方法を中心に解説します。 まず、簡単なプログラムを書いてみましょう。 ファイルの拡張子は、".sc" が標準です。 ソースは、Linux でも、Windows でも、VMS でも同じです。 ここでは、Linux を例に、単純な、接続と切断の例をとりあげます。$ vi test.sc #includeといった具合になります。 Windows の場合は、Visual C++ の例です。 lib 環境変数に、%II_SYSTEM%\lib を追加しておきます。 |
フォームベースツールがあります。 ipm ユーティリティ ・サーバープロセスの状態監視。 ・ロック状態の監視 ・ログファイルの監視 が、行えます。 iimonitor ユーティリティ DBMS サーバーのセッション(スレッド)を監視します。 サーバーのシャットダウンも可能です。(起動は出来ない) ユーザーセッションの一時停止(suspend/resume)、 削除(remove) が行えます。 プロセス中のスレッドは、OS から制御できないので、 特定のデータベースセッションが暴走(例えば、異常に重い実行)している 場合に、このツールで、強制終了できます。 サーバーのシャットダウンは、通常、ingstop コマンドで行います。 iimonitor を使うのは、マルチサーバー(プロセス)構成で運用している場合に、 一方のサーバーだけを止める事が出来ます。 全てのサーバーのエラーログは、 $II_SYSTEM/ingres/files/error.log で、参照できます。 |
auditdb コマンドで、ジャーナルから、更新トランザクションのレポートを抽出できます。 |
|
|
マルチスレッド・マルチサーバーモデル。 Ingres の特徴の一つです。 マルチスレッドサーバーは、良くあります。 Ingres では、必要に応じて、データベースサーバープロセスを複数起動できます。 Oracle や、SQL Server のような、「インスタンス」とは異なります。 シングル CPU での運用では、あまりメリットはありませんが、 マルチ CPU 構成の場合、OS によっては、マルチプロセスサーバー構成が 有効に働く場合があります。 「インスタンス」と異なるのは、同じデータベース(例えば、testdb)を、 複数のデータベースサーバーが共通にアクセス出来ます。 もっと言えば、サーバーごとに、どのデータベースをアクセス出来るかを設定 出来ます。 Ingres には、ネームサーバーというプロセスがあります。 ユーザーがデータベースサーバーに接続する際には、必ず、このサーバーを 経由します。 データベースプロセスが1つの場合、あまり感じませんが、 複数プロセスの場合、ネームサーバーがセッションの振り分けを行います。 (単純なセッション数による割り振りのように思えます) iinamu コマンドで、一時的に、特定のサーバーを外す事が出来ます。 |