この章では、空間オブジェクト・データ型で使用できる演算子について説明します。空間プロシージャと空間ファンクションとの違いなど、空間演算子の概要については、1.9項を参照してください。表19-1に、主な演算子を示します。
表19-1 主な空間演算子
演算子 | 説明 |
---|---|
|
指定されたジオメトリと相互作用するジオメトリを特定します。 |
|
位相関係に基づいて空間結合を実行します。 |
|
最も近くにあるジオメトリを特定します。 |
|
SDO_NN演算子によって戻されたオブジェクトの距離を戻します。 |
|
2つのジオメトリが指定された方法で相互作用しているかどうかを判断します。(特定のマスク値操作用の簡易形式の代替演算子については、表19-2を参照してください。) |
|
2つのジオメトリ間の距離が、指定された距離内にあるかどうかを判断します。 |
表19-2に、特定のマスク・タイプのSDO_RELATE操作を実行する簡易形式の演算子を示します。
表19-2 SDO_RELATE操作用の簡易演算子
演算子 | 説明 |
---|---|
|
表内のジオメトリに、特定のジオメトリとのANYINTERACT位相関係があるかどうかを確認します。 |
|
表内のジオメトリに、特定のジオメトリとのCONTAINS位相関係があるかどうかを確認します。 |
|
表内のジオメトリに、特定のジオメトリとのCOVEREDBY位相関係があるかどうかを確認します。 |
|
表内のジオメトリに、特定のジオメトリとのCOVERS位相関係があるかどうかを確認します。 |
|
表内のジオメトリに、特定のジオメトリとのEQUAL位相関係があるかどうかを確認します。 |
|
表内のジオメトリに、特定のジオメトリとのINSIDE位相関係があるかどうかを確認します。 |
|
表内のジオメトリに、特定のジオメトリとのON位相関係があるかどうかを確認します。 |
|
表内のジオメトリに、特定のジオメトリとのOVERLAPBDYDISJOINT位相関係があるかどうかを確認します。 |
|
表内のジオメトリに、特定のジオメトリとのOVERLAPBDYINTERSECT位相関係があるかどうかを確認します。 |
|
表内のジオメトリが特定のジオメトリと重なっているかどうか(OVERLAPBDYDISJOINTまたはOVERLAPBDYINTERSECT位相関係があるかどうか)を確認します。 |
|
表内のジオメトリに、特定のジオメトリとのTOUCH位相関係があるかどうかを確認します。 |
注意: Spatial and Graphの演算子やサブプログラムに対する文字列(VARCHAR2)パラメータの中に数値がある場合は、ロケールにかかわらず、小数点にはピリオド(.)を使用する必要があります。例:'distance=3.7' |
この章では、これらの演算子のリファレンス情報をアルファベット順に説明します。
トポロジで演算子を使用する方法は、『Oracle Spatialトポロジおよびネットワーク・データ・モデル開発者ガイド』を参照してください。
説明
表内のジオメトリに、特定のジオメトリとのANYINTERACT位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=ANYINTERACT'
を含めて指定する場合と同じです。
この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 | 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。 |
geometry2 | 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。 |
戻り値
式SDO_ANYINTERACT(geometry1,geometry2) = 'TRUE'は、ANYINTERACT位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。
使用上の注意
この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。
位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)とANYINTERACT関係を持つジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)
SELECT c.mkt_id, c.name FROM cola_markets c WHERE SDO_ANYINTERACT(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(4,6, 8,8)) ) = 'TRUE'; MKT_ID NAME ---------- -------------------------------- 2 cola_b 1 cola_a 4 cola_d
説明
表内のジオメトリに、特定のジオメトリとのCONTAINS位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=CONTAINS'
を含めて指定する場合と同じです。
この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 | 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。 |
geometry2 | 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。 |
戻り値
式SDO_CONTAINS(geometry1,geometry2) = 'TRUE'は、CONTAINS位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。
使用上の注意
この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。
位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(2,2)、右上の座標が(4,6)の矩形)とCONTAINS関係を持つジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、cola_a
のみが問合せウィンドウ・ジオメトリを含んでいます。
SELECT c.mkt_id, c.name FROM cola_markets c WHERE SDO_CONTAINS(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(2,2, 4,6)) ) = 'TRUE'; MKT_ID NAME ---------- -------------------------------- 1 cola_a
説明
表内のジオメトリに、特定のジオメトリとのCOVEREDBY位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=COVEREDBY'
を含めて指定する場合と同じです。
この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 | 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。 |
geometry2 | 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。 |
戻り値
式SDO_COVEREDBY(geometry1,geometry2) = 'TRUE'は、COVEREDBY位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。
使用上の注意
この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。
位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(1,1)、右上の座標が(5,8)の矩形)とCOVEREDBY関係を持つジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、cola_a
のみが問合せウィンドウ・ジオメトリに覆われています。
SELECT c.mkt_id, c.name FROM cola_markets c WHERE SDO_COVEREDBY(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(1,1, 5,8)) ) = 'TRUE'; MKT_ID NAME ---------- -------------------------------- 1 cola_a
説明
表内のジオメトリに、特定のジオメトリとのCOVERS位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=COVERS'
を含めて指定する場合と同じです。
この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 | 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。 |
geometry2 | 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。 |
戻り値
式SDO_COVERS(geometry1,geometry2) = 'TRUE'は、COVERS位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。
使用上の注意
この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。
位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(1,1)、右上の座標が(4,6)の矩形)とCOVERS関係を持つジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、cola_a
のみが問合せウィンドウ・ジオメトリを覆っています。
SELECT c.mkt_id, c.name FROM cola_markets c WHERE SDO_COVERS(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(1,1, 4,6)) ) = 'TRUE'; MKT_ID NAME ---------- -------------------------------- 1 cola_a
説明
表内のジオメトリに、特定のジオメトリとのEQUAL位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=EQUAL'
を含めて指定する場合と同じです。
この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 | 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。 |
geometry2 | 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。 |
使用上の注意
この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。
位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(1,1)、右上の座標が(5,7)の矩形)とEQUAL関係を持つジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、cola_a
のみが問合せウィンドウ・ジオメトリと同じ境界と内部を持っています。
SELECT c.mkt_id, c.name FROM cola_markets c WHERE SDO_EQUAL(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(1,1, 5,7)) ) = 'TRUE'; MKT_ID NAME ---------- -------------------------------- 1 cola_a
説明
空間索引を使用して、指定されたオブジェクト(対象領域など)と空間的に作用するオブジェクトの集合を識別したり、指定した2つのオブジェクトが相互作用するかどうかを判別します。非接続でないオブジェクトは、空間的に相互作用します。
この演算子は、1次フィルタ処理のみ実行します。SDO_RELATE演算子によって実行される2次フィルタ処理によって、オブジェクトが空間的に相互作用するかどうかを特定できます。
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 | 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。 |
geometry2 | 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。 |
param | オプションで、min_resolution キーワードまたはmax_resolution キーワード(あるいはその両方)を指定します。データ型はVARCHAR2です。
|
使用上の注意
SDO_FILTER演算子は、常にWHERE句で使用される必要があり、この演算子を含む条件式は、SDO_FILTER(arg1, arg2) = 'TRUE'形式である必要があります。
geometry2
は表から取り出されるか、または一時的なSDO_GEOMETRYオブジェクト(バインド変数、SDO_GEOMETRYコンストラクタなど)となります。
geometry2
列が空間索引付けされていない場合、演算子は問合せウィンドウをメモリー内で索引付けするため、高いパフォーマンスを実現します。
geometry2
の2つ以上のジオメトリが演算子に渡される場合は、ORDEREDオプティマイザ・ヒントが指定されている必要があり、geometry2
にある表をFROM句の最初に指定する必要があります。
geometry1
およびgeometry2
が異なる座標系に基づいている場合、geometry2
は、6.10.1項で説明するとおり、操作を実行するため一時的にgeometry1
の座標系に変換されます。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)と相互作用するジオメトリを選択します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)
SELECT c.mkt_id, c.name FROM cola_markets c WHERE SDO_FILTER(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(4,6, 8,8)) ) = 'TRUE'; MKT_ID NAME ---------- -------------------------------- 2 cola_b 1 cola_a 4 cola_d
次の例は前述の例と同じですが、ジオメトリのMBRのうち少なくとも1つの辺が4.1以上のジオメトリのみを含む、という点で異なります。この場合、cola_a
およびcola_b
のみが戻されます。これは、これらのMBRには4.1以上の長さを持つ辺が少なくとも1つあるためです。円cola_d
は、そのMBRの各辺の長さが4の四角形であるため、除外されます。
SELECT c.mkt_id, c.name FROM cola_markets c WHERE SDO_FILTER(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(4,6, 8,8)), 'min_resolution=4.1' ) = 'TRUE'; MKT_ID NAME ---------- -------------------------------- 2 cola_b 1 cola_a
次の例では、GEOMETRY列のオブジェクトが、GIDに1の値を持つQUERY_POLYS表のGEOMETRY列オブジェクトと空間的に相互作用する場合に、POLYGONS表からGIDの値を検索します。
SELECT A.gid FROM Polygons A, query_polys B WHERE B.gid = 1 AND SDO_FILTER(A.Geometry, B.Geometry) = 'TRUE';
次の例では、GEOMETRY列オブジェクトが、aGeom
変数に格納されているジオメトリと空間的に相互作用する場合に、POLYGONS表からGIDの値を検索します。
Select A.Gid FROM Polygons A WHERE SDO_FILTER(A.Geometry, :aGeom) = 'TRUE';
次の例では、GEOMETRY列オブジェクトが、左下の座標に(x1,y1)、右上の座標に(x2, y2)を持つ、指定した矩形と空間的に相互作用する場合に、POLYGONS表からGIDの値を検索します。
Select A.Gid FROM Polygons A WHERE SDO_FILTER(A.Geometry, sdo_geometry(2003,NULL,NULL, sdo_elem_info_array(1,1003,3), sdo_ordinate_array(x1,y1,x2,y2)) ) = 'TRUE';
次の例では、GEOMETRY列オブジェクトが、QUERY_POLYS表のGEOMETRY列オブジェクトに格納されているジオメトリと空間的に相互作用する場合に、POLYGONS表からGIDの値を検索します。この例では、ORDEREDオプティマイザ・ヒントを使用し、FROM句の最初にQUERY_POLYS(geometry2
)表を指定します。これは、geometry2
の複数のジオメトリが含まれるためです(「使用上の注意」を参照)。
SELECT /*+ ORDERED */ A.gid FROM query_polys B, polygons A WHERE SDO_FILTER(A.Geometry, B.Geometry) = 'TRUE';
説明
表内のジオメトリに、特定のジオメトリとのINSIDE位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=INSIDE'
を含めて指定する場合と同じです。
この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 | 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。 |
geometry2 | 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。 |
戻り値
式SDO_INSIDE(geometry1,geometry2) = 'TRUE'は、INSIDE位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。
使用上の注意
この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。
位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(5,6)、右上の座標が(12,12)の矩形)とINSIDE関係を持つジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、cola_d
(円)のみが問合せウィンドウ・ジオメトリの内部にあります。
SELECT c.mkt_id, c.name FROM cola_markets c WHERE SDO_INSIDE(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(5,6, 12,12)) ) = 'TRUE'; MKT_ID NAME ---------- -------------------------------- 4 cola_d
構文
SDO_JOIN(table_name1, column_name1, table_name2, column_name2, params, preserve_join_order, table1_partition, table2_partition) RETURN SDO_ROWIDSET;
キーワードおよびパラメータ
値 | 説明 |
---|---|
table_name1 | 空間結合操作で使用される最初の表の名前を指定します。この表には、SDO_GEOMETRY型の列が含まれている必要があります。データ型はVARCHAR2です。 |
column_name1 | table_name1 内のSDO_GEOMETRY型の空間列の名前を指定します。空間Rツリー索引は、この列に定義する必要があります。データ型はVARCHAR2です。 |
table_name2 | 空間結合操作で使用される2つ目の表の名前を指定します。(table_name1 と同じでも異なるものでもかまいません。table_name2 がtable_name1 と同じ場合は、この項の「自己結合の最適化」を参照してください。)この表には、SDO_GEOMETRY型の列が含まれている必要があります。データ型はVARCHAR2です。 |
column_name2 | table_name2 内のSDO_GEOMETRY型の空間列の名前を指定します。空間Rツリー索引は、この列に定義する必要があります。データ型はVARCHAR2です。 |
params | キーワードおよび値のオプションのパラメータ文字列です。mask=ANYINTERACT の場合にのみ利用できます。演算子の処理を指定します。使用可能なキーワードについては、「使用上の注意」の表19-3を参照してください。データ型はVARCHAR2です。デフォルトはNULLです。 |
preserve_join_order | 演算子の処理中に結合順序が保持されることが保証されている場合に指定するオプションのパラメータです。この値が0 (デフォルト)の場合、表の順序は変更される場合があります。1 の場合、表の順序は変更されません。データ型はNUMBERです。デフォルトは0 (ゼロ)です。 |
table1_partition | table_name1 内の表パーティションの名前を指定します。表にパーティション空間索引がある場合は指定する必要があります。表にパーティション空間索引がない場合はNULLである必要があります。(パーティション空間索引の使用方法については、5.1.3項を参照。)データ型はVARCHAR2です。デフォルトはNULLです。 |
table2_partition | table_name2 内の表パーティションの名前を指定します。表にパーティション空間索引がある場合は指定する必要があります。表にパーティション空間索引がない場合はNULLである必要があります。(パーティション空間索引の使用方法については、5.1.3項を参照。)データ型はVARCHAR2です。デフォルトはNULLです。 |
戻り値
SDO_JOINは、SDO_ROWIDSETのオブジェクトを戻します。このオブジェクトは、SDO_ROWIDPAIRのオブジェクトの表で構成されます。Oracle Spatialは、SDO_ROWIDSET型を次のとおり定義します。
CREATE TYPE sdo_rowidset as TABLE OF sdo_rowidpair;
また、SDO_ROWIDPAIRオブジェクト型を次のとおり定義します。
CREATE TYPE sdo_rowidpair AS OBJECT (rowid1 VARCHAR2(24), rowid2 VARCHAR2(24));
SDO_ROWIDPAIRの定義では、rowid1
はtable_name1
のROWIDを示し、rowid2
はtable_name2
のROWIDを示します。
使用上の注意
厳密には、SDO_JOINは演算子ではなくテーブル・ファンクションです。(テーブル・ファンクションについては、『Oracle Database PL/SQL言語リファレンス』を参照してください。)ただし、使用方法が演算子に類似し、他のファンクションおよびプロシージャと同じパッケージに同梱されていないため、Spatial演算子の章で説明しています。
このテーブル・ファンクションは、全表結合を実行する必要がある場合に使用することをお薦めします。
column_name1
およびcolumn_name2
内のジオメトリのSRID(座標系)値および次元数は、すべて同じである必要があります。
パフォーマンスを向上させるには、/*+ ORDERED */
オプティマイザ・ヒントを使用し、FROM句の最初にSDO_JOINテーブル・ファンクションを指定します。
表がバージョン対応(Workspace Manager機能を使用)である場合は、Workspace Managerにより作成された<table_name>
_LT
表を指定する必要があります。たとえば、COLA_MARKETS表がバージョン対応の場合、その表で空間結合の操作を行うには、SDO_JOINテーブル・ファンクションを使用して、COLA_MARKETS_LT(COLA_MARKETSではなく)を指定します。(ただし、その他すべてのSpatialのファンクション、プロシージャおよび演算子には、<table_name>
_LT
名は使用できません。)
表19-3に、params
パラメータのキーワードを示します。
表19-3 SDO_JOIN演算子のparamsキーワード
キーワード | 説明 |
---|---|
mask |
空間結合の位相関係を指定します。有効な値は、'mask=<value>'です。<value>は、SDO_RELATE演算子に有効な1つ以上のマスク値( このパラメータがNULLであるか、または空の文字列を含む場合、 |
距離 |
関係チェックが実行される前に許容差(1.5.5項を参照)に追加される距離値を数値で指定します。たとえば、許容差が10 mのときに |
unit |
距離値に関連付ける測定単位を指定します( |
SDO_JOINをコールする前に、セッション内で前のすべてのDML文をコミットする必要があります。コミットしない場合、「ORA-13236: R-treeの処理で内部エラーが発生しました: [SDO_Join in active txns not supported]」
というエラーが戻されます。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。
自己結合(table_name1
およびtable_name2
が同じ表を指定)を実行する場合、自己結合を最適化することでパフォーマンスを向上できます。
マスク(ANYINTERACT
など)または距離を指定せずにSDO_JOINをコールすると、結合される2つのジオメトリ列の索引構造のみが比較されます。これで、相互に作用するジオメトリのペアを簡単に識別することができます。マスクまたは距離を指定してSDO_JOINをコールすると、相互に作用するジオメトリのペアを識別するために索引が使用された後、ジオメトリのペアが実際に相互作用しているかどうかを確認するためにジオメトリの座標も比較されます。座標の比較は、SDO_JOINの操作で最もコストの高い動作になります。
同じジオメトリ列をそれ自身と比較する自己結合では、各ジオメトリ・ペアが結果セットで2回戻されます。次に例を示します。
ID値(1,2)を持つジオメトリ・ペアの場合、そのペア(2,1)も戻されます。SDO_JOINでは、同じジオメトリ・ペアの座標が、不要であるにもかかわらず、1回ではなく2回比較されます。
同じIDペアが2回戻されます。たとえば、50,000行を持つ表では、IDペア(1,1)が2回、IDペア(2,2)が2回というように戻されます。これも不要な動作です。
自己結合でSDO_JOINをコールする場合、ジオメトリ・ペアの重複する比較や、ペアのID値が同じ座標の比較を行わないことで、このような不要な動作を回避できます。この最適化は、1次フィルタに対してのみSDO_JOINを使用し、SDO_GEOM.RELATEファンクションをコールしてジオメトリ座標を比較します。次の文では、WHERE
句の条件としてAND b.rowid < c.rowid
を追加することで最適化を行っています。
SQL> set autotrace trace explain SQL> SELECT /*+ ordered use_nl (a,b) use_nl (a,c) */ b.id, c.id FROM TABLE(sdo_join('GEOD_STATES','GEOM','GEOD_STATES','GEOM')) a, GEOD_STATES b, GEOD_STATES c WHERE a.rowid1 = b.rowid AND a.rowid2 = c.rowid AND b.rowid < c.rowid AND SDO_GEOM.RELATE (b.geom, 'ANYINTERACT', c.geom, .05) = 'TRUE' Execution Plan ---------------------------------------------------------- Plan hash value: 1412731386 --------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 1124 | 12787 (1)| 00:02:34 | | 1 | NESTED LOOPS | | 1 | 1124 | 12787 (1)| 00:02:34 | | 2 | NESTED LOOPS | | 4574 | 2514K| 8206 (1)| 00:01:39 | | 3 | COLLECTION ITERATOR PICKLER FETCH| SDO_JOIN | | || | |* 4 | TABLE ACCESS BY USER ROWID | GEOD_STATES | 1 | 561 |1 (0)| 00:00:01 | |* 5 | TABLE ACCESS BY USER ROWID | GEOD_STATES | 1 | 561 |1 (0)| 00:00:01 | Predicate Information (identified by operation id): --------------------------------------------------- 4 - access(CHARTOROWID(VALUE(KOKBF$))) 5 - access(CHARTOROWID(VALUE(KOKBF$))) filter("B".ROWID<"C".ROWID AND "SDO_GEOM"."RELATE"("B"."GEOM",'ANYINTERACT',"C"."GEOM",.05)='TRUE') SQL> set autotrace off
前述の例では、AND b.rowid < c.rowid
は、WHERE
句内でSDO_GEOM.RELATEのコールの前に記述することが重要です。これにより、SDO_GEOM.RELATEファンクションの起動による不要な動作を省略できます。この例では、ORDERED
およびUSE_NL
ヒントを使用していること、および実行計画にTABLE ACCESS FULL
またはHASH JOIN
が含まれていないことに注意してください。
空間表とその空間表に作成された空間索引の索引表の両方に対するSELECT権限を付与されている場合は、自分のスキーマにない索引付けされた表でSDO_JOINテーブル・ファンクションを起動できます。空間索引の索引表の名前を検索するには、USER_SDO_INDEX_METADATAビューでSDO_INDEX_TABLE列を問い合せます。たとえば、次の文では、COLA_MARKETS_IDX空間索引の索引表の名前が戻されます。
SELECT sdo_index_table FROM user_sdo_index_metadata WHERE sdo_index_name = 'COLA_SPATIAL_IDX';
ユーザーAが空間表T1 (および索引表MDRT_F9AA$)を所有し、ユーザーBが空間表T2を所有し、T1とT2両方のジオメトリを結合する必要があるとします。また、両方の表でジオメトリ列の名前がGEOMETRYであるとします。
ユーザーAまたは適切な権限を付与されたユーザーが、ユーザーAとして接続し、次の文を実行する必要があります。
GRANT select on T1 to B; GRANT select on MDRT_F9AA$ to B;
これで、ユーザーBが接続し、SDO_JOIN問合せを実行できます。次に例を示します。
SELECT COUNT(*) FROM (SELECT * FROM TABLE(SDO_JOIN('A.T1', 'GEOMETRY', 'B.T2', 'GEOMETRY', 'mask=anyinteract')) );
例
次の例では、COLA_MARKETS表をその表自体と結合し、各ジオメトリを調べてその表と空間的に相互作用する他のすべてのジオメトリを検索します。(例では、2.1項の定義およびデータを使用しています。)この例では、rowid1
およびrowid2
は、SDO_ROWIDPAIR型の定義内の属性名に対応しています。出力で、cola_d
(図2-1の円)がそれ自体とのみ相互作用し、他のジオメトリとは相互作用していないことに注意してください。
SELECT /*+ ordered */ a.name, b.name FROM TABLE(SDO_JOIN('COLA_MARKETS', 'SHAPE', 'COLA_MARKETS', 'SHAPE', 'mask=ANYINTERACT')) c, cola_markets a, cola_markets b WHERE c.rowid1 = a.rowid AND c.rowid2 = b.rowid ORDER BY a.name; NAME NAME -------------------------------- -------------------------------- cola_a cola_c cola_a cola_b cola_a cola_a cola_b cola_c cola_b cola_b cola_b cola_a cola_c cola_c cola_c cola_b cola_c cola_a cola_d cola_d 10 rows selected.
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 | 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。 |
geometry2 | 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。geometry1 のジオメトリのうち、geometry2 に最も近いジオメトリが戻されます。(geometry2 は、バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。 |
param | 演算子の処理を指定します。表19-4に、使用可能なキーワードを示します。このパラメータを指定しない場合、演算子によって、すべての行がgeometry2 からの距離の昇順で戻されます。データ型はVARCHAR2です。 |
number | SDO_NNへのコールにSDO_NN_DISTANCE補助演算子が含まれている場合、SDO_NN_DISTANCEへのコールに使用されている数と同じ数を指定します。データ型はNUMBERです。 |
表19-4に、param
パラメータのキーワードを示します。
表19-4 SDO_NN Paramパラメータのキーワード
キーワード | 説明 |
---|---|
距離 |
最も近くにあるものの検索を中止する、距離単位の数を指定します。 例: 'distance=10 unit=mile' |
sdo_batch_size |
WHERE句を満たす結果の数を戻すためにSDO_NN式の評価を2回以上行う必要がある場合、一度に評価される行の数を指定します。Rツリー索引が使用される場合のみ使用可能です。 例: 'sdo_batch_size=10' |
sdo_num_res |
例: 'sdo_num_res=5' |
unit |
SDO_NNへのコールに 例: 'unit=KM' |
戻り値
この演算子では、問合せでgeometry2
の最も近くにある、sdo_num_res
に指定した数のオブジェクトをgeometry1
から戻します。2つのオブジェクトの近さを判断するには、各オブジェクトの領域上にある2点間の最短距離が使用されます。
使用上の注意
表に空間索引が含まれない場合、または索引の作成時に指定された次元数と問合せウィンドウの次元数が一致しない場合、この演算子は無効になります。
この演算子は、常にWHERE句で使用される必要があり、この演算子を含む条件式は、SDO_NN(arg1, arg2, '<some_parameter>') = 'TRUE'の形式である必要があります。
この演算子は、次の2つの方法で使用できます。
レイヤーのすべてのジオメトリが候補である場合、sdo_num_res
キーワードを使用して、戻されるジオメトリの数を指定します。
sdo_num_res
キーワードは、近接性のみを考慮する場合に特に役立ちます(たとえば、銀行名に関係なく、最も近い3つの銀行など)。
表のジオメトリが、WHERE句で指定されたジオメトリより近くにある場合、sdo_batch_size
キーワードを使用し、WHERE句(ROWNUM疑似列を含む)を使用して、戻されるジオメトリの数を制限します。
sdo_batch_size
キーワードは、同じ表の1つ以上の列を、WHERE句の最も近くにある検索列として考慮する必要がある場合に特に役立ちます(たとえば、名前にMegaBankが含まれる最も近い3つの銀行など)。
sdo_batch_size
キーワードの例のように、RESTAURANTS表に様々なタイプのレストランが含まれ、ホテルに最も近い2軒のイタリアン・レストラン(ただし、2マイル以内)を検索する必要があると想定します。問合せは次のようになります。
SELECT r.name FROM restaurants r WHERE SDO_NN(r.geometry, :my_hotel, 'sdo_batch_size=10 distance=2 unit=mile') = 'TRUE' AND r.cuisine = 'Italian' AND ROWNUM <=2;
この例では、CUISINEがItalian
である場合、結果が3つ以上戻されないように制限するには、ROWNUM <=2
句を指定する必要があります。ただし、この例でsdo_batch_size
キーワードが指定されず、またsdo_num_res=2
がROWNUM <=2
のかわりに指定されている場合、CUISINE値に関係なく、2マイル以内にある最も近い2軒のレストランのみが考慮され、また、考慮される2つの行のCUISINE値がItalian
でない場合、この問合せでは行が戻されない可能性があります。
sdo_batch_size
値は、最も近くにあるものの問合せのパフォーマンスに影響する可能性があります。一般的なガイドラインとして、WHERE句を満たすと考えられる候補行の数を指定することをお薦めします。イタリアン・レストランに対する問合せの例では、ホテルに近いレストランの約20%がイタリアン・レストランであり、2軒のレストランを検索する場合は、sdo_batch_size
値を10に指定すると、最適なパフォーマンスが得られます。一方、ホテルに近いレストランの約5%のみがイタリアン・レストランであり、2軒のレストランを検索する場合は、sdo_batch_size
値を40に指定することをお薦めします。
sdo_batch_size=0
を指定できます。この場合、結果セットのサイズに適したバッチ・サイズがSpatialによって計算されます。ただし、計算されたバッチ・サイズが最適ではない場合もあり、この計算によって処理オーバーヘッドが発生する場合もあります。問合せに対する適切なsdo_batch_size
値を判断できる場合は、sdo_batch_size=0
を指定した場合より高いパフォーマンスを得ることができます。
sdo_batch_size
キーワードが指定されている場合、sdo_num_res
値は無視されます。両方のキーワードを指定しないでください。
SDO_NNへのコールでSDO_NN_DISTANCE補助演算子を使用している場合のみ、number
パラメータを指定します。この章に示すSDO_NN_DISTANCE演算子の項を参照してください。
geometry2
からの距離が等しい2つ以上のオブジェクトがgeometry1
から戻される場合、ファンクションをコールするたびにどのオブジェクトでも戻される可能性があります。たとえば、item_a
、item_b
およびitem_c
がgeometry2
に最も近く、かつ等しい距離にある場合、sdo_num_res=2
を指定すると、これら3つのオブジェクトのうちの2つが戻されますが、3つのすべてのオブジェクトが、戻される2つのオブジェクトになる可能性があります。
SDO_NN演算子でパーティション化された空間索引(5.1.3項を参照)が使用される場合、問合せ条件に基づく候補行が含まれるパーティションごとに、要求された数のジオメトリが戻されます。たとえば、ある点に最も近い5軒のレストランを要求し、空間索引が4つのパーティションを持つ場合、この演算子によって最大20(5×4)のジオメトリが戻されます。この場合、ROWNUM疑似列(この場合はWHERE ROWNUM <=5
)を使用して、5軒の最も近いレストランを戻す必要があります。
geometry1
およびgeometry2
が異なる座標系に基づいている場合、geometry2
は、6.10.1項で説明するとおり、操作を実行するため一時的にgeometry1
の座標系に変換されます。
SDO_NNでは空間結合をサポートしていません。
オプティマイザ・ヒントによって索引を強制的に使用しないかぎり、SDO_NN演算子が空間索引を使用しない場合があります。これは、結合を含む問合せを発行した場合に発生します。また、このような場合に、オプティマイザ・ヒントを使用しないと内部エラーが発生します。このようなエラーを防ぐには、問合せの複雑さに関係なく、常にオプティマイザ・ヒントが、SDO_NN演算子とともに空間索引を使用するように指定する必要があります。次に、COLA_MARKETS表で定義されたCOLA_SPATIAL_IDX索引を使用するように指定する問合せの例を示します。
SELECT /*+ INDEX(c cola_spatial_idx) */ c.mkt_id, c.name, ... FROM cola_markets c, ...;
ただし、WHERE句内の列の条件により、関連付けられた索引を持つgeometry1
の表で非空間列が1つでも指定されている場合は、その索引にNO_INDEXヒントを指定して、その索引が使用されないようにする必要があります。たとえば、COLA_NAME_IDXという名前の索引がNAME列に定義されている場合は、次のとおり前述の例にヒントを指定する必要があります。
SELECT /*+ INDEX(c cola_spatial_idx) NO_INDEX(c cola_name_idx) */ c.mkt_id, c.name, ... FROM cola_markets c, ...;
(ただし、2.1項の例にはCOLA_NAME_IDXという名前の索引は含まれていないことに注意してください。)
SDO_NN演算子とsdo_num_res
キーワードを使用して2つ以上の表を結合する場合、外部表にはLEADINGヒントを、ネステッド・ループ・ジョインを使用するためにUSE_NLヒントを、内部表(空間索引を持つ表)にはINDEXヒントを指定します。次に例を示します。
SELECT /*+ LEADING(b) USE_NL(b a) INDEX(a cola_spatial_idx) */ a.gid FROM cola_qry b, cola_markets a WHERE SDO_NN(a.shape, b.shape, 'sdo_num_res=1')='TRUE';
ただし、SDO_NN演算子、sdo_batch_size
キーワードおよびROWNUM句を使用して2つ以上の表を結合する場合、最適なロジックの実装方法は、PL/SQLブロックを使用することになります。次に例を示します。
BEGIN FOR item IN ( SELECT b.shape FROM cola_qry b) LOOP SELECT /*+ INDEX(a cola_spatial_idx) */ a.gid INTO local_gid FROM cola_markets a WHERE SDO_NN(a.shape, item.shape, 'sdo_batch_size=10')='TRUE' and a.name like 'cola%' and ROWNUM <2; END LOOP; END;
オプティマイザ・ヒントの使用方法については、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。
例
次の例では、COLA_MARKETS表のSHAPE列から、指定した点(10,7)に最も近い2つのオブジェクトを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)
SELECT /*+ INDEX(c cola_spatial_idx) */ c.mkt_id, c.name FROM cola_markets c WHERE SDO_NN(c.shape, sdo_geometry(2001, NULL, sdo_point_type(10,7,NULL), NULL, NULL), 'sdo_num_res=2') = 'TRUE'; MKT_ID NAME ---------- -------------------------------- 2 cola_b 4 cola_d
次の例では、sdo_batch_size
キーワードを使用して、COLA_MARKETS表のSHAPE列から、指定された点(10,7)に最も近い、NAME値が「cola_d」未満の2つのオブジェクト(ROWNUM <=2)を検索します。sdo_batch_size
の3という値は、WHERE句の条件を満たすかどうかを判断する前に評価する必要がある、最も近いジオメトリの数の最適な推測値を表します。(例では、2.1項の定義およびデータを使用しています。)
SELECT /*+ INDEX(c cola_spatial_idx) */ c.mkt_id, c.name FROM cola_markets c WHERE SDO_NN(c.shape, sdo_geometry(2001, NULL, sdo_point_type(10,7,NULL), NULL, NULL), 'sdo_batch_size=3') = 'TRUE' AND c.name < 'cola_d' AND ROWNUM <= 2; MKT_ID NAME ---------- -------------------------------- 2 cola_b 3 cola_c
SDO_NNのより複雑な例については、C.3項を参照してください。
使用上の注意
SDO_NN_DISTANCEは、SDO_NN演算子の補助演算子です。この補助演算子は、指定されたジオメトリと最も近くにあるオブジェクトの間の距離を戻します。この距離は、補助データとしてSDO_NN演算子に渡されます。(演算子での補助データの使用方法については、『Oracle Databaseデータ・カートリッジ開発者ガイド』のドメイン索引の章に示す補助データの項を参照してください。)
number
パラメータには任意の数を選択できます。ただし、SDO_NN演算子へのコールの最後のパラメータと一致させる必要があります。
距離値を格納および操作するには、バインド変数を使用します。
例
次の例では、COLA_MARKETS表のSHAPE列から、指定した点(10,7)に最も近い2つのオブジェクトを検索し、各オブジェクトと点の間の距離を戻します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)
SELECT /*+ INDEX(c cola_spatial_idx) */ c.mkt_id, c.name, SDO_NN_DISTANCE(1) dist FROM cola_markets c WHERE SDO_NN(c.shape, sdo_geometry(2001, NULL, sdo_point_type(10,7,NULL), NULL, NULL), 'sdo_num_res=2', 1) = 'TRUE' ORDER BY dist; MKT_ID NAME DIST ---------- -------------------------------- ---------- 4 cola_d .828427125 2 cola_b 2.23606798
この例では、次のことに注意してください。
SDO_NN_DISTANCEのnumber
パラメータに1が使用されます。また、SDO_NNの最後のパラメータ('sdo_num_res=2'
の後)に1が指定されます。
列の別名dist
には、オブジェクトと点の間の距離が含まれます。(測地データの場合、距離の単位はmです。非測地データの場合、距離の単位はデータに関連付けられた単位です。)
次の例では、sdo_batch_size
キーワードを使用して、様々な業種を含むYELLOW_PAGES表からホテルに最も近い2軒のイタリアン・レストランを選択します。
SELECT * FROM (SELECT /*+ FIRST_ROWS */ y.name FROM YELLOW_PAGES y WHERE SDO_NN(y.geometry, :my_hotel, 'sdo_batch_size=100', 1) = 'TRUE' AND y.business = 'Italian Restaurant' ORDER BY SDO_NN_DISTANCE(1)) WHERE ROWNUM <=10;
前述の問合せでは、FIRST_ROWSヒントにより、空間索引にORDER BY操作をプッシュして、オプティマイザのパフォーマンスを向上できます。 :my_hotel
は、バインド変数またはリテラル値のいずれかです。
FIRST_ROWSヒントは、ローカル・パーティション空間索引でも使用できます。前述の例では、YELLOW_PAGES表が名前でパーティション化されている場合、問合せは次のように実行されます。
パーティションごとに、10行が検出されるまで、空間索引を使用してORDER BY操作が処理されます。
すべてのパーティションが完了すると、前述の手順で検出されたすべての行がソートされ、上位10行が戻されます。
説明
表内のジオメトリに、特定のジオメトリとのON位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=ON'
を含めて指定する場合と同じです。
この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 | 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。 |
geometry2 | 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。 |
使用上の注意
この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。
位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)とON関係を持つジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、SHAPE列に線ストリング・ジオメトリが存在しないため、行が戻されません。
SELECT c.mkt_id, c.name FROM cola_markets c WHERE SDO_ON(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(4,6, 8,8)) ) = 'TRUE'; no rows selected
説明
表内のジオメトリに、特定のジオメトリとのOVERLAPBDYDISJOINT位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=OVERLAPBDYDISJOINT'
を含めて指定する場合と同じです。
この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 | 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。 |
geometry2 | 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。 |
戻り値
式SDO_OVERLAPBDYDISJOINT(geometry1,geometry2) = 'TRUE'は、OVERLAPBDYDISJOINT位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。
使用上の注意
この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。
位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。
例
次の例では、線ストリング・ジオメトリ(ここでは、(0,6)から(2,6)の水平な線)とOVERLAPBDYDISJOINT関係があるジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、cola_a
のみが線ストリング・ジオメトリとOVERLAPBDYDISJOINT関係を持っています。
SELECT c.mkt_id, c.name FROM cola_markets c WHERE SDO_OVERLAPBDYDISJOINT(c.shape, SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,2,1), SDO_ORDINATE_ARRAY(0,6, 2,6)) ) = 'TRUE'; MKT_ID NAME ---------- -------------------------------- 1 cola_a
説明
表内のジオメトリに、特定のジオメトリとのOVERLAPBDYINTERSECT位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=OVERLAPBDYINTERSECT'
を含めて指定する場合と同じです。
この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 | 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。 |
geometry2 | 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。 |
戻り値
式SDO_OVERLAPBDYINTERSECT(geometry1,geometry2) = 'TRUE'は、OVERLAPBDYINTERSECT位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。
使用上の注意
この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。
位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)とOVERLAPBDYINTERSECT関係を持つジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、cola_a
、cola_b
およびcola_d
が問合せウィンドウ・ジオメトリとOVERLAPBDYINTERSECT関係を持っています。
SELECT c.mkt_id, c.name FROM cola_markets c WHERE SDO_OVERLAPBDYINTERSECT(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(4,6, 8,8)) ) = 'TRUE'; MKT_ID NAME ---------- -------------------------------- 2 cola_b 1 cola_a 4 cola_d
説明
表内のジオメトリが特定のジオメトリと重なっているかどうか(OVERLAPBDYDISJOINTまたはOVERLAPBDYINTERSECT位相関係があるかどうか)を確認します。SDO_RELATE演算子に'mask=OVERLAPBDYDISJOINT+OVERLAPBDYINTERSECT'
を含めて指定する場合と同じです。
この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 | 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。 |
geometry2 | 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。 |
戻り値
式SDO_OVERLAPS(geometry1,geometry2) = 'TRUE'は、OVERLAPBDYDISJOINTまたはOVERLAPBDYINTERSECT位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)と重なるジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、SHAPE列内の3つのジオメトリが問合せウィンドウ・ジオメトリと重なります。
SELECT c.mkt_id, c.name FROM cola_markets c WHERE SDO_OVERLAPS(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(4,6, 8,8)) ) = 'TRUE'; MKT_ID NAME ---------- -------------------------------- 2 cola_b 1 cola_a 4 cola_d
説明
(対象領域のような)指定されたオブジェクトと空間的に相互作用するオブジェクトの集合を識別したり、指定した2つのオブジェクトが相互作用するかどうかを判断します。
この演算子は、1次フィルタおよび2次フィルタ処理を実行します。
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 | 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。 |
geometry2 | 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。 |
param | mask キーワードを指定します。またオプションで、min_resolution キーワードまたはmax_resolution キーワード(あるいはその両方)を指定します。このパラメータのデータ型はVARCHAR2です。
下位互換性のために、リリース1(10.1)より前のリリースでサポートされていた、 |
戻り値
式SDO_RELATE(geometry1,geometry2, 'mask = <some_mask_val>') = 'TRUE'は、<some_mask_val>で指定した位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。
使用上の注意
表に空間索引が含まれない場合、または索引の作成時に指定された次元数と問合せウィンドウの次元数が一致しない場合、この演算子は無効になります。
この演算子は、常にWHERE句で使用される必要があり、この演算子を含む条件式は、SDO_RELATE(arg1, arg2, 'mask = <some_mask_val>') = 'TRUE'の形式である必要があります。
geometry2
は表から取り出されるか、または一時的なSDO_GEOMETRYオブジェクト(バインド変数、SDO_GEOMETRYコンストラクタなど)となります。
geometry2
列が空間索引付けされていない場合、演算子は問合せウィンドウをメモリー内で索引付けするため、高いパフォーマンスを実現します。
geometry2
の2つ以上のジオメトリが演算子に渡される場合は、ORDEREDオプティマイザ・ヒントが指定されている必要があり、geometry2
にある表をFROM句の最初に指定する必要があります。
geometry1
およびgeometry2
が異なる座標系に基づいている場合、geometry2
は、6.10.1項で説明するとおり、操作を実行するため一時的にgeometry1
の座標系に変換されます。
SDO_GEOM.RELATEファンクションとは異なり、DISJOINTおよびDETERMINEマスクは、SDO_RELATE演算子との関係マスクで許可されていません。これは、SDO_RELATEが、相互作用する候補を空間索引を使用して検索するため、DISJOINTまたはDETERMINEを満たす情報が索引に存在しないためです。
論理ブール演算子ORを使用して、'mask=touch+coveredby'
のように複数のマスクを組み合せることは可能ですが、空間問合せで各マスクを別々に指定し、UNION ALL構文を使用して結果を組み合せるとパフォーマンスが向上する場合があります。これは、マスクが同じSDO_RELATE演算子コールでグループ化されるのではなく、単一指定されるような場合に、Spatialが適用する内部最適化の結果です。(ただし、2つの例外として、inside+coveredby
およびcontains+covers
では、UNION ALL構文よりも組合せのパフォーマンスが向上します。)たとえば、論理ブール演算子ORを使用して複数のマスクをグループ化する次の問合せについて考えてみます。
SELECT a.gid FROM polygons a, query_polys B WHERE B.gid = 1 AND SDO_RELATE(A.Geometry, B.Geometry, 'mask=touch+coveredby') = 'TRUE';
この問合せについて、次のように、単一マスクが指定されている複数のSDO_RELATE演算子コールの結果を、UNION ALLを使用して組み合せると、パフォーマンスが向上します。
SELECT a.gid FROM polygons a, query_polys B WHERE B.gid = 1 AND SDO_RELATE(A.Geometry, B.Geometry, 'mask=touch') = 'TRUE' UNION ALL SELECT a.gid FROM polygons a, query_polys B WHERE B.gid = 1 AND SDO_RELATE(A.Geometry, B.Geometry, 'mask=coveredby') = 'TRUE';
線と複数点ジオメトリ(点クラスタ内の複数の点)の関係には次のことを考慮してください。単一線と、3つの点で構成される複数点ジオメトリの例(SDO_GTYPE = 2005など)を想定します。
線と相互作用する点が1つもない場合、線と点クラスタの関係はDISJOINTです。
1つの点が線の内部に位置し、他の2つの点が非接続である場合、線と点クラスタの関係はOVERLAPBDYDISJOINTです。
1つの点が線の境界(線の開始点または終了点)に位置し、他の2つの点が非接続である場合、線と点クラスタの関係はTOUCHです。
1つの点が線の境界(線の開始点または終了点)に、もう1つの点が線の内部に位置し、残りの1つの点が非接続である場合、線と点クラスタの関係はOVERLAPBDYINTERSECTではなく、OVERLAPBDYDISJOINTです。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。
例
次の例はSDO_FILTER演算子の例に類似しています。ただし、これらの例では、(mask
キーワードを使用して)相互作用の特定のタイプを識別し、空間的に相互作用しているかどうかも(概算ではなく)正確に判断します。
次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)と相互作用するジオメトリを選択します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)
SELECT c.mkt_id, c.name FROM cola_markets c WHERE SDO_RELATE(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(4,6, 8,8)), 'mask=anyinteract') = 'TRUE'; MKT_ID NAME ---------- -------------------------------- 2 cola_b 1 cola_a 4 cola_d
次の例は前述の例と同じですが、ジオメトリのMBRのうち少なくとも1つの辺が4.1以上のジオメトリのみを含む、という点で異なります。この場合、cola_a
およびcola_b
のみが戻されます。これは、これらのMBRには4.1以上の長さを持つ辺が少なくとも1つあるためです。円cola_d
は、そのMBRの各辺の長さが4の四角形であるため、除外されます。
SELECT c.mkt_id, c.name FROM cola_markets c WHERE SDO_RELATE(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(4,6, 8,8)), 'mask=anyinteract min_resolution=4.1') = 'TRUE'; MKT_ID NAME ---------- -------------------------------- 2 cola_b 1 cola_a
次の例では、GEOMETRY列のオブジェクトが、GIDに1の値を持つQUERY_POLYS表のGEOMETRY列オブジェクトと空間的に相互作用する場合に、POLYGONS表からGIDの値を検索します。
SELECT A.gid FROM Polygons A, query_polys B WHERE B.gid = 1 AND SDO_RELATE(A.Geometry, B.Geometry, 'mask=ANYINTERACT') = 'TRUE';
次の例では、GEOMETRY列オブジェクトが、aGeom
変数に格納されているジオメトリと空間的に相互作用する場合に、POLYGONS表からGIDの値を検索します。
SELECT A.Gid FROM Polygons A WHERE SDO_RELATE(A.Geometry, :aGeom, 'mask=ANYINTERACT') = 'TRUE';
次の例では、GEOMETRY列オブジェクトが、左下の座標に(x1,y1)、右上の座標に(x2, y2)を持つ指定した矩形と空間的に相互作用する場合に、POLYGONS表からGIDの値を検索します。
SELECT A.Gid FROM Polygons A WHERE SDO_RELATE(A.Geometry, sdo_geometry(2003,NULL,NULL, sdo_elem_info_array(1,1003,3), sdo_ordinate_array(x1,y1,x2,y2)), 'mask=ANYINTERACT') = 'TRUE';
次の例では、GEOMETRY列オブジェクトが、QUERY_POLYS表のGEOMETRY列オブジェクトに格納されているジオメトリと空間的に相互作用する場合に、POLYGONS表からGIDの値を検索します。この例では、ORDEREDオプティマイザ・ヒントを使用し、FROM句の最初にQUERY_POLYS (geometry2
)表を指定します。これは、geometry2
の複数のジオメトリが含まれるためです(「使用上の注意」を参照)。
SELECT /*+ ORDERED */ A.gid FROM query_polys B, polygons A WHERE SDO_RELATE(A.Geometry, B.Geometry, 'mask=ANYINTERACT') = 'TRUE';
説明
表内のジオメトリに、特定のジオメトリとのTOUCH位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=TOUCH'
を含めて指定する場合と同じです。
この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 | 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。 |
geometry2 | 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。 |
使用上の注意
この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。
位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(1,1)、右上の座標が(5,7)の矩形)とTOUCH関係を持つジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、cola_b
のみが問合せウィンドウ・ジオメトリとTOUCH関係を持っています。
SELECT c.mkt_id, c.name FROM cola_markets c WHERE SDO_TOUCH(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(1,1, 5,7)) ) = 'TRUE'; FROM cola_markets c MKT_ID NAME ---------- -------------------------------- 2 cola_b
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 | 表のジオメトリ列を指定します。この列には、オブジェクト(aGeom )から指定した距離内にあると判断されたジオメトリ・オブジェクトが格納されます。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。 |
aGeom | geometry1 にあるジオメトリ・オブジェクトからの距離を調べるオブジェクトを指定します。(バインド変数を使用した)表のジオメトリか、または(SDO_GEOMETRYコンストラクタを使用した)ジオメトリの一時的なインスタンスを指定します。データ型はSDO_GEOMETRYです。 |
params | 1つ以上のキーワード(値を含む)を引用符で囲んで、演算子の動作を判断する文字列を指定します。後続の項目(distance 、max_resolution 、min_resolution 、querytype およびunit )は、params パラメータに使用可能なキーワードです。データ型はVARCHAR2です。 |
距離 | 距離値を指定します。座標系がジオメトリに関連付けられている場合、距離の単位は座標系に関連付けられた単位であると想定されます。これは必須キーワードです。データ型はNUMBERです。 |
max_resolution | ジオメトリのMBRのうち少なくとも1つの辺が指定値以下のジオメトリのみを含みます。たとえば、max_resolution=10 キーワードに含まれるのは、ジオメトリのMBRの幅または高さ(あるいはその両方)が10以下であるジオメトリのみです。(このキーワードは対象として過大なジオメトリを除外するために使用できます。) |
min_resolution | ジオメトリのMBRのうち少なくとも1つの辺が指定値以上のジオメトリのみを含みます。たとえば、min_resolution=10 キーワードに含まれるのは、ジオメトリのMBRの幅または高さ(あるいはその両方)が10以上であるジオメトリのみです。(このキーワードは対象として過小なジオメトリを除外するために使用できます。) |
querytype | 'querytype=FILTER' を設定し、1次フィルタ処理のみを実行します。querytype が指定されていない場合、1次フィルタ処理および2次フィルタ処理の両方が実行されます(デフォルト)。データ型はVARCHAR2です。 |
unit | 測定単位(unit= およびMDSYS.SDO_DIST_UNITS表のSDO_UNIT値を引用符で囲んだ文字列で、たとえば'unit=KM' )を指定します。測定単位の指定の詳細は、2.10項を参照してください。データ型はNUMBERです。デフォルトは、データに関連付けられた測定単位です。測地データの場合、デフォルトはmです。 |
戻り値
式SDO_WITHIN_DISTANCE(arg1, arg2, arg3) = 'TRUE'は、指定した距離内にあるオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。
使用上の注意
2つの拡張オブジェクト(たとえば、線やポリゴンなど、点のないオブジェクト)の距離は、それら2つのオブジェクト間の最短距離です。そのため、2つの隣接したポリゴン間の距離は0(ゼロ)です。
表に空間索引が含まれない場合、または索引の作成時に指定された次元数と問合せウィンドウの次元数が一致しない場合、この演算子は無効になります。
この演算子は、常にWHERE句で使用される必要があり、この演算子を含む条件は、次の形式である必要があります。
SDO_WITHIN_DISTANCE(arg1, arg2, 'distance = <some_dist_val>') = 'TRUE'
ジオメトリ列には、空間索引が作成されている必要があります。測地データの場合、空間索引がRツリー索引である必要があります。
SDO_WITHIN_DISTANCEは、空間結合でサポートされていません。SDO_WITHIN_DISTANCE演算子で空間結合を実行する方法については、5.2.1.3項を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)から10距離以内のジオメトリを選択します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。この場合、図中のすべてのジオメトリが戻されます。)
SELECT c.name FROM cola_markets c WHERE SDO_WITHIN_DISTANCE(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(4,6, 8,8)), 'distance=10') = 'TRUE'; NAME -------------------------------- cola_b cola_a cola_c cola_d
次の例は前述の例と同じですが、ジオメトリのMBRのうち少なくとも1つの辺が4.1以上のジオメトリのみを含む、という点で異なります。この場合、cola_a
およびcola_b
のみが戻されます。これは、これらのMBRには4.1以上の長さを持つ辺が少なくとも1つあるためです。台形cola_c
は、そのMBRの各辺の長さが3と2であるため除外されます。また円cola_d
も、そのMBRの各辺の長さが4の四角形であるため除外されます。
SELECT c.name FROM cola_markets c WHERE SDO_WITHIN_DISTANCE(c.shape, SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3), SDO_ORDINATE_ARRAY(4,6, 8,8)), 'distance=10 min_resolution=4.1') = 'TRUE'; NAME -------------------------------- cola_b cola_a
次の例では、GEOMETRY列オブジェクトが、aGeom
変数に格納されているジオメトリの10距離単位内にある場合に、POLYGONS表からGIDの値を検索します。
SELECT A.GID FROM POLYGONS A WHERE SDO_WITHIN_DISTANCE(A.Geometry, :aGeom, 'distance = 10') = 'TRUE';
次の例では、GEOMETRY列オブジェクトが、左下の座標に(x1,y1)、右上の座標に(x2, y2)を持つ指定した矩形の10距離単位内にある場合に、POLYGONS表からGIDの値を検索します。
SELECT A.GID FROM POLYGONS A WHERE SDO_WITHIN_DISTANCE(A.Geometry, sdo_geometry(2003,NULL,NULL, sdo_elem_info_array(1,1003,3), sdo_ordinate_array(x1,y1,x2,y2)), 'distance = 10') = 'TRUE';
次の例では、QUERY_POINTS表のGIDの値が1で、POLYGONS.GEOMETRYオブジェクトがQUERY_POINTS.GEOMETRYオブジェクトの10距離単位内にある場合に、POLYGONS表からGIDの値を検索します。
SELECT A.GID FROM POLYGONS A, Query_Points B WHERE B.GID = 1 AND SDO_WITHIN_DISTANCE(A.Geometry, B.Geometry, 'distance = 10') = 'TRUE';
SDO_WITHIN_DISTANCEのより複雑な例については、C.2項を参照してください。