8月1日より提供開始となったSQL Serverの新バージョン「SQL Server 2008」では、多くの機能が追加されている。ここでは、開発者向けに拡張された機能を紹介する。
4年ぶりのバージョンアップとなったSQL Server 2008(SQL 2008)には、数々の機能拡張が施されている。ITPro向けに管理機能が強化されていたり、企業コンプライアンスに対応した監査機能の強化などが注目されがちだが、ここでは、開発者から見て思わず使ってみたくなる、代表的な2つの機能拡張について紹介する。
SQL 2008で備えられた機能に、データ型の拡張がある。1日単位で日付を表すdate型や100ns(ナノ秒)単位で時間を表すtime型など、今までありそうでなかったデータ型が増えたことも歓迎したいのだが、幾つかのデータ型の拡張の中でも最も目を引くのが、空間や地理を取り扱う空間データ型だろう。
空間データ型には、緯度経度で位置を表すgeography型と、直交する2軸で平面上の位置を表すgeometry型がある。ともにSQL CLRデータ型で、プロパティとメソッドを持つ(SQL CLRデータ型とは、SQL Server 2005が.NET Frameworkの共通言語ランタイム(CLR)コンポーネントと統合した際にできたCLR上のT-SQLのデータ型のこと。従来のT-SQLのデータ型と異なりオブジェクトになっている)。
geography型にもgeometry型にも、幾つかのインスタンスがある。0次元つまり点を表すPoint、1次元つまり線の集まりを表すLineString、2次元つまり面の集まりを表すPorygonと、これらのコレクションなどだ。
インスタンス名 | 機能 |
---|---|
Point | 1つの位置を表す0次元のオブジェクト |
MultiPoint | 0個以上のPointのコレクション |
LineString | 一連の点とそれらを結ぶ線分を表す1次元のオブジェクト |
MultiLineString | 0個以上のLineStringのコレクション |
Polygon | 1つの外部境界リングと0個以上の内部リングを定義する一連の点として格納される2次元表面 |
MultiPolygon | 0個以上のPolygonのコレクション |
GeometryCollection | 0個以上のgeometryまたはgeographyのコレクション |
加えてこれらのオブジェクトには空間データを扱うメソッドがある。緯度経度を表す文字列から空間データを生成するSTGeomFromTextや、距離を求めるSTDistance、面積を求めるSTAreaなどだ。
カテゴリ | メソッド名 | 機能 |
---|---|---|
実体化 | STGeomFromText | 文字列からの空間データの実体化 |
説明情報 | STArea | 多角形の面積 |
STLength | 長さ | |
STCentroid | 中心位置 | |
インスタンス間の関係 | STIntersects | 重なり部分の位置 |
STDistance | 距離 | |
コレクション | STGeometryN | 指定されたgeometryインスタンスの取得 |
STPointN | 指定されたPointインスタンスの取得 | |
注意してほしいのは、空間データとはいってもあくまでも2次元ということだ。高さにまでは対応していない。また、geography型は球体表面を扱うが、地球上ということであれば、地球が完全な球でないことから、世界測地系の位置データ(日本はSRID4612)を指定する必要がある。
加えて、T-SQLでのコーディング上の注意点として、先に書いたようにgeography型もgeometry型もSQL CLR型であり、大文字小文字を区別することにも注意したい。
このような機能拡張を見ると、やってみたくなるのが地図との連携だ。2つの地点間の距離が簡単に求められ、しかもデータベース上となれば、「ある地点から2km以内のすべての地点データ」を簡単に求められるようになる。高価なライブラリも不要だ。マイクロソフトのサイトには、Virtual Earthとの連携について解説しているWebCastがあり、参考になる。
また、geometry型は直交するいわゆるXY軸で表されるデータなので、メルカトル図法の地図に限らず、図面などの平面データを扱うことができる。図面データに適用すれば、指定された部分の面積を求めるとか、特定の条件の面積を集計するなどの業務に応用できるし、CADなどのアプリケーションへの応用も可能だ。
空間データ型以外にもSQL 2008で拡張されたデータ型がある。一時テーブルの代わりにも使えるユーザー定義テーブル型だ。これはテーブルと同じ構造を持つデータ型で、ストアドプロシージャの引数にも使える。
また、ツリー構造を表現できる階層型も追加された。この階層型もSQL CLR型であり、メソッドを持つ。従来は再帰するストアドプロシージャなどで実現していた、企業の部署情報などのデータ構造を簡単に構築できるようになった。ただし、インデックスをかけることはできるものの、階層型に格納できるデータは数値のみであることに注意が必要だ。これはこの数値をキーとして別テーブルとリレーションして使うことで回避することになるだろう。
従来、BLOBデータを扱うときは、扱いやすさを優先してDB内にBLOBデータを格納するか(パフォーマンスは犠牲になる)、パフォーマンスを優先してファイルシステム上にBLOBデータをファイルとして格納し、DB内にはファイルパスのみを格納する(扱いやすさは犠牲になる)か、どちらかの選択を迫られていた。SQL 2008には、VARBINARY(MAX)型にFILESTREAM属性を付けることができるようになった。FILESTREAM属性とは、SQLのエンジンが、BLOBを直接ファイルシステム上に格納する仕組みのこと。扱い方はDB上にBLOBデータを格納するときとまったく同じでよい。別途Win32 Streaming APIを利用して普通のFileStreamのようにBLOBデータを操作することも可能だが、必ずトランザクション内で行わなければ一貫性を保てないので注意が必要だ。
ファイルシステム上にBLOBデータを置くためパフォーマンスには影響しない上、扱い方はDB上とまったく同じになるので、従来トレードオフしていたパフォーマンスと扱いやすさを両立できるようになる。さらに、ファイルシステム上に置かれたBLOBデータもBACKUP DATABASE/LOGの対象となるため、管理においてもBLOBを意識しないですむ。ただし、暗号化やミラーリング、スナップショットなど、対応していない機能もある。
DB上にBLOBがあるときと同じように操作できるため、DB上でBLOBデータのDELETEを行うと、ファイルシステム上のファイルも消されることになるが、DB上のレコードが削除されたタイミングと同時にファイルシステム上のBLOBファイルが消されるわけではない点に注意が必要だ。これは、ファイルシステム上のBLOBファイルを扱っているのがSQL CLRであり、BLOBファイルもガベージコレクションの対象となっているためらしい。どうしてもガベージコレクションの実行タイミングを待たずに消したい場合は、SQL 2008のサービスを一旦停止すれば、このタイミングで消される。
FILESTREAM属性をONにする場合は、従来からあるデータベースファイル(.mdf)の指定と、ログファイル(.ldf)の指定に加え、BLOBデータを格納するフォルダ位置を指定する必要がある。これは、BLOBデータを格納するファイルシステムはSQL 2008の実行マシンと同じマシンにあることを意味する。何らかの理由で同一サーバ上にBLOBデータを格納できないときは、Remote BLOB Store APIを活用できる。
Remote BLOB Store APIは、ストレージベンダーがライブラリを提供する必要があるものの、さまざまなストレージに対応でき、対応したストレージに保存されるBLOBデータは一貫性が保障されることになる(ただし、バックアップは対象外)。
実際、FILESTREAM属性を使う場面は多いだろう。ギガピクセルが当たり前となりつつあるデジカメの普及や、動画データの氾濫で、DBに格納するデータは巨大化している。数Mバイトのサムネイル程度ならDB内に格納できるが、それ以上となると従来はファイルシステム上に別途保存していた。これが、ファイルシステム上の管理をSQL 2008に任せることができ、しかも一貫性も保障してくれるとなると使わない手はない。
機能拡張はほかにも、複数行をまとめてINSERTできるようになった、従来のsp_depensに代わって動的に依存関係を追跡してくれるsys.sql_expression_dependenciesビューが追加された、フルテキスト検索が早くなったなどさまざまある。この機会にSQL 2008の利用を検討してみてはいかがだろうか。
Copyright © ITmedia, Inc. All Rights Reserved.