空間データに対するニアレスト ネイバーのクエリ
空間データで使用される一般的なクエリの 1 つに、ニアレスト ネイバー クエリがあります。 ニアレスト ネイバー クエリは、特定の空間オブジェクトに最も近い空間オブジェクトを検索するために使用されます。 たとえば、Web サイトのストア ロケーターは、多くの場合、顧客の場所に最も近い店舗の場所を検索する必要があります。
ニアレスト ネイバー クエリは、さまざまな有効なクエリ形式で記述できますが、空間インデックスを使用するニアレスト ネイバー クエリでは、次の構文を使用する必要があります。
構文
SELECT TOP ( number )
[ WITH TIES ]
[ * | expression ]
[, ...]
FROM spatial_table_reference, ...
[ WITH
(
[ INDEX ( index_ref ) ]
[ , SPATIAL_WINDOW_MAX_CELLS = <value>]
[ ,... ]
)
]
WHERE
column_ref.STDistance ( @spatial_ object )
{
[ IS NOT NULL ] | [ < const ] | [ > const ]
| [ <= const ] | [ >= const ] | [ <> const ] ]
}
[ AND { other_predicate } ]
}
ORDER BY column_ref.STDistance ( @spatial_ object ) [ ,...n ]
[ ; ]
ニアレスト ネイバー クエリと空間インデックス
SQL Server では、TOP および ORDER BY 句は、空間データ列にニアレスト ネイバー クエリを実行するために使用されます。 ORDER BY 句には、空間列データ型の STDistance() メソッドの呼び出しが含まれます。 TOP 句は、クエリで返されるオブジェクトの数を示します。
ニアレスト ネイバー クエリで空間インデックスを使用するには、次の要件を満たす必要があります。
空間インデックスが空間列の 1 つにあり、STDistance() メソッドが WHERE および ORDER BY 句でその列を使用する必要があります。
TOP句は PERCENT ステートメントを含むことはできません。
WHERE 句は STDistance() メソッドを含む必要があります。
WHERE 句に複数の述語がある場合、STDistance() メソッドを含む述語は、AND 結合で他の述語と接続する必要があります。 STDistance() メソッドは、WHERE 句のオプションの一部にすることはできません。
ORDER BY 句の最初の式では STDistance() メソッドを使用する必要があります。
ORDER BY 句の最初の STDistance() 式の並べ替え順序は、ASC である必要があります。
STDistance が NULL を返すすべての行は、フィルターで除外する必要があります。
注意 |
---|
geography または geometry データ型を引数として取るメソッドは、SRID がその型と同一でない場合、NULL を返します。 |
ニアレスト ネイバー クエリで使用されるインデックスでは、新しい空間インデックス テセレーションを使用することをお勧めします。 空間インデックス テセレーションの詳細については、「空間データ (SQL Server)」を参照してください。
使用例
次のコード例は、空間インデックスを使用できるニアレスト ネイバー クエリを示します。 次の例では、AdventureWorks2012 データベースにある Person.Address テーブルを使用しています。
USE AdventureWorks2012
GO
DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address
WHERE SpatialLocation.STDistance(@g) IS NOT NULL
ORDER BY SpatialLocation.STDistance(@g);
列 SpatialLocation にインデックスを作成して、ニアレスト ネイバー クエリが空間インデックスを使用する方法を確認します。 空間インデックスの作成の詳細については、「空間インデックスの作成、変更、および削除」を参照してください。
次のコード例は、空間インデックスを使用できないニアレスト ネイバー クエリを示します。
USE AdventureWorks2012
GO
DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address
ORDER BY SpatialLocation.STDistance(@g);
このクエリは、構文で指定した形式の STDistance() を使用する WHERE 句がないため、空間インデックスを使用できません。