プライマリ・コンテンツに移動
Oracle® Spatial and Graph開発者ガイド
12cリリース1 (12.1)
B72470-07
目次へ移動
目次
索引へ移動
索引

前
次

5.1.3 パーティション空間索引の使用

パーティション表にはパーティション空間索引を作成できます。この項では、Oracle Spatial and Graph固有の使用上の考慮事項について説明します。パーティション表およびパーティション索引の詳細は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。

パーティション空間索引には、次のメリットがあります。

空間索引のパーティション化には、次の制限事項が適用されます。

パーティション空間索引を作成するには、LOCALキーワードを指定する必要があります。(LOCALキーワードを指定しないと、すべての表パーティションのデータに非パーティション空間索引が作成されます。)次の例ではパーティション空間索引を作成します。

CREATE INDEX counties_idx ON counties(geometry)
   INDEXTYPE IS MDSYS.SPATIAL_INDEX LOCAL;

この例では、索引パーティションの数および配置に、次のデフォルト値を使用します。

個々のパーティションに対してパラメータを指定する場合は、次の考慮事項が適用されます。

パーティション化のデフォルト値を上書きするには、次の一般的な形式のCREATE INDEX文を使用します。

CREATE INDEX <indexname> ON <table>(<column>) 
  INDEXTYPE IS MDSYS.SPATIAL_INDEX 
     [PARAMETERS ('<spatial-params>, <storage-params>')] LOCAL 
     [( PARTITION <index_partition> 
        PARAMETERS ('<spatial-params>, <storage-params>') 
     [, PARTITION <index_partition> 
        PARAMETERS ('<spatial-params>, <storage-params>')] 
     )] 

パーティション表で問合せを操作して、1つのパーティションのみに対する問合せを実行できます。次に例を示します。

SELECT * FROM counties PARTITION(p1)
    WHERE ...<some-spatial-predicate>;

複数の問合せを異なるパーティションで同時に操作する場合、選択したパーティションに対する問合せを行うと、問合せが高速化され、スループット全体が向上する場合もあります。

問合せでパーティション空間索引を使用する場合、空間演算子およびファンクションのセマンティック(意味または動作)は、SDO_NN (最も近くにあるもの)の場合を除いて、パーティション索引および非パーティション索引を使用する場合と同じです。SDO_NNの場合、その問合せによって影響されるパーティションごとに、要求した数のジオメトリが戻されます。(詳細は、「空間演算子」SDO_NN演算子の説明を参照してください。)

たとえば、ある地点に最も近い5つのレストランを要求し、空間索引に4つのパーティションがある場合、SDO_NNは最大20 (5×4)のジオメトリを戻します。この場合、最も近い5つのレストランを戻すためにROWNUM疑似列(ここでは、WHERE ROWNUM <=5)を、結果を距離(マイル)でソートするためにORDER BY句を使用する必要があります。例5-1では、パーティション空間索引から最も近い5つのレストランを戻します。

注意:

SDO_NN演算子を使用するその他の例については、「SDO_NNの例」を参照してください。

クロススキーマ問合せでは、表にパーティション空間索引がある場合、空間表と、空間表に作成された空間索引の索引表(MDRT_xxx)の両方について、ユーザーにSELECTまたはREAD権限が付与されている必要があります。詳細と例については、「空間演算子」SDO_JOIN演算子の「使用上の注意」に記載されている「SDO_JOINのクロススキーマでの使用」を参照してください。

例5-1 パーティション空間索引を使用したSDO_NN問合せ

SELECT * FROM
(
SELECT r.name, r.location, SDO_NN_DISTANCE(1) distance_in_miles
FROM restaurants_part_table r
WHERE SDO_NN(r.location,
      MDSYS.SDO_GEOMETRY(2001,8307,MDSYS.SDO_POINT_TYPE(-110,35,Null),Null,Null),
     'SDO_NUM_RES=5 distance=2  unit=MILE', 1) = 'TRUE'
ORDER BY distance_in_miles
)
WHERE ROWNUM<=5;