インデックスが欠落しているPostGISテーブルを見つけますか?


10

最近私は周りを見回していましたpg_stat_user_tablesが、いくつかの空間テーブルで多数の順次スキャンが見られたことに驚きました。案の定、これらのテーブルには空間インデックスがありませんでした。

インデックスのないジオメトリ列を持つすべてのテーブルを見つけるにはどうすればよいですか?


pg_stat_user_tablesへの参照をありがとう。あなたの知識のある人がそのような過ちを認めることは心強いことです。私がメンターしている職場の若い人たちには、いつも言っています。主キーの自然な候補がない場合は、シリアル列を追加します。常にSRIDとジオメトリタイプを定義します。常に空間インデックスを追加します。シーケンススキャンは100万行で機能する可能性があるためですが、ポイントがあります。
ジョンパウエル

回答:


9

空間インデックスが欠落しているテーブルは、システムテーブルをクエリすることで見つけることができます。

SELECT g.* 
FROM 
  (SELECT 
     n.nspname, 
     c.relname, 
     c.oid AS relid, 
     a.attname, 
     a.attnum 
   FROM pg_attribute a 
   INNER JOIN pg_class c ON (a.attrelid=c.oid)
   INNER JOIN pg_type t ON (a.atttypid=t.oid)
   INNER JOIN pg_namespace n ON (c.relnamespace=n.oid) 
   WHERE t.typname='geometry' 
   AND   c.relkind='r'
 ) g 
LEFT JOIN pg_index i ON (g.relid = i.indrelid AND g.attnum = ANY(i.indkey)) 
WHERE i IS NULL;

それはさらに良いWHERE t.typname IN ('geometry', 'geography') AND t.typtype='b'でしょうか?trac.osgeo.org/gdal/ticket/6896を参照してください。
user30184

@ user30184そのt.typtype = 'b'一部を説明できますか?
dbaston 2017年

1
実はダメです。GDALのコード変更は、標準のPostgreSQLデータベースに「geometry」という名前のテーブルがある場合のまれな状況に対処するためのものでした。pg_typeにもエントリがありますが、typtype = 'c'です。ただし、PostGISがインストールされている場合、そのような状況に終止符を打つことはできません。create table "geometry" (foo text);与えるERROR: type "geometry" already exists HINT: A relation has an associated type of the same name, so you must use a name that doesn't conflict with any existing type.
user30184 2017年

6

不足しているすべてのインデックスを自動的に作成できる関数を作成しました。「シミュレート」パラメータを使用すると、不足している空間インデックスのリストを取得できますが、CREATE INDEXは実行されません。

https://gist.github.com/mdouchin/cfa0e37058bcf102ed490bc59d762042を参照してください

不足しているインデックスのリストを取得するには、次を実行します。

SELECT * FROM create_missing_spatial_indexes(True)

必要なインデックスを作成するには、次のコマンドを実行します。

SELECT * FROM create_missing_spatial_indexes()

または

SELECT * FROM create_missing_spatial_indexes(False)

魅力のように働いた!素晴らしいツール。
RyanKDalton 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.