Tạo chỉ mục không gian trong PostGIS trên toàn bộ lược đồ


9

Tôi đã tải một số shapefiles bằng SPIT (plugin QGIS) vào cơ sở dữ liệu PostGIS của mình. Các lớp này không có Chỉ mục không gian được tạo khi tải. Tôi tự hỏi liệu có cách nào để tạo Chỉ mục không gian cho mỗi lớp trong lược đồ mà không cần viết truy vấn cho mỗi lớp không. Tôi không phải là người viết kịch bản PostGIS tốt, vì vậy bất kỳ trợ giúp nào cũng sẽ được đánh giá cao.

Cảm ơn

Câu trả lời:


8

Nếu bạn muốn tạo các chỉ mục hàng loạt trên các cột hình học, bạn có thể thử chức năng plpgsql này mà tôi vừa gõ:

CREATE OR REPLACE FUNCTION BatchIndex(sn text, tn text, cn text) RETURNS void AS $$
DECLARE i_exists integer;
DECLARE idxname text;
BEGIN
  idxname := 'idx_' || tn || '_' || cn;
  select into i_exists count(*) from pg_class where relname = idxname;

  IF i_exists = 0 THEN
    EXECUTE 'CREATE INDEX ' ||idxname || ' ON '
      || sn || '.' || tn
      || ' USING GIST(' || cn || ')';
  END IF;
END;
$$ LANGUAGE plpgsql;

Tôi đã không thử nó trong sự tức giận trên cơ sở dữ liệu của tôi, nhưng nó dường như thực hiện công việc.

Để sử dụng nó, chỉ cần chạy một SELECTtuyên bố như thế này:

select BatchIndex('public', f_table_name, f_geometry_column) from geometry_columns where f_table_schema = 'public';

Để tạo chỉ mục trên tất cả các cột hình học, bạn có thể sử dụng nó như thế này:

select BatchIndex(f_table_schema, f_table_name, f_geometry_column) from geometry_columns;

Sau đó, chạy một VACUUM ANALYZEđể dọn dẹp mọi thứ lên.


Cảm ơn bạn rất nhiều, điều này có vẻ tuyệt vời. Tôi đã chạy nó, nhưng dường như có một vấn đề, làm phiền bạn, điều này có thể là do tôi không có khả năng viết kịch bản. Nhưng khi tôi chạy các câu lệnh CHỌN, tôi gặp lỗi sau: ERROR: function batchindex (không xác định, thay đổi ký tự, thay đổi ký tự) không tồn tại LINE 1: chọn BatchIndex ('công khai', f_table_name, f_geometry_column) ... Tôi không chắc nếu tôi thêm bất cứ thứ gì để có được lô, hoặc nếu đây chỉ là một người giữ chỗ cho một cái gì đó khác biệt. Truy vấn CREATE chạy qua mà không có vấn đề gì, nhưng không có chỉ mục nào được tạo.
Ryan Garnett

Hmm ... Tôi không chắc những gì đang xảy ra ở đó. Thực tế là nó nghĩ rằng tham số đầu tiên bạn chuyển qua thuộc loại unknownchứ không phải character varyinglà tắt chuông báo thức, nhưng tôi không thể thấy nó có vấn đề ở đâu. Tôi sẽ suy nghĩ một chút, trong khi đó, bất kỳ bậc thầy nào của PostgreSQL ngoài kia có thích không? :)
MerseyViking

2

Câu trả lời hàng đầu sẽ không hoạt động nếu bạn có quan điểm với hình học. Thay đổi câu lệnh 'IF' để kiểm tra xem bạn không cố gắng xây dựng một chỉ mục trên chế độ xem giải quyết vấn đề đó. Nếu bạn muốn sử dụng chế độ xem với hình học, hãy thay thế dòng này:

IF i_exists = 0

Với cái này:

IF i_exists = 0 AND tn IN (SELECT table_name, table_type FROM information_schema.tables WHERE table_type = 'BASE TABLE')

1

giả sử bảng của bạn là 'tòa nhà', bạn có thể lập chỉ mục bằng GIST

CREATE INDEX building_gindx ON building USING GIST (geom);

Có phải đó là những gì bạn đang tìm kiếm?


Cảm ơn Naresh, không tôi đang tìm cách tạo chỉ mục cho tất cả các bảng trong một lược đồ, trong một hệ thống bó.
Ryan Garnett
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.