2013-09-02 24 views
7

W PostgreSQL 9.2/PostGIS 2.0.2 miałem indeksu na kolumnie przestrzennego, stworzony zJak wymusić indeks index w postgresql?

CREATE INDEX tiger_data_sld_the_geom_gist ON tiger_data.sld USING gist(the_geom); 

Następnie spadł indeks z

DROP INDEX tiger_data_sld_the_geom_gist; 

Ale teraz, gdy próbuję odtworzyć, ja ten błąd:

# CREATE INDEX tiger_data_sld_the_geom_gist ON tiger_data.sld USING gist(the_geom); 
ERROR: relation "tiger_data_sld_the_geom_gist" already exists 

Ponowne zrzucenie nie działa. Mówi, że indeks nie istnieje:

# DROP INDEX tiger_data_sld_the_geom_gist; 
ERROR: index "tiger_data_sld_the_geom_gist" does not exist 

nie znalazłem relację „tiger_data_sld_the_geom_gist” w dowolnej listy obiektów bazy danych, próbowali DROP TABLE, i szukał innych rozwiązań.

Co to jest ta tajemnicza relacja "tiger_data_sld_the_geom_gist" i jak ją usunąć, aby utworzyć indeks?

Edit:

Również próbowałem ponownego uruchamiania serwera, a dumping/upuszczanie/przeładowywania tabeli (spadł z kaskadą).

+0

Wypróbuj "SELECT * FROM pg_class" i zobacz, co jest na liście. Wypróbuj go bez warunku na relname, relnamesspace i zobacz, czy użycie indeksu robi różnicę. –

+0

Niestety, nie opublikowałem Twojego komentarza, zanim opublikowałem moje rozwiązanie. Wyobrażam sobie, że wykonanie SELECT nie ujawni teraz wskazówek, ponieważ wszystko przebudowałem. – kentr

Odpowiedz

11

Chyba że ustawienie search_path GUC (lub przynajmniej włącznie) schematu tiger_data, trzeba dodać schemat nazwy indeksu do wydawania DROP INDEX (ja go używać w każdym przypadku dla bezpieczeństwa):

DROP INDEX tiger_data.tiger_data_sld_the_geom_gist; 

To dlatego, że indeks zawsze przechodzi do tego samego schematu tabeli, do której należy. Jeśli powyższe kroki nie rozwiążą problemu, można sprawdzić, czy nazwa ta relacja istnieje i na każdym schemacie jest w następujące warunki:

SELECT r.relname, r.relkind, n.nspname 
FROM pg_class r INNER JOIN pg_namespace n ON r.relnamespace = n.oid 
WHERE r.relname = 'tiger_data_sld_the_geom_gist'; 

powróci rodzaju (i dla indeksów r dla tabel, S dla sekwencji i v dla widoków) dowolnej relacji, która ma nazwę tiger_data_sld_the_geom_gist i nazwę schematu, do którego należy.

+0

Twoja odpowiedź nadeszła, pisząc moją. Nie wiem, czy to prawda, czy nie, więc pozwolę, aby społeczność zagłosowała, jeśli tak. – kentr

+0

@kentr: Nie mogę zagwarantować ze 100%, że tak było, ale wydaje się, że twoje (dziwne, IMHO) podejście wydaje się ukrywać prawdziwy problem ... – MatheusOl

+0

:-). Kiedy młotek nie działa, użyj młota ... (to ma być humor z autodestrukcji). Podejrzewałem, że istnieje lepsza metoda niż moja. – kentr

0

Choć nie jest szczególnie efektywne, to wydaje się to zrobić trick:

  1. zrzucić stół pg_dump.
  2. Upuścić tabelę.
  3. Zrzuć bazę danych za pomocą pg_dump.
  4. Upuść bazę danych.
  5. Odtwórz bazę danych i załaduj ponownie z plików zrzutu.