FAQ 技術情報:OracleでST_GEOMETRY列とST_SPATIAL_INDEXの統計情報をユーザが定義する方法

ナレッジ番号:2696 | 登録日:2023/05/29 | 更新日:2023/06/21

■概要

OracleでST_GEOMETRY列とST_SPATIAL_INDEXの統計をユーザ定義する方法を紹介します。統計情報は、SQL文が実行されるときにOracleのオプティマイザがデータの取得に最適なアクセスパスを選択する際に使用されます。ST_GEOMETRYおよびST_SPATIAL_INDEXは統計情報を持ち、Oracleのオプティマイザがアクセスパスに空間インデックスを使用するかどうかを判断するためにST_DOMAIN_STATSタイプによって使われます。

統計情報はArcCatalogの[分析]コマンドまたはOracleのDBMS_STATS.GATHER_TABLE_STATSプロシージャを使用してテーブルが分析されたときにテーブルおよびインデックスから収集されます。空間インデックスおよびST_GEOMETRY列が存在するテーブルの統計を収集した場合、ジオメトリおよびそのインデックスから追加の統計が収集され、ArcSDE管理者が所有するST_GEOMETRY_INDEXテーブルに格納されます。これらの統計の値は空間検索の選択性の導出およびオプティマイザがアクセスパスに空間インデックスを使った場合と、全表走査し検索対象の行をフィルタリングした場合のコストを算出するのに使用されます。

特定のユニークな条件下では、収集された統計情報が現在のデータの状態を的確に示していない場合があります。そのため、Oracleではテーブルおよびインデックスのユーザ定義の統計を設定する方法を用意しており、それはSDE.SPX_UTILプロシージャを使用することでST_GEOMETRYおよび空間インデックスの統計を設定する事ができます。

テーブルのST_GEOMETRYまたはST_SPATIAL_INDEXの統計の値を変更することで、空間的な関係演算子を含むSQL文を実行する際にオプティマイザの空間インデックスの使用およびアクセスパスを選択するコストの見積りに影響を与えます。

ユーザの統計情報が設定されている場合、次にテーブルの統計が収集された場合はユーザ定義の統計の値は上書きされます。

■手順

SDE.SPX_UTILパッケージはSET_COLUMN_STATSおよびSET_INDEX_STATSという2つのプロシージャを持ち、ユーザ定義の統計の値を設定する際に使用されます。


sde.spx_util.set_column_stats
 (owner          IN VARCHAR2,
  table_name     IN VARCHAR2,
  column_name    IN VARCHAR2,
  distcnt        IN NUMBER DEFAULT NULL,
  nullcnt        IN NUMBER DEFAULT NULL)

sde.spx_util.set_index_stats
 (owner          IN VARCHAR2,
  table_name     IN VARCHAR2,
  index_name     IN VARCHAR2,
  numrows        IN NUMBER DEFAULT NULL,
  numlblks       IN NUMBER DEFAULT NULL,
  clstfct        IN NUMBER DEFAULT NULL,
  density        IN NUMBER DEFAULT NULL,
  indlevel       IN NUMBER DEFAULT NULL)

以下の例はテーブルのNULLジオメトリの数と空間インデックスの密度(1グリッドの中に存在するジオメトリ数の平均)を設定しています。

ST_GEOMETRY列のNULLジオメトリの数を設定する場合、SDE.SPX_UTIL.SET_COLUMN_STATSプロシージャを実行します。


SQL> EXECUTE sde.spx_util.set_column_stats('tb','transformers','shape',NULL,3500);

 PL/SQL procedure successfully completed.

この例では、transformersテーブルは3,500行のNULLシェープを含んでいます。transformerオブジェクトは組織の資産を表し、transformersテーブルに含まれますが、まだ運用されておらず継続してデータを格納されているため、ジオメトリ値が無い場合があります。

NULLジオメトリの真の数を表現するために正確なカラム統計値を設定することで、Oracleのオプティマイザが空間的なクエリを実行する際に最適なアクセス・パスを選択することができるようになります。 NULLジオメトリの真の数を知ることで、オプティマイザによって返されるカーディナリティが誤ってNULLである行を含むことはありません。

空間インデックスの密度を設定するには、SDE.SPX_UTIL.SET_INDEX_STATSプロシージャを実行します。


EXECUTE sde.spx_util.set_index_stats('tb','poles','poles_shp_idx',NULL,NULL,NULL,125);

 PL/SQL procedure successfully completed.

この例ではpoleテーブルのpoles_shp_idxという名前の空間インデックスの密度の値を設定しています。密度の値を設定する事で、オプティマイザに各グリッドには平均125個のポールが存在しているという情報を提供します。空間検索が実行された場合、入力した検索範囲は検査および空間検索の選択性およびカーディナリティを計算するために使用されます。例えば空間検索の検索範囲がグリッドサイズの半分の大きさだった場合、クエリのカーディナリティは62(空間検索で62個のポールが返される可能性がある)になります。選択性は、テーブルのすべての行からNULLジオメトリを減算し、(密度に由来する)候補となるフィーチャの数で割って算出されます。空間インデックスを使用する場合のコストを計算する際の入力として使用されるため、選択性は非常に重要な数値となります。

メタデータ

カテゴリ

製品

バージョン