SQL Server 2008キタキター!( ゜∀゜)!…っということでとりあえずGeography
っというわけでさっそくダウンロード&インストールしてみました(・∀・)
地味に嬉しい新機能の追加が多いSQL Server 2008ですが、とりあえず分かりやすいところで空間データを使って遊んでみる。
まずはテスト用のテーブル作成から。
/* テストテーブル */ CREATE TABLE [Spot] ( [Id] [int] NOT NULL, [Name] [nvarchar](max) NOT NULL, [Place] [geography] NOT NULL, CONSTRAINT [PK_Spot] PRIMARY KEY CLUSTERED ( [Id] ASC ) ) /* 空間インデックス */ CREATE SPATIAL INDEX [IX_Spot_Place] ON [Spot] ( [Place] ) USING GEOGRAPHY_GRID
ID、名称、場所(地理型)からなるデータ構造。
Place列には空間インデックスも張ってみる。
っで、テストデータを投入。
/* テストデータ */ INSERT INTO Spot ( Id, Name, Place ) VALUES ( 1, '甲府駅', geography::STGeomFromText( 'POINT( 138.56899 35.66715 )', 4326 ) ) INSERT INTO Spot ( Id, Name, Place ) VALUES ( 2, '山梨大学', geography::STGeomFromText( 'POINT( 138.57271 35.67781 )', 4326 ) ) ...
そしてこのデータに対して、PlaceがあるPOLYGON内のデータを検索してみる。
/* 甲府駅周辺の検索 */ DECLARE @g geography; SET @g = geography::STGeomFromText( 'POLYGON( ( 138.569 35.668, 138.567 35.666, 138.569 35.666, 138.570 35.668, 138.569 35.668 ) )', 4326 ); SELECT Id, Name, Place.STPointN(1).Long, Place.STPointN(1).Lat FROM Spot WHERE @g.STIntersects(Place) = 1
ちゃんと「甲府駅」はヒットして、「山梨大学」はヒットしませんのだ(・∀・)。
で、実行プランを見ると、Clusterd Index Scanになっていますけど(・ω・)?
試しに「WITH( INDEX( IX_Spot_Place ) )」をつけてSELECTしてみたら、なんか色々やってるプランになりましたが。
まあ、この辺はOiOi学んでいきましょうか。
とりあえず、今までPostGISで遊んでいたような事がSQL Serverだけでも出来るよ〜(・∀・)♪