Поиск таблиц PostGIS, в которых отсутствуют индексы?

10

Недавно я огляделся pg_stat_user_tablesи был удивлен, увидев большое количество последовательных сканирований на некоторых из моих пространственных таблиц. Конечно, в этих таблицах отсутствовали пространственные индексы.

Как найти все таблицы с неиндексированным столбцом геометрии?

dbaston
источник
Спасибо за ссылку на pg_stat_user_tables. Отрадно, что кто-то из ваших знаний допускает такие ошибки. Молодым работникам, которых я наставляю, я всегда говорю: если нет естественного кандидата на первичный ключ, добавьте серийный столбец. Всегда определяйте SRID и тип геометрии. Всегда добавляйте пространственный индекс. Поскольку сканирование последовательности может работать с миллионами строк, но наступает момент ... Делай, как я говорю, а не как я: D.
Джон Пауэлл

Ответы:

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;
dbaston
источник
Может ли быть еще лучше, как WHERE t.typname IN ('geometry', 'geography') AND t.typtype='b'? См. Trac.osgeo.org/gdal/ticket/6896 .
user30184
@ user30184 Можете ли вы объяснить t.typtype = 'b'это?
dbaston
1
Это на самом деле бесполезная штука. Изменение кода в GDAL было связано с редкой ситуацией, когда в стандартной базе данных PostgreSQL есть таблица с именем «geometry». Это также имеет запись в pg_type, но с typetype = '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
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)
user779641
источник
Работал как шарм! Отличный инструмент.
RyanKDalton