CREATE SPATIAL INDEX (Transact-SQL)
指定したテーブルと列に空間インデックスを作成します。インデックスはテーブル内にデータがなくても作成できます。データベース名を修飾して指定することにより、他のデータベース内のテーブルまたはビューにインデックスを作成することもできます。
注意 |
---|
空間インデックスの詳細については、「空間インデックスの概要」を参照してください。 |
構文
Create Spatial Index
CREATE SPATIAL INDEX index_name
ON <object> ( spatial_column_name )
{
[ USING <geometry_grid_tessellation> ]
WITH ( <bounding_box>
[ [,] <tesselation_parameters> [ ,...n ] ]
[ [,] <spatial_index_option> [ ,...n ] ] )
| [ USING <geography_grid_tessellation> ]
[ WITH ( [ <tesselation_parameters> [ ,...n ] ]
[ [,] <spatial_index_option> [ ,...n ] ] ) ]
}
[ ON { filegroup_name | "default" } ]
;
<object> ::=
[ database_name. [ schema_name ] . | schema_name. ]
table_name
<geometry_grid_tessellation> ::=
{ GEOMETRY_GRID }
<bounding_box> ::=
BOUNDING_BOX = ( {
xmin, ymin, xmax, ymax
| <named_bb_coordinate>, <named_bb_coordinate>, <named_bb_coordinate>, <named_bb_coordinate>
} )
<named_bb_coordinate> ::= { XMIN = xmin | YMIN = ymin | XMAX = xmax | YMAX=ymax }
<tesselation_parameters> ::=
{
GRIDS = ( { <grid_density> [ ,...n ] | <density>, <density>, <density>, <density> } )
| CELLS_PER_OBJECT = n
}
<grid_density> ::=
{
LEVEL_1 = <density>
| LEVEL_2 = <density>
| LEVEL_3 = <density>
| LEVEL_4 = <density>
}
<density> ::= { LOW | MEDIUM | HIGH }
<geography_grid_tessellation> ::=
{ GEOGRAPHY_GRID }
<spatial_index_option> ::=
{
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| SORT_IN_TEMPDB = { ON | OFF }
| IGNORE_DUP_KEY = OFF
| STATISTICS_NORECOMPUTE = { ON | OFF }
| DROP_EXISTING = { ON | OFF }
| ONLINE = OFF
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| MAXDOP = max_degree_of_parallelism
}
引数
index_name
インデックスの名前を指定します。インデックス名は、テーブル内では一意になっている必要がありますが、データベース内では一意である必要はありません。インデックス名は、識別子の規則に従っている必要があります。ON <object> ( spatial_column_name )
インデックスを作成するオブジェクト (データベース、スキーマ、またはテーブル) と空間列の名前を指定します。spatial_column_name には、インデックスの基準となる空間列を指定します。単一の空間インデックス定義には 1 つの空間列しか指定できませんが、1 つの geometry 列または geography 列に複数の空間インデックスを作成できます。
USING
空間インデックスのテセレーション スキームを指定します。このパラメータは、次のように、既定で型固有の値に設定されます。列のデータ型
テセレーション スキーム
geometry
GEOMETRY_GRID
geography
GEOGRAPHY_GRID
空間インデックスを作成できるのは、geometry 型か geography 型の列だけです。それ以外の場合は、エラーが発生します。また、指定された型に対して無効なパラメータが渡された場合も、エラーが発生します。
注意 SQL Server でのテセレーションの実装方法については、「空間インデックスの概要」を参照してください。
ON filegroup_name
指定したファイル グループに、指定したインデックスを作成します。位置の指定がなく、テーブルがパーティション分割されていない場合、インデックスには、基になるテーブルと同じファイル グループが使用されます。ファイル グループは既に存在している必要があります。ON "default**"**
既定のファイル グループに、指定したインデックスを作成します。この文脈での default という語はキーワードではありません。default は、既定ファイル グループの識別子なので、ON "default" または ON [default] のように区切る必要があります。"default" を指定する場合は、現在のセッションの QUOTED_IDENTIFIER オプションが ON になっている必要があります。これは既定の設定です。詳細については、「SET QUOTED_IDENTIFIER (Transact-SQL)」を参照してください。
<object>::=
インデックスを作成するオブジェクトを、完全修飾または部分的な修飾の形式で指定します。
database_name
データベースの名前を指定します。schema_name
テーブルが所属するスキーマの名前を指定します。table_name
インデックスを作成するテーブルの名前を指定します。
WITH オプション
GEOMETRY_GRID
使用しているジオメトリ グリッド テセレーション スキームを指定します。GEOMETRY_GRID は、geometry データ型の列にのみ指定できます。これはこのデータ型の既定値なので、指定しなくてもかまいません。GEOGRAPHY_GRID
地理グリッド テセレーション スキームを指定します。GEOGRAPHY_GRID は、geography データ型の列にのみ指定できます。これはこのデータ型の既定値なので、指定しなくてもかまいません。BOUNDING_BOX
境界ボックスの 4 つの座標を定義する 4 つの数値の組を指定します。xmin と ymin は左下隅の座標で、xmax と ymax は右上隅の座標です。xmin
境界ボックスの左下隅の x 座標を指定します。ymin
境界ボックスの左下隅の y 座標を指定します。xmax
境界ボックスの右上隅の x 座標を指定します。ymax
境界ボックスの右上隅の y 座標を指定します。XMIN = xmin
境界ボックスの左下隅の x 座標のプロパティ名と値を指定します。YMIN = ymin
境界ボックスの左下隅の y 座標のプロパティ名と値を指定します。XMAX = xmax
境界ボックスの右上隅の x 座標のプロパティ名と値を指定します。YMAX = ymax
境界ボックスの右上隅の y 座標のプロパティ名と値を指定します。
境界ボックスの座標は、USING GEOMETRY_GRID 句内でのみ適用されます。
xmax には xmin より大きい値を指定する必要があり、ymax には ymin より大きい値を指定する必要があります。xmax > xmin かつ ymax > ymin であることを前提に、任意の有効な float 値表現を指定できます。それ以外の場合は、該当するエラーが発生します。
既定値はありません。
境界ボックスのプロパティ名では、データベースの照合順序に関係なく大文字と小文字が区別されません。
プロパティ名を指定するには、それぞれ一度だけ指定する必要があります。これらは任意の順序で指定できます。たとえば、次の 2 つの句は同等です。
BOUNDING_BOX = ( XMIN = xmin, YMIN = ymin, XMAX = xmax, YMAX = ymax )
BOUNDING_BOX = ( XMIN = xmin, XMAX = xmax, YMIN = ymin, YMAX = ymax )
GRIDS
テセレーション スキームの各レベルにおけるグリッド密度を定義します。注意 テセレーションの詳細については、「空間インデックスの概要」を参照してください。
GRIDS のパラメータは次のとおりです。
LEVEL_1
第 1 (最上位) レベルのグリッドを指定します。LEVEL_2
第 2 レベルのグリッドを指定します。LEVEL_3
第 3 レベルのグリッドを指定します。LEVEL_4
第 4 レベルのグリッドを指定します。LOW
そのレベルのグリッドに最も低い密度を指定します。LOW は、16 個のセル (4 × 4 のグリッド) に相当します。MEDIUM
そのレベルのグリッドに中程度の密度を指定します。MEDIUM は、64 個のセル (8 × 8 のグリッド) に相当します。HIGH
そのレベルのグリッドに最も高い密度を指定します。HIGH は、256 個のセル (16 × 16 のグリッド) に相当します。
レベル名を使用すると、任意の順序でレベルを指定することも、レベルを省略することもできます。レベル名を使用する場合は、一貫してレベル名を使ってレベルを指定する必要があります。レベルを省略した場合は、その密度は既定で MEDIUM に設定されます。
無効な密度を指定すると、エラーが発生します。
CELLS_PER_OBJECT = n
オブジェクトあたりのテセレーション セル数を指定します。テセレーション プロセスでインデックスの単一空間オブジェクトに使用できるセル数です。n には、1 ~ 8192 の整数を指定できます。オブジェクトあたりのセル数の既定値は 16 です。無効な数値が渡されるか、指定されたテセレーションの最大セル数より数値が大きい場合は、エラーが発生します。最上位レベルで、1 つのオブジェクトが n で指定されたセル数よりも多くのセルを使用する場合、インデックス作成では、必要なだけの数のセルを使用して完全な最上位レベルのテセレーションを提供します。その場合、オブジェクトには指定されたセル数よりも多くのセルが割り当てられることがあります。この場合、最大数は、密度に応じて最上位レベルのグリッドで生成されたセルの数となります。
CELLS_PER_OBJECT 値は、オブジェクトごとのセル数のテセレーション ルールで使用されます。テセレーション ルールの詳細については、「空間インデックスの概要」を参照してください。
PAD_INDEX = { ON | OFF }
インデックスの埋め込みを指定します。既定値は OFF です。ON
fillfactor で指定される空き領域のパーセンテージが、インデックスの中間レベルのページに適用されます。OFF または fillfactor の指定なし
中間レベルのページはほぼ全容量が使用されます。ただし、中間ページにあるキーのセットを考慮して、インデックスに割り当てることのできる、少なくとも 1 行の最大サイズが収まる分の領域は残されます。
PAD_INDEX では FILLFACTOR で指定されるパーセンテージが使用されるので、PAD_INDEX オプションは、FILLFACTOR が指定されている場合にのみ有効です。FILLFACTOR で指定されるパーセンテージで 1 行分のデータを格納できない場合、データベース エンジンでは内部的に、最小サイズを格納できるパーセンテージが使用されます。中間インデックス ページの行数は、fillfactor の値がどれだけ小さくなっても 2 未満にはなりません。
FILLFACTOR = fillfactor
インデックスの作成時や再構築時に、データベース エンジンが各インデックス ページのリーフ レベルをどの程度まで使用するかを示す割合を指定します。fillfactor には 1 ~ 100 の整数値を指定する必要があります。既定値は 0 です。fillfactor が 100 または 0 の場合、データベース エンジンでは全容量を使用するリーフ ページでインデックスが作成されます。注意 FILL FACTOR 値 0 と 100 の機能は、まったく同じです。
FILLFACTOR 設定は、インデックスが作成または再構築されるときのみ適用されます。データベース エンジンでは、ページ内で指定されたパーセント分の空領域は動的に保持されません。FILL FACTOR 設定を表示するには、sys.indexes カタログ ビューを使用します。
重要 データベース エンジンでは、クラスタ化インデックスの作成時にデータが再分配されるため、100 未満の FILLFACTOR 値を使ってクラスタ化インデックスを作成すると、データ用のストレージ領域のサイズに影響が生じます。
詳細については、「FILL FACTOR」を参照してください。
SORT_IN_TEMPDB = { ON | OFF }
tempdb に一時的な並べ替え結果を格納するかどうかを指定します。既定値は OFF です。ON
インデックスの構築に使用される並べ替えの中間結果が、tempdb に格納されます。tempdb がユーザー データベースとは異なるディスク セットにある場合は、インデックスの作成に要する時間が削減されます。インデックスの構築中に使用されるディスク領域のサイズは増加します。OFF
中間の並べ替え結果はインデックスと同じデータベースに格納されます。
インデックスを作成するためにユーザー データベース内に必要となる領域の他に、tempdb には、並べ替えの中間結果を格納するためにほぼ同じ大きさの追加領域が必要になります。詳細については、「tempdb とインデックスの作成」を参照してください。
IGNORE_DUP_KEY = OFF
インデックスの種類が一意になることはないので、空間インデックスには影響しません。このオプションを ON に設定すると、エラーが発生します。STATISTICS_NORECOMPUTE = { ON | OFF}
分布統計を再計算するかどうかを指定します。既定値は OFF です。ON
古い統計情報は、自動的には再計算されません。OFF
自動統計更新が有効です。
自動統計更新を復元するには、STATISTICS_NORECOMPUTE を OFF に設定するか、NORECOMPUTE 句を指定せずに UPDATE STATISTICS を実行します。
重要 分布統計の自動再計算を無効にすると、クエリ オプティマイザで、テーブルに関連するクエリの最適実行プランが選択されなくなる場合があります。
DROP_EXISTING = { ON | OFF }
名前付きの、既存の空間インデックスを削除および再構築することを指定します。既定値は OFF です。ON
既存のインデックスは削除され、再構築されます。指定するインデックス名は、現在存在するインデックスと同じにする必要がありますが、インデックス定義は変更できます。たとえば、異なる列、並べ替え順、パーティション構成、またはインデックス オプションを指定できます。OFF
指定するインデックス名が既に存在する場合、エラーが表示されます。
DROP_EXISTING を使用してインデックスの種類を変更することはできません。
ONLINE = OFF
インデックス操作中に、基となるテーブルとそれに関連する各インデックスに対してクエリやデータ変更を行えないことを指定します。このバージョンの SQL Server では、空間インデックスに対するオンラインのインデックス構築操作はサポートされていません。空間インデックスに対してこのオプションを ON に設定すると、エラーが発生します。ONLINE オプションを省略するか、ONLINE を OFF に設定してください。オフラインのインデックス操作で、空間インデックスの作成、再構築、または削除を行う場合は、テーブルで Sch-M (スキーマ修正) ロックが取得されます。このため、操作中は、すべてのユーザーは基になるテーブルにアクセスできません。
注意 オンラインでのインデックス操作は、SQL Server Enterprise Edition、Developer Edition、および Evaluation Edition でのみ使用できます。
ALLOW_ROW_LOCKS = { ON | OFF }
行ロックを許可するかどうかを指定します。既定値は ON です。ON
インデックスにアクセスするとき、行ロックが許可されます。いつ行ロックを使用するかは、データベース エンジンによって決定されます。OFF
行ロックは使用されません。
ALLOW_PAGE_LOCKS = { ON | OFF }
ページ ロックを許可するかどうかを指定します。既定値は ON です。ON
ページにアクセスするとき、行ロックが許可されます。いつページ ロックを使用するかは、データベース エンジンによって決定されます。OFF
ページ ロックは使用されません。
MAXDOP = max_degree_of_parallelism
インデックス操作では、max degree of parallelism 構成オプションを無効にします。並列プランの実行で使用するプロセッサの数を制限するには、MAXDOP を使用します。最大は 64 プロセッサです。重要 MAXDOP オブションは構文的にサポートされていますが、CREATE SPATIAL INDEX では、現在は常に単一のプロセッサしか使用されません。
max_degree_of_parallelism には次のデータを指定できます。
1
並列プランを生成しないようにします。>1
現在のシステム ワークロードに基づいて、並列インデックス操作で使用される最大プロセッサ数を指定の数以下に制限します。0 (既定値)
現在のシステム ワークロードに基づいて、実際の数以下のプロセッサを使用します。
詳細については、「並列インデックス操作の構成」を参照してください。
注意 並列インデックス操作は、SQL Server Enterprise Edition、Developer Edition、および Evaluation Edition でしか使用できません。
説明
SQL Server の空間インデックスの概要については「空間インデックスの概要」を参照してください。
すべてのオプションは、CREATE SPATIAL INDEX ステートメントごとに 1 回しか指定できません。オプションを重複して指定すると、エラーが発生します。
空間インデックスは、テーブルの各空間列に 249 個まで作成できます。特定の空間列に複数の空間インデックスを作成すると、1 つの列の異なるテセレーション パラメータのインデックスを作成する場合などに便利です。
重要 |
---|
空間インデックスの作成には、そのほかにもいくつかの制限があります。詳細については、「空間インデックスに関する制限」を参照してください。 |
インデックスの構築では、プロセスの並列処理を利用することはできません。
空間インデックスでサポートされるメソッド
空間インデックスは、特定の条件下で、いくつかのセット指向のジオメトリ メソッドをサポートします。詳細については、「空間インデックスでサポートされるジオメトリ メソッド」を参照してください。
空間インデックスとパーティション分割
既定では、空間インデックスをパーティション分割されたテーブルに作成すると、インデックスは、テーブルのパーティション構成に従ってパーティション分割されます。これによって、インデックス データと関連する行が同じパーティションに格納されます。
この場合、ベース テーブルのパーティション構成を変更するには、ベース テーブルのパーティションを分割し直す前に、空間インデックスを削除する必要があります。この制約を避けるには、空間インデックスの作成時に、"ON filegroup" オプションを指定します。詳細については、この後の「空間インデックスとファイル グループ」を参照してください。
空間インデックスとファイル グループ
既定では、空間インデックスは、インデックスが指定されたテーブルと同じファイル グループにパーティション分割されます。ファイル グループを指定するとそちらが優先されます。
[ ON { filegroup_name | "default" } ]
空間インデックスにファイル グループを指定すると、インデックスは、テーブルのパーティション構成に関係なく指定したファイル グループに配置されます。
空間インデックスのカタログ ビュー
次のカタログ ビューは、空間インデックスに固有です。
sys.spatial_indexes
空間インデックスの主インデックス情報を表します。sys.spatial_index_tessellations
各空間インデックスのテセレーション スキームおよびパラメータに関する情報を表します。
空間インデックスのメタデータ構造の詳細については、「内部テーブル」を参照してください。
インデックス作成に関する詳細説明
インデックス作成の詳細については、「CREATE INDEX (Transact-SQL)」の「解説」を参照してください。
権限
テーブルまたはビューに対する ALTER 権限が必要です。実行するには、固定サーバー ロール sysadmin または、固定データベース ロール db_ddladmin および db_owner のメンバである必要があります。
例
A. 空間インデックスを geometry 列に作成する
次の例では、geometry 型の列 geometry_col を含む SpatialTable というテーブルを作成します。次に、空間インデックス SIndx_SpatialTable_geometry_col1 を geometry_col に作成します。この例では、既定のテセレーション スキームを使用し、境界ボックスを指定します。
CREATE TABLE SpatialTable(id int primary key, geometry_col geometry);
CREATE SPATIAL INDEX SIndx_SpatialTable_geometry_col1
ON SpatialTable(geometry_col)
WITH ( BOUNDING_BOX = ( 0, 0, 500, 200 ) );
B. 空間インデックスを geometry 列に作成する
次の例では、SpatialTable テーブルの geometry_col に 2 番目の空間インデックス SIndx_SpatialTable_geometry_col2 を作成します。この例では、テセレーション スキームとして GEOMETRY_GRID を指定します。境界ボックス、グリッド レベルごとに異なる密度、オブジェクトごとのセル数に 64 をそれぞれ指定します。また、インデックスの埋め込みを ON に設定します。
CREATE SPATIAL INDEX SIndx_SpatialTable_geometry_col2
ON SpatialTable(geometry_col)
USING GEOMETRY_GRID
WITH (
BOUNDING_BOX = ( xmin=0, ymin=0, xmax=500, ymax=200 ),
GRIDS = (LOW, LOW, MEDIUM, HIGH),
CELLS_PER_OBJECT = 64,
PAD_INDEX = ON );
C. 空間インデックスを geometry 列に作成する
次の例では、SpatialTable テーブルの geometry_col に 3 番目の空間インデックス SIndx_SpatialTable_geometry_col3 を作成します。この例では、既定のテセレーション スキームを使用します。境界ボックスを指定し、第 3 レベルと第 4 レベルに異なるセル密度を使用しますが、オブジェクトごとのセル数には既定値を使用します。
CREATE SPATIAL INDEX SIndx_SpatialTable_geometry_col3
ON SpatialTable(geometry_col)
WITH (
BOUNDING_BOX = ( 0, 0, 500, 200 ),
GRIDS = ( LEVEL_4 = HIGH, LEVEL_3 = MEDIUM ) );
D. 空間インデックスに固有のオプションを変更する
次の例では、上の例で作成した空間インデックス SIndx_SpatialTable_geography_col3 に対して、LEVEL_3 の新しい密度と DROP_EXISTING = ON を指定することで、空間インデックスを再構築します。
CREATE SPATIAL INDEX SIndx_SpatialTable_geography_col3
ON SpatialTable(geography_col)
WITH ( BOUNDING_BOX = ( 0, 0, 500, 200 ),
GRIDS = ( LEVEL_3 = LOW ),
DROP_EXISTING = ON );
E. 空間インデックスを geography 列に作成する
次の例では、geography 型の列 geography_col を含む SpatialTable2 というテーブルを作成します。次に、空間インデックス SIndx_SpatialTable_geography_col1 を geography_col に作成します。この例では、GEOGRAPHY_GRID テセレーション スキームの既定のパラメータ値を使用します。
CREATE TABLE SpatialTable2(id int primary key, object GEOGRAPHY);
CREATE SPATIAL INDEX SIndx_SpatialTable_geography_col1
ON SpatialTable2(object);
注意 |
---|
地理グリッド インデックスには、境界ボックスは指定できません。 |
F. 空間インデックスを geography 列に作成する
次の例では、SpatialTable2 テーブルの geography_col に 2 番目の空間インデックス SIndx_SpatialTable_geography_col2 を作成します。この例では、テセレーション スキームとして GEOGRAPHY_GRID を指定します。レベルごとに異なるグリッド密度、オブジェクトごとのセル数に 64 をそれぞれ指定します。また、インデックスの埋め込みを ON に設定します。
CREATE SPATIAL INDEX SIndx_SpatialTable_geography_col2
ON SpatialTable2(object)
USING GEOGRAPHY_GRID
WITH (
GRIDS = (MEDIUM, LOW, MEDIUM, HIGH ),
CELLS_PER_OBJECT = 64,
PAD_INDEX = ON );
G. 空間インデックスを geography 列に作成する
次の例では、SpatialTable2 テーブルの geography_col に 3 番目の空間インデックス SIndx_SpatialTable_geography_col3 を作成します。この例では、既定のテセレーション スキームの GEOGRAPHY_GRID と、既定の CELLS_PER_OBJECT 値 (16) を使用します。
CREATE SPATIAL INDEX SIndx_SpatialTable_geography_col3
ON SpatialTable2(object)
WITH ( GRIDS = ( LEVEL_3 = HIGH, LEVEL_2 = HIGH ) );
関連項目