2013-09-02 50 views
7

Trong PostgreSQL 9.2/PostGIS 2.0.2 Tôi đã có một chỉ mục trên một cột không gian, tạo ra vớiLàm thế nào để lực lượng thả chỉ số quan hệ trong postgresql?

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

Sau đó giảm chỉ số với

DROP INDEX tiger_data_sld_the_geom_gist; 

Nhưng bây giờ, khi tôi cố gắng để tái tạo, tôi gặp lỗi này:

# 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 

Rớt lại không hoạt động. Nó nói rằng chỉ số không tồn tại:

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

tôi đã không tìm thấy mối quan hệ "tiger_data_sld_the_geom_gist" trong bất kỳ danh sách các đối tượng cơ sở dữ liệu, đã cố gắng DROP TABLE, và đã tìm kiếm xung quanh các giải pháp.

Mối quan hệ bí ẩn này "tiger_data_sld_the_geom_gist" là gì và làm cách nào để xóa nó để tôi có thể tạo chỉ mục?

Edit:

Cũng đã thử khởi động lại máy chủ, và bán phá giá/giảm/tải lại bảng (giảm với CASCADE).

+0

Hãy thử một "SELECT * FROM pg_class" và xem những gì được liệt kê. Hãy thử nó có và không có điều kiện về relname, relnamespace và xem liệu việc sử dụng chỉ mục có tạo ra sự khác biệt hay không. –

+0

Rất tiếc, tôi không thấy nhận xét của bạn trước khi đăng giải pháp của mình. Tôi tưởng tượng rằng việc thực hiện lệnh SELECT sẽ không tiết lộ manh mối ngay bây giờ, vì tôi đã xây dựng lại mọi thứ. – kentr

Trả lời

11

Trừ khi bạn đang thiết lập các search_path GUC (hoặc ít nhất bao gồm) schema tiger_data, bạn cần phải thêm schema tên chỉ số phát hành các DROP INDEX (Tôi muốn sử dụng nó trong bất kỳ trường hợp cho an toàn):

DROP INDEX tiger_data.tiger_data_sld_the_geom_gist; 

Đó là vì chỉ mục luôn đi đến cùng một lược đồ của bảng thuộc về nó. Nếu ở trên không giải quyết vấn đề của bạn, bạn có thể kiểm tra xem tên mối quan hệ này tồn tại và trên mỗi schema nó là trong những điều sau:

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'; 

Nó sẽ trả lại loại (i cho chỉ số, r cho các bảng, S cho các chuỗi và v cho các chế độ xem) của bất kỳ mối quan hệ nào có tên tiger_data_sld_the_geom_gist và tên của giản đồ thuộc về.

+0

Câu trả lời của bạn đến trong khi tôi đang viết bài của tôi. Tôi không biết nếu điều này là chính xác hay không, vì vậy tôi sẽ cho phép cộng đồng bỏ phiếu nếu có. – kentr

+0

@kentr: Tôi không thể đảm bảo với 100% rằng đó là trường hợp, nhưng có vẻ như, cách tiếp cận của bạn (lạ, IMHO) dường như đã ẩn vấn đề thực sự ... – MatheusOl

+0

:-). Khi một cái búa không hoạt động, hãy sử dụng búa tạ ... (đó có nghĩa là sự hài hước tự ti). Tôi nghi ngờ có một phương pháp tốt hơn tôi. – kentr

0

Mặc dù không đặc biệt hiệu quả, điều này dường như đã làm các trick:

  1. Dump bảng với pg_dump.
  2. Thả bảng.
  3. Dump cơ sở dữ liệu bằng pg_dump.
  4. Thả cơ sở dữ liệu.
  5. Tạo lại cơ sở dữ liệu và tải lại từ tệp kết xuất.