Знаходження таблиць PostGIS, у яких відсутні індекси?


10

Нещодавно я озирнувся pg_stat_user_tablesі здивувався, побачивши велику кількість послідовних сканувань на деяких моїх просторових таблицях. Звичайно, у цих таблицях не було просторових індексів.

Як я можу знайти всі таблиці з неіндексованою колонкою геометрії?


Дякуємо за посилання на 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;

Чи може бути ще краще як WHERE t.typname IN ('geometry', 'geography') AND t.typtype='b'? Див. Trac.osgeo.org/gdal/ticket/6896 .
користувач30184

@ user30184 Чи можете ви пояснити, що t.typtype = 'b'це?
дбастон

1
Це насправді марний шматок. Зміна коду в GDAL призначена для вирішення рідкісної ситуації, коли стандартна база даних PostgreSQL має таблицю з назвою "геометрія". Це також має запис у 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.
користувач30184

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.