(57)【要約】【課題】  冗長性を含む大量なデータを圧縮して扱う場合にも高速に圧縮伸張できる圧縮方法を提供する。【解決手段】  ユーザ表の列ごとに、ユーザ109による圧縮の有無の指定を受け付け、圧縮有りと指定された各列に関して、列名、表名、を圧縮値管理表106に保存し、前ユーザ表の各フィールドのデータのうち圧縮値管理表106に圧縮有りと指定された列のフィールドのデータのみ圧縮処理を施してストレージ103のユーザデータ領域104で管理する。【選択図】図１
2010026884.tif 000002
【特許請求の範囲】
【請求項１】
複数項目の値の組が繰り返し現れるデータに対し、ストレージ上の圧縮値管理表にもとづいたデータ圧縮処理を行って管理を行うデータ管理方法であって
前記データ中の項目ごとに、圧縮の有無のユーザによる指定を受け付け、
圧縮有りと指定された各項目に関して、該項目の識別子及び該項目を含むデータの識別子を前記圧縮値管理表に保存し、
前記データのうち、前記項目の識別子で特定される値にのみ圧縮処理を施して前記ストレージ上で管理するデータ圧縮処理を伴うデータ管理方法。
【請求項２】
複数項目の値の組が繰り返し現れるデータに対し、ストレージ上の圧縮値管理表にもとづいたデータ圧縮処理を行って管理を行うデータ管理方法であって
前記データ中の項目ごとに、圧縮の有無及び圧縮単位のユーザによる指定を受け付け、
圧縮有りと指定された各項目に関して、該項目の識別子、該項目を含むデータの識別子、及び圧縮単位を前記圧縮値管理表に保存し、
前記データのうち、前記項目の識別子で特定されるデータのみ指定された圧縮単位の範囲内で圧縮処理を施して前記ストレージ上で管理するデータ圧縮処理を伴うデータ管理方法。
【請求項３】
前記データに値の組を挿入する要求を受けた際に、前記圧縮値管理表を参照して前記値の組の各項目について圧縮有りの項目か否かを判定し、圧縮有りの場合は前記圧縮値管理表に保存された該項目の圧縮単位の範囲内の値を前記ストレージから読み込んでデータ圧縮処理を実行してその結果を挿入し、否の場合は要求された値のまま挿入することを特徴とする請求項２記載のデータ圧縮処理を伴うデータ管理方法。
【請求項４】
前記データの全部若しくは一部を読み出す要求を受けた場合に、前記圧縮値管理表を参照して読み出し対象の値が圧縮有りの項目か否かを判定し、圧縮有りの場合は前記圧縮値管理表に保存された該項目の圧縮単位の範囲内の値を前記ストレージから読み込んでデータ伸張処理を行うことを特徴とする請求項２記載のデータ圧縮処理を伴うデータ管理方法。
【請求項５】
前記データの全部若しくは一部を削除する要求を受けた場合に、前記圧縮値管理表を参照して削除が要求されたデータに圧縮対象項目の値が含まれるか否かを判定する手順、及び、圧縮対象項目の値が含まれる場合は、圧縮値に特有のデータ削除処理を行う手順を更に有する請求項２記載のデータ管理方法。
【請求項６】
前記圧縮処理は圧縮時に圧縮単位ごとの辞書を作成して圧縮単位の先頭に該辞書を保存する圧縮方式であり、前記圧縮値に特有のデータ削除処理は、圧縮単位の先頭から、圧縮値を伸張し、削除対象データであれば消去する処理を繰り返す手順、当該圧縮単位の辞書に劣化フラグを付す手順を含むことを特徴とする請求項５記載のデータ管理方法。
【請求項７】
前記圧縮処理は圧縮時に作成した辞書の保存の処理を伴わない圧縮方式であり、前記圧縮値に特有のデータ削除処理は、圧縮単位の先頭から、圧縮値を伸張し、削除対象データであれば当該データを前記ストレージから消去する代わりに当該データ削除フラグを付すことを繰り返す手順を含むことを特徴とする請求項５記載のデータ管理方法。
【請求項８】
前記圧縮値管理表には圧縮有りと指定された各項目に関して該項目の識別子、該項目を含むデータの識別子、及び圧縮単位に加えて圧縮方法の指定を保存し、前記データのうち、前記項目の識別子で特定されるデータのみ指定された圧縮単位の範囲内で指定された圧縮方法で圧縮処理を施して前記ストレージ上で管理する請求項２記載のデータ圧縮処理を伴うデータ管理方法。
【請求項９】
ストレージ上で複数の頁にまたがるユーザ表を保存して管理するデータ圧縮を伴うデータ管理方法であり、
前記ユーザ表の列ごとに、圧縮の有無、圧縮単位のユーザによる指定を受け付け、
圧縮有りと指定された各列に関して、列名、前記ユーザ表の表名、及び圧縮単位を圧縮値管理表に保存し、
前記ユーザ表の各フィールドのデータのうち前記圧縮値管理表に圧縮有りと指定されら列のフィールドのデータのみを指定された圧縮単位でカラムワイズ圧縮して管理することを特徴とするデータ圧縮処理を伴うデータ管理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、冗長要素を多く含む大量なデータを高速に圧縮伸張するデータ管理方法に関するものである。
【背景技術】
【０００２】
まず以下の文中で用いる用語の定義を行う。
【０００３】
行、列、フィールド：図2に示すとおり、表201を構成する要素として行203、列204、フィールド202という用語を用いる。
【０００４】
第一正規形：RDBMSの正規化のレベルの1つ。行を構成するフィールドがスカラ値である、すなわち集合や配列を含まないものと定義される。
続いて背景技術の詳細を記す。
【０００５】
携帯機器の高機能化に伴い、扱うデータも大量になり、また検索パターンも多様化しており、機器組込み環境においてもDBMSが用いられるようになってきた。特に従来のサーバシステムで用いられてきたRDBMSは既に問合せ言語が標準化されていることからAPIの習得コストが低いとされ、注目されている。
【０００６】
機器組込み環境ではハードウエア低コスト化の要求が強く、サーバシステム環境よりもリソースの制約が厳しい。そのためRDBMSに対してもストレージ使用量とメモリ使用量は小さいほど良いという要求がある。しかし一方で機器組込み開発者はDBのライトユーザが多く、また更新不整合など考慮する必要もあまりないため第一正規形スキーマを用いた運用が多く、結果として冗長性が多い。そこでデータベースを圧縮する機能にニーズがある。
【０００７】
データベース圧縮の従来技術の多くは更新に比べ参照の頻度が高いデータウェアハウス向けの技術である。その中でも、行単位にLZ符号のような圧縮符号を適用するデータ圧縮技術が代表的であり、非特許文献１に開示される。この方式では圧縮伸張処理の際に余計なストレージI/Oが発生しないため高速である反面、元データが小さいため圧縮率も上がりにくい。さらに第一正規形スキーマに限らず、データベースの冗長性は行方向には少なく列方向に多い傾向があるため、行単位圧縮は余計に圧縮率が上がりにくい。
【０００８】
また、データベース圧縮の他の代表的な手法にcolumn-wise圧縮があり、同じく非特許文献１に開示される。これはデータベースの冗長性は列方向に出やすいことを考慮し、列方向にLZ符号のような圧縮手法を適用する技術である。このcolumn-wise圧縮の実装方式として提案されたものに、表全体を列ごとに分割して圧縮するものがあるが、大量のデータからなる表を圧縮する場合には圧縮率が良い半面、圧縮伸張処理の際には辞書を読み込むためのストレージI/Oが発生するため低速である。さらに削除 (delete) や更新 (update) を行う場合のコストが高く非常に低速になるという欠点がある。
【０００９】
これに対し非特許文献２に記載されたデータベース圧縮方法では、単一ページ内に含まれるフィールドが重複した場合にポインタで置き換えることによって圧縮を行う。この方法では、圧縮伸張の際に余計なストレージI/Oが発生しないため高速である。その反面、フィールドが完全に一致した場合にしか圧縮の対象とならないため、メモやコメントを保存する自由記述の文字列型に対して圧縮の効果を得にくい。
【００１０】
【非特許文献１】”Data Compression Support in Databases”， Balakrishna R. Iyer， VLDB94
【非特許文献２】”Data Compression in Oracle”， Meikel Poessv， VLDB2003
【発明の開示】
【発明が解決しようとする課題】
【００１１】
そこで、本発明では、冗長性を含む大量なデータを圧縮して扱う場合にも高速に圧縮伸張できる圧縮方法を提供することを課題とする。
【課題を解決するための手段】
【００１２】
本発明は、特に第一正規形スキーマのデータにおいて列方向に冗長性が多いことに着目し、冗長列をユーザ指定可能とする。
【００１３】
本明細書で開示する代表的な実施例におけるデータ管理方法の要点をまとめると、複数項目の値の組が繰り返し現れるデータに対し、ストレージ上の圧縮値管理表にもとづいたデータ圧縮処理を行って管理を行うデータ管理方法であって、前記データ中の項目ごとに、圧縮の有無のユーザによる指定を受け付け、圧縮有りと指定された各項目に関して、該項目の識別子及び該項目を含むデータの識別子を前記圧縮値管理表に保存し、前記データのうち、前記項目の識別子で特定される値にのみ圧縮処理を施して前記ストレージ上で管理するというものである。
【００１４】
リレーショナルデータベース分野の用語に言い換えると、管理対象は表であり、上記複数項目の値の組とは表を構成する行であり、その各項目は表を構成する列であり、各項目の値はフィールドである。すなわち、ユーザ表の列ごとに、ユーザによる圧縮の有無の指定を受け付け、圧縮有りと指定された各列に関して、列名、表名、を圧縮値管理表に保存し、前記ユーザ表の各フィールドのデータのうち前記圧縮値管理表に圧縮有りと指定された列のフィールドのデータのみ圧縮処理を施してストレージ上で管理する。
【００１５】
開示する別の代表的実施例におけるデータ管理方法では、さらに高速に圧縮伸張可能となるように圧縮単位を導入する。
【発明の効果】
【００１６】
本発明のデータ管理方式は、ユーザが指定した列のみ、圧縮単位ごとに列方向圧縮を行うため、演算量とストレージI/O回数が共に少なく、高速かつ高い圧縮率を実現できるという利点がある。
【実施例１】
【００１７】
本実施例のコンピュータシステムでは表や構造体の集合といった、複数項目の値の組が繰り返し現れるデータを管理対象としてストレージ上で管理する。とくに、その各組の中でユーザが指定した1つまたは複数の項目の値にのみデータ圧縮処理を施してストレージに保存し、管理する。
【００１８】
図１は本実施例のコンピュータシステムの構成を示す。コンピュータシステム101はCPU１１２、主記憶装置１１３、及びストレージ１０３を主な構成要素とする。主記憶装置１１３の上には、図示したストレージ１０３、もしくは他のストレージ装置から読み出されたオペレーティングシステム１１１が主記憶装置１１３の上で展開される。さらにリレーショナルデータベース実行部１０２、及びＡＰ実行部１１０が主記憶装置１１３の上で展開される。オペレーティングシステム１１１の制御のもとでCPU１１２がリレーショナルデータベース実行部、ＡＰ実行部それぞれの処理を実行し、これによりデータ管理の機能、アプリケーションの機能を果たす。
【００１９】
ストレージ１０３の実現例としてハードディスクドライブ、半導体メモリ、テープドライブなどが挙げられる。ストレージ１０３にはユーザデータ領域１０４と管理情報領域１０５が設けられる。管理情報領域１０４にはリレーショナルデータベース実行部１０２によるデータ管理に使用する管理情報が格納、管理される。ここでは管理情報は表形式で管理する。本実施例に特有なのは、管理情報領域１０４に格納される管理情報に、データ圧縮・伸張処理に用い圧縮地管理表１０６が含まれる点である。すなわちストレージ上に圧縮値管理表を持つ。圧縮値管理表１０６の詳細は後述する。ユーザデータ領域１０４には上記のデータ管理の管理対象であり、またデータ圧縮、伸張の対象である表が格納される。区別のためにこれらの管理対象の表をユーザ表と呼ぶ。
図２に一般的なユーザ表の構成を示す。ユーザ表２０１は複数の行２０３及び列２０４で構成され、ある行とある列で特定される要素をフィールド２０２と呼ぶ。
【００２０】
リレーショナルデータベース実行部１０８には問合せ処理部107と圧縮値定義部108が含まれる。問合せ処理部107はユーザ109からの問合せやデータ定義といった命令を受け付け、命令に従いデータ管理を実行する機能を果たす。また圧縮値定義部108は上記ストレージ１０４の管理情報領域１０５にて圧縮値に関する管理情報を管理する。圧縮値定義処理部108の詳細は後述する。
【００２１】
本実施例では、事前の準備としてユーザ表の構造を定義する際に圧縮の有無をユーザ109が列ごとに指定し、問合せ処理部107が解釈した後に圧縮値定義処理部108が受け取り、圧縮値管理表に保存する。すなわちユーザがデータの項目ごとに圧縮の有無を指定し、ユーザが指定した圧縮を行う項目（ここではユーザ表の列名）とその項目を含むデータの識別子（ここではユーザ表名）を圧縮値定義部が受け取り、圧縮値管理表に保存する。
【００２２】
ユーザ表の構造を定義する際の参考に、例えば、ユーザ表を管理するデータ管理プログラムとして広く用いられているリレーショナルデータベースプログラムにおいては、SQLの表構造定義文であるcreate table文や表構造変更文であるalter table文を用いてデータ構造の定義を行う。そのため本実施例では列ごとの圧縮の有無もcreate table文やalter table文で指定できるように文法を拡張する。図3にユーザ表とそれに対応するcreate table文と圧縮列管理表の例を示す。図３(a)に示すsongs表301はミュージックプレイヤーの楽曲情報を保存するユーザ表であり、通し番号を表すid列、歌手名を表すartist_name列、アルバム名を表すalbum_name列、リリース年を表すrelease列、アルバム内の曲順を表すtrack_num列、楽曲のジャンルを表すgenre列、楽曲名を表すsong_title列からなる。ここで、artist_name列とalbum_name列とrelease列を圧縮列と指定する場合の表構造定義に用いるcreate table文の拡張を図３(b)に示す。このcreate table文の拡張ではartist_name列とalbum_name列とrelease列を定義する際に、データ型定義に続いて圧縮列である事を示す “compress” 指定をしている。図３(c)に示す圧縮値管理表303では、圧縮して管理するユーザ表識別子と列識別子を管理する。すなわち圧縮値管理表ではデータ識別子と圧縮値識別子を管理する。本実施例ではユーザ表識別子として、ユーザ表の名前はユニークであるという前提を置き、ユーザ表の名前を用いる。また列識別子として、ユーザ表ごとに列名はユニークであるという前提を置き、列名を用いる。
【００２３】
以上のように本実施例では、ストレージ上で表を管理対象とするシステムでは、表を構成する列ごとにユーザが圧縮対象か否かを指定して圧縮値管理表に登録し、表データの保存に際して、圧縮ありと指定された列のフィールドのデータは指定された圧縮方法で圧縮して保存する。この方式は、上記の例のように表を管理対象として管理するシステムだけでなく、構造体の集合や配列、その他の、複数項目の値の組が繰り返し現れるデータを管理するシステムにも適用可能である。図4に、C言語の構造体の配列を拡張した例を示す。構造体宣言および構造体配列変数宣言401では、songs表301に相当する構造体配列変数songs[]およびsongs表の行に相当する構造体songを定義し、1,000個の構造体からなる集合を定義している。ただしsongs表301のid列は構造体配列変数songs[]の添え字に相当する。401で定義された構造体配列変数を管理する場合にも、SQLのcreate table文の拡張302を用いて定義した場合と同様の方法でデータを管理することが可能である。
【実施例２】
【００２４】
実施例２では、列ごとに圧縮対列か否かを指定し、さらにその圧縮の圧縮単位もユーザが指定する。ストレージ上の管理対象は表に限らず、管理対象が複数項目の値の組の繰り返し現れるデータであるシステムに適用できることは実施例１と全く同様である。
【００２５】
図5に実施例２のデータ管理システムシステム構成を示す。
【００２６】
コンピュータシステム501はデータ管理プログラム502と表や表に関連する管理情報を保存するためのストレージ503を有する。AP実行部515とCPU517およびオペレーティングシステム516については実施例１のデータ管理システムにおけるAP実行部(図２の110)とCPU(図2の112)およびオペレーティングシステム(図２の111)とそれぞれ同様である。主記憶装置518の上に展開されるリレーショナルデータベース実行部502には、問合せ処理部507、圧縮値定義処理部508、I/O振分処理部509、非圧縮表向きinsert文処理部510、圧縮列を含む表向けinsert文処理部511、圧縮列を含む表向けselect文処理部519、非圧縮表向けselect文処理部520、圧縮列向けdelete文処理部513、および通常のdelete文処理部514が含まれる。ストレージ503の管理情報領域505に格納する圧縮値管理表506には、圧縮対象の列名に対応して圧縮単位が登録される。
【００２７】
本実施例では、ユーザ512が指定した圧縮対象である列の全フィールドを、ユーザ512が指定した複数の小区分に分けて圧縮する。この小区分のサイズを圧縮単位と呼び、圧縮の有無と圧縮の単位はデータ管理の事前の準備としてユーザ表の構造を定義する際にユーザ512が列ごとに指定する。ユーザ512よって列ごとに指定された圧縮の有無と圧縮単位は、問合せ処理部507が解釈した後に圧縮値定義処理部508が受け取り、圧縮値管理表506に保存する。すなわち、ユーザがデータに含まれる値ごとに圧縮の有無と圧縮単位を指定し、ユーザが指定した圧縮を行う項目（列名）とその項目を含むデータの識別子（表名）と圧縮単位とを圧縮値定義処理部が受け取り、圧縮値管理表に保存する。圧縮の単位の例としてデータのサイズやデータの行数、フィールド数、ストレージ上でのページ数といった単位が上げられる。本実施例ではページ数を用いる。また、圧縮単位がnページであり、あるページAのユーザデータ領域504の先頭ページ番号からのオフセットがaであるとすると、Aと同じ小区分に含まれるページのオフセットはn × (a div n) ≦ x ＜n × {(a div n) + 1}を満たす自然数xとする。
【００２８】
図6にユーザ表とそれに対応するcreate table文と圧縮列管理表の例を示す。図６（a）のsongs表601は図３に示す実施例１のユーザ表と同じミュージックプレイヤーの楽曲情報を保存するユーザ表である。すなわち表  ６０１は通し番号を表すid列、歌手名を表すartist_name列、アルバム名を表すalbum_name列、リリース年を表すrelease列、アルバム内の曲順を表すtrack_num列、楽曲のジャンルを表すgenre列、楽曲名を表すsong_title列からなる。ここで、artist_name列とalbum_name列とrelease列を圧縮列と指定し、さらにartist_name列は2ページずつ、album_name列とrelease列を4ページずつ圧縮する場合の表構造定義に用いるcreate table文の拡張を602に示す。図６（ｂ）に示すcreate table文の拡張ではartist_name列とalbum_name列とrelease列を定義する際に、データ型定義に続いて圧縮列である事を示す“compress”と圧縮単位である“2”および“4”を指定している。図６（ｃ）に示す圧縮値管理表603では、圧縮して管理するユーザ表識別子と列識別子および圧縮単位を管理する。すなわち圧縮値管理表ではデータ識別子と圧縮値識別子と圧縮単位を指定する。本実施例ではユーザ表識別子として、ユーザ表の名前はユニークであるという前提を置き、ユーザ表の名前を用いる。また列識別子として、ユーザ表ごとに列名はユニークであるという前提を置き、列名を用いる。
【００２９】
本実施例において行の挿入を行う際には、SQLにおけるinsert文を用いる。ユーザ512が発行したinsert文は問合せ処理部507が受け取り処理を行う。問合せ処理部からのinsert文処理命令はI/O振分処理部509に渡される。
【００３０】
I/O振分処理部509がinsert文処理命令を実行する際の処理フローを図7に示す。処理開始（701）の後、圧縮値定義処理部508を参照し（702）、行の挿入を行う対象の表が圧縮列を含む表か否かを判断する（703）。行の挿入を行う対象の表が圧縮列を含む表である場合は圧縮列を含む表向けinsert文処理部511を呼び出す（704）。一方、挿入対象の表が圧縮列を含まない場合は非圧縮表向けinsert文処理部510を呼び出し（705）、処理を終了する（706）。
【００３１】
圧縮列を含む表向けinsert文処理部511は圧縮値定義処理部508を参照し、指定された圧縮単位に基づき要求されたフィールドを圧縮する。すなわち圧縮値管理表506に記録された定義に従い圧縮単位ごとに圧縮する。
【００３２】
圧縮方式としてハフマン符号に代表される辞書を別途保存する必要がある方式を用いた場合と、LZ符合に代表される辞書を別途保存する必要がない方式を用いた場合とでは、圧縮列を含む表向けinsert文処理部511の処理手順が異なる。図８は前者の圧縮方式の場合の処理手順を示す。まず行を挿入する表の複数の圧縮単位を順次検索するため注目する圧縮単位番号aを１とし（８０１）、その１番目の圧縮単位の先頭位置を取得する（８０２）。次にその圧縮単位の辞書を読み込む（８０３）。なお、代表的な例では、圧縮単位内のユーザ表のデータを格納するページの更に前の先頭ページを、上記辞書を格納するページとしている。次に、読み込んだ辞書を用いて挿入対象行のデータを圧縮する（８０４）。次に当該圧縮単位内の第１ページ目から、そのページを取得し（８０５、８０６）、取得したページに空エリアがあるかを判定する（８０７）。空エリアがなければ、圧縮単位内で未確認のページがまだあるかを判定し（８０９）、ページ数をインクリメントし（８１０）、空エリアがあるかの判定を繰り返す。空エリアがあれば、そのページに圧縮後のデータ、すなわち圧縮により得た圧縮列に対応するフィールドのデータと、非圧縮列に対応するフィールドの生のデータとを組みあわせた行全体のデータを書き込み（８１４）、処理を終了する。圧縮単位内の全ページを順次判定しても空エリアがなければ、つまりステップ８０９で空エリア未確認のページがもうなければ、表に未確認の圧縮単位があるかを判定し（８１２）、あれば圧縮単位番号aをインクリメントし、次の圧縮単位について上述の先頭位置取得（８０２）、辞書読み込み（８０３）、各ページの空エリアの確認（８０５〜８１０）を行う。このように、行を挿入可能なページを表データの先頭のページから順に、各圧縮単位にわたり探し、空エリアを発見したページに書き込みを行う。空エリアがあるページを発見しないままステップ８１２で未確認の圧縮単位がもうないと判定したときには領域不足により行の挿入に失敗したことを報告して処理を終了する。
【００３３】
以上のように図８に示した処理フローでは、insert文処理にあたり挿入可能なページを先頭表の先頭ページから順次探す手順をとるが、書き込み可能なページを別途管理する手段が用意されている場合には図８のループ処理を省くことが可能となる。
【００３４】
図９は辞書を別途保存する必要がない圧縮方式を用いる場合のinsert文処理の手順を示す。図９のフローにおいても、まず圧縮単位番号aを１として（９０１）、表の先頭の圧縮単位の先頭位置を取得する（９０２）。つぎに圧縮単位内の注目ページ番号bを１とし（９０３）、その注目ページを取得する（９０４）。ぺージ内の第１行のデータから、データ中の圧縮列のデータを伸張し、伸張したことを辞書に反映する（905、９０６）。注目ページ番号を順次インクリメントして（９０８）、この伸張、辞書への反映の処理を繰り返す。ステップ９０７でページ内の行の全ての伸張処理が終了したと判定すると、挿入対象行の圧縮列に対応するデータの圧縮処理を行い（９０９）、ページ内に圧縮後のデータを格納する空エリアがあるかを判定する（９１０）。空エリアがあれば、そのページに圧縮後のデータを書き込み（９１６）、行の挿入の処理を終了する。空エリアがなければ、注目ページ番号bをインクリメントし（９１２）、次のページについて上記各行の伸長処理、挿入対象行の圧縮処理を行う。ステップ９１０でページ内に空エリアがあればステップ９１６の圧縮後のデータの書き込みを行い、処理を終了する。もし圧縮単位内の全ページを順次判定しても空エリアがなければ、表中にまだ未確認の圧縮単位があるかを判定する（９１３）。表中に、未確認の圧縮単位があれば、圧縮単位番号aをインクリメントして（９１４）、次の圧縮単位につきステップ９０２〜９１２の処理を行う。このように行を挿入可能な空エリアをもつページが見つかるまで各圧縮単位の各ページを確認し、空エリアがあるページを発見しないままステップ９１３で未確認の圧縮単位がもうないと判定したときは、領域不足により行の挿入に失敗したことを報告して処理を終了する（９１５）。
【００３５】
非圧縮表向けinsert文処理部510は圧縮および伸張処理を行うことなく、挿入対象行のフィールドの挿入を行う。なお、非圧縮表向けinsert文処理部510の処理方式は公知の処理方式であるため、詳細は省く。
【００３６】
本実施例において表の全部若しくは一部を読出す際にはSQLにおけるselect文を用いる。ユーザ512が発行したselect文は問合せ処理部507が受け取り処理を行う。問合せ処理部からのselect文処理命令はI/O振分処理部509に渡される。I/O振分処理部509がselect文処理命令を実行する際の動作フローを図１０に示す。Select文処理開始（1001）の後、圧縮値定義表508を参照し（1002）、読込み対象の表が圧縮列を含むかを判断する（1003）。圧縮列を含む表である場合は圧縮列を含む表向けselect文処理部519を呼び出し（1004）、処理を完了する（1006）。一方、圧縮列を含まない表が読み出し対象である場合は非圧縮表向けselect文処理部520を呼び出し(1005)、処理を完了する（1006）。
【００３７】
圧縮列を含む表向けselect文処理部519の処理フローを図１１、図１２に示す。図１１は辞書を別途保存する必要がある圧縮方式を用いる場合の圧縮列を含む表向けselect文処理部519の処理フローである。まずユーザ表中の複数の圧縮単位を順次検索するために注目する圧縮単位番号aを１とし（1101）、その１番目の圧縮単位の先頭位置を取得する（1102）。次にその圧縮単位の辞書を読み込む（1103）。当該圧縮単位内の第１ページ目から、そのページを取得する（1104、1105）。取得したページ内の第1行のデータから順に圧縮データを伸張して（1106, 1107）、select 文の条件を満たすか否かを判定し（1108）、条件を満たせばその行の伸縮後のデータを出力する処理1109を行う。この処理後、行番号cをインクリメントして（1111）、各行について順次行う。ステップ1110でページ内に未検索の行がないと判定すると、ステップ1112を経てステップ1114でページ番号bをインクリメントし、次のページについてステップ1105〜1111を繰り返し実施し、以上の処理を、圧縮単位内の未検索ページがなくなるまで各ページについて行う。ステップ1112で圧縮単位内の未検索ページがないと判定すると、ステップ1114を経てステップ1115で圧縮単位番号aをインクリメントし、ユーザ表中の次の圧縮単位の検索を同様に行う。ステップ1114でユーザ表中に未検索の圧縮単位がないと判定するとselect文処理を終了する。図１２は辞書を別途保存する必要がない圧縮方式を用いる場合のselect文処理の手順を示す。ユーザ表の複数の圧縮単位について、それぞれが包含する頁ごとに処理が繰り返される点は図１１のフローと同様なので、ステップ1213からステップ1214を介してのフローの帰還、及びステップ1211からステップ1212を介してのフローの帰還については説明を略す。各ページについての処理は、まずページを取得し（1204）、頁内の第1行のデータからこの行を伸張し、伸張したことをその伸張時に作成した辞書に反映する(1205、1206)。次に当該行はselect文の条件を満足するかを判定し（1207）。判定がYes ならその行を出力する（1208）。判定がNoならそのままステップ1209に進み、ページ内に未検索の行があれば行番号をインクリメントし（1210）、ページの取得から再び上記の処理を行い、未検索のページがなくなるまで繰り返す。
【００３８】
非圧縮表向けselect文処理部520の処理方式については、詳細説明を省く。
【００３９】
ユーザ表から行の削除を行う際には、SQLにおけるdelete文を用いる。ユーザ512が発行したdelete文は問合せ処理部507が受け取り処理を行う。問合せ処理部507がdelete文を処理する際の動作フローを図13に示す。delete文処理開始1301の後、圧縮値定義表506を参照し（1302）、delete文の対象となる表が圧縮列を含むか判断する（1303）。すなわち問合せ処理部507が圧縮値定義表506を参照し、削除されるデータに圧縮値が含まれるか判断する。圧縮列を含む場合は圧縮列向けdelete文処理部513を呼び出し(904)、処理を完了する（906）。一方、圧縮列を含まない場合は通常のdelete文処理を呼び出し(1305)、処理を完了する。
【００４０】
ステップ1304で呼び出される圧縮列向けのdelete文処理について図１４及び図１５を参照して詳述する。図１４は、例えばハフマン符号による圧縮に代表される、辞書を別保存する必要がある圧縮方式を用いた場合の、delete文処理部513で実行する圧縮列向けdelete文処理のフローを示す。この場合には、辞書の内容には変更を加えず、実際に行があった箇所を消去し辞書劣化フラグを立てる処理を実行する。図１２のフローは、対象となるユーザ表は複数の圧縮単位を含み、その圧縮単位は複数頁を含むことを前提とする。まず、圧縮単位番号aを１とし（1401）、その圧縮単位の先頭位置を取得する（1402）。この例では圧縮単位の先頭位置にその圧縮単位の辞書が格納され、ステップ1403でこの辞書を読み込む。次に圧縮単位内のページ番号ｂを１とし（1404）、その頁を取得する（1405）。次に取得した頁内の行の番号を１として（1406）、この行を、先の辞書を用いて伸張する（1407）。つぎに当該行がdelete文の対象かどうかを判定し（1408）、yesなら当該行を消去する(1409)とともに、もし圧縮単位内で初の行の消去であれば、上記の辞書に劣化フラグをつける（1410）。当該行がdelete文の対象でなければそのまま1411へ進み、頁内に未処理の行があれば行番号をインクリメントし（1412）、ステップ1407〜1510を繰り返す。さらにステップ1413判定で圧縮単位内に未処理の頁があれば、頁番号をインクリメントし（1414）、その頁を取得して、その頁の各行ごとにステップ1407〜1410を繰り返す。以上の処理により、圧縮単位内のdelete文の対処である行はすべて消去され、その圧縮単位の辞書には劣化フラグがつく。この時の状態は図１６(a)に示される。以上の処理は、未処理の圧縮単位があるか否かの判定（1415）および圧縮単位番号aのインクリメント（1416）を経た繰り返しにより、対象となるユーザ表の複数の圧縮単位の全てについて実行される。
【００４１】
圧縮方式としてLZ符号に代表される辞書を別保存する必要がない方式を用いた場合、delete文の対象である行に削除フラグを立て、実際には消去を行わない処理を採用できる。この方式は、例えば全ての行の先頭に削除フラグ用の領域を1bit持たせることで実現できる。図１５に辞書を別保存する必要がない圧縮方式の場合の圧縮列向けdelete文処理のフローを示す。ユーザ表の複数の圧縮単位について、それぞれが包含する頁ごとに処理が繰り返される点は図１４のフローと全く同様なので、ステップ1513からステップ1514を介してのフローの帰還、及びステップ1511からステップ1512を介してのフローの帰還については説明を略す。各頁についての処理は、まず頁を取得し（1504）、頁内の行の番号を１として（1505）、この行を伸張し、伸張したことをその伸張時に作成した辞書に反映する(1506)。次に当該行はdelete文の対象の行か否かを判定する（1507）。判定がYes ならその行が削除された行であることを示す削除フラグを付け（1508）、実際にはページから消去しないでステップ1509へ進む。判定がNoならそのままステップ1509に進み、ページ内に未処理の行があれば行番号をインクリメントし（1510）、ページの取得から再び上記の処理を行い、未処理のページがなくなるまで繰り返す。このdelete文処理を何回か行った後の状態は図１７(a)に示される。
【００４２】
いずれの方式においてもdelete文実行に伴い適宜メンテナンス処理を行う必要がある。辞書を別保存する必要がある圧縮方式の場合の図１１で説明したdelete文処理では、各圧縮単位内で行の消去が実行されと、図１６(a)に示すよう各ページ内に空エリア1601ができ、表に新たな行の挿入要求があった場合に空エリアを使用可能となる。しかし圧縮単位内の圧縮データに関連して辞書保存ページ1602に保存する辞書には消去した行の圧縮に関するもう使用されることのない辞書データが残り、すなわち辞書が劣化することになる。そこで、例えばdelete文処理を特定回数だけ実行したとき、メンテナンス処理を起動する。メンテナンス処理では、各圧縮単位の辞書に劣化フラグ1603が付されているかを検索し、劣化フラグが付された圧縮単位の各ページに含まれる行を伸張するとともに劣化した辞書を破棄し、図１６(b)に示すように各行のデータを前詰めに再整列し、再圧縮して各ページに書き込む。再圧縮の処理で生成したで辞書は辞書格納ページ1602にあらためて格納する。
【００４３】
辞書を別保存する必要のない圧縮方式の場合の図１２で説明したdelete文処理では、行の削除を行ってもその行に図１７(a)に示す削除フラグ1701がつくだけで行データは残される。したがって、そのままではdelete文処理を進めても空エリアができないので、空エリアの確保のためにはメンテナンス処理を行うのが良い。この場合のメンテナンス処理として、削除フラグ1701がついた行を含む圧縮単位を検索し、その圧縮単位内の各ページの削除フラグがついた行を消去し、図１８(b)に示すように、各行のデータを前詰めに再整列し、再圧縮して書き込む、という手順を採用できる。
【００４４】
なお、本実施例で扱うデータ管理方式を更に拡張し、ユーザがデータに含まれる値ごとに圧縮の有無と圧縮単位と圧縮方式を指定し、圧縮値管理表ではデータ識別子と圧縮識別子と圧縮単位と圧縮方式を管理することで、列ごとに最適な圧縮方式を指定することも可能である。
【００４５】
図１８に圧縮方式も指定する場合のユーザ表とそれに対応するcreate table文の拡張および圧縮列管理表の例を示す。図１８(a)に示すsongs表1801はミュージックプレイヤーの楽曲情報を保存するユーザ表であり、通し番号を表すid列、歌手名を表すartist_name列、アルバム名を表すalbum_name列、リリース年を表すrelease列、アルバム内の曲順を表すtrack_num列、楽曲のジャンルを表すgenre列、楽曲名を表すsong_title列からなる。ここで、artist_name列とalbum_name列とrelease列を圧縮列と指定し、さらにartist_name列は2ページずつLZ符号で、album_name列とrelease列を4ページずつハフマン符号で圧縮する場合の表構造定義に用いるcreate table文の拡張を図１８(b)に示す。このcreate table文の拡張ではartist_name列とalbum_name列とrelease列を定義する際に、データ型定義に続いて圧縮列である事を示す“compress”と圧縮単位である”2”および”4”と圧縮方式である”LZ”および”Huffman”を指定している。さらに図１８(c)の圧縮列管理表1803ではデータ識別子と圧縮列識別子と圧縮単位と圧縮方式を管理する。すなわちユーザが指定した圧縮を行う値とその値を含むデータの識別子と圧縮単位と圧縮方式を圧縮値定義処理部が受け取り、圧縮値管理表に保存する。さらに図７の手順704における圧縮列を含む表向けinsert文処理の際に、insert文処理部511は圧縮値管理表を参照してそこに指定された圧縮単位と圧縮方式にしたがって要求されたフィールドの挿入のための伸張処理、圧縮処理をおこなう。同様に図１０の手順1004における圧縮列を含む表向けselect文処理の際にも、select文処理部520は圧縮値管理表508を参照し、指定された圧縮単位と圧縮方式に基づき伸張処理をして要求されたフィールドを出力する。
【産業上の利用可能性】
【００４６】
データを圧縮することにより、ストレージ容量の制約の厳しい機器で利用できる。また、圧縮を行う列をユーザ指定とすることで演算量も削減でき、演算能力やメモリ制約の厳しい機器で利用できる。特に、演算能力とメモリ制約共に扱うデータ量とシステム規模の相対的な関係であり、ポータブル機器のみならず、大規模サーバにおいても適用可能である。
【図面の簡単な説明】
【００４７】
【図１】本発明のデータ圧縮処理を伴うデータ管理方法を実施する実施例１のコンピュータシステムのシステム構成図である。（実施例１）
【図２】本発明の実施例の管理対象である表の構成要素を示した説明図である。
【図３】上記実施例１におけるユーザ表とそれに対応するデータ定義文および圧縮列管理表を示した説明図である。
【図４】上記実施例１における構造体の配列を拡張した例を示した説明図である。
【図５】本発明のデータ圧縮処理を伴うデータ管理方法を実施する実施例２のコンピュータシステムのシステムである。
【図６】上記実施例２におけるユーザ表とそれに対応するデータ定義文および圧縮列管理表を示した説明図である。
【図７】上記実施例２のI/O振分処理部がinsert文処理命令を実行する際の処理フローを示すフローチャートである。
【図８】上記実施例２の圧縮列を含む表向けinsert文処理部が実行するinsert文処理の一例の手順を示すフローチャートである。
【図９】上記圧縮列を含む表向けinsert文処理部が実行するinsert文処理の他の例の手順を示すフローチャートである。
【図１０】上記I/O振分処理部がselect文処理命令を実行する際の処理フローを示したフローチャートである。
【図１１】上記実施例２の圧縮列を含む表向けselect文処理部が実行するselect文処理の一例の手順を示すフローチャートである。
【図１２】上記圧縮列を含む表向けselect文処理部が実行するselect文処理の他の例の手順を示すフローチャートである。
【図１３】上記実施例の問合せ処理部がdelete文を処理する際の処理フローを示したフローチャートである。
【図１４】上記実施例２の圧縮列向けdelete文処理部が実行するdelete文処理の一例の手順を示すフローチャートである。
【図１５】上記圧縮列向けdelete文処理部が実行するdelete文処理の他の例の手順を示すフローチャートである。
【図１６】上記図１４のdelete文処理部を行う場合に採用するメンテナンス処理の前および後の表データの状態を示す概念図である。
【図１７】上記図１５のdelete文処理部を行う場合に採用するメンテナンス処理の前および後の表データの状態を示す概念図である。
【図１８】実施例２の変形例におけるユーザ表とそれに対応するデータ定義文および圧縮列管理表を示した説明図である。
【符号の説明】
【００４８】
１０１、５０１…コンピュータシステム、
１０２、５０２…リレーショナルデータベース実行部、
１０３、５０３…ストレージ、
１０４、５０４…ユーザデータ領域、
１０５、５０５…管理情報領域、
１０６、５０６、６０３、１８０３…圧縮値管理表、
１０７、５０７…問合せ処理部、
１０８、５０８…圧縮値定義処理部、
１０９、５１２…ユーザ、
１１０、５１５…ＡＰ実行部、
１１１、５１６…オペレ−ティングシステム、
１１２、５１７…CPU、
５０９…IO振り分け処理部、
５１０…非圧縮表向けinsert文処理部、
５１１…圧縮列を含む表向けinsert文処理部、
５１３…圧縮列向けdelete文処理部、
５１４…通常のdelete文処理部、
５１９…圧縮列を含む表向けselect文処理部、
５２０…非圧縮表向けselect文処理部。
【図１】
2010026884.tif 000003
【図２】
2010026884.tif 000004
【図３】
2010026884.tif 000005
【図４】
2010026884.tif 000006
【図５】
2010026884.tif 000007
【図６】
2010026884.tif 000008
【図７】
2010026884.tif 000009
【図８】
2010026884.tif 000010
【図９】
2010026884.tif 000011
【図１０】
2010026884.tif 000012
【図１１】
2010026884.tif 000013
【図１２】
2010026884.tif 000014
【図１３】
2010026884.tif 000015
【図１４】
2010026884.tif 000016
【図１５】
2010026884.tif 000017
【図１６】
2010026884.tif 000018
【図１７】
2010026884.tif 000019
【図１８】
2010026884.tif 000020