Tìm bảng PostGIS bị thiếu chỉ mục?


10

Gần đây tôi đã nhìn xung quanh pg_stat_user_tablesvà rất ngạc nhiên khi thấy số lượng lớn các lần quét liên tiếp trên một số bảng không gian của tôi. Chắc chắn, các bảng này đã thiếu các chỉ mục không gian.

Làm thế nào tôi có thể tìm thấy tất cả các bảng với một cột hình học không được lập chỉ mục?


Cảm ơn bạn đã tham khảo pg_stat_user_tables. Thật là nhiệt tình khi ai đó trong kiến ​​thức của bạn thừa nhận những sai lầm như vậy. Đối với những người trẻ tuổi trong công việc mà tôi cố vấn, tôi luôn nói: Nếu không có ứng cử viên tự nhiên cho khóa chính, hãy thêm một cột nối tiếp. Luôn xác định SRID và loại hình học. Luôn luôn thêm một chỉ số không gian. Bởi vì quét chuỗi có thể hoạt động với một triệu hàng, nhưng, có một điểm ..... Làm như tôi nói, thay vì như tôi đã làm: D.
John Powell

Câu trả lời:


9

Các bảng có chỉ mục không gian bị thiếu có thể được tìm thấy bằng cách truy vấn các bảng hệ thống:

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;

Nó có thể thậm chí còn tốt hơn WHERE t.typname IN ('geometry', 'geography') AND t.typtype='b'? Xem trac.osgeo.org/gdal/ticket/6896 .
user49584

@ user30184 Bạn có thể giải thích t.typtype = 'b'phần đó không?
dbaston

1
Nó thực sự là mảnh vô dụng. Thay đổi mã trong GDAL là để xử lý một tình huống hiếm gặp khi cơ sở dữ liệu PostgreQuery tiêu chuẩn có một bảng có tên là "hình học". Điều đó cũng có một mục trong pg_type nhưng với typtype = 'c'. Tuy nhiên, nếu bạn đã cài đặt PostGIS thì không thể kết thúc tình huống như vậy. create table "geometry" (foo text);choERROR: 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.
user49584

6

Tôi đã tạo ra một chức năng có thể tự động tạo ra tất cả các chỉ mục bị thiếu. Tham số "mô phỏng" cho phép lấy danh sách các chỉ mục không gian bị thiếu, nhưng thực hiện không TẠO INDEX

Xem https://gist.github.com/mdouchin/cfa0e37058bcf102ed490bc59d762042

Để có được danh sách các chỉ mục bị thiếu, hãy chạy:

SELECT * FROM create_missing_spatial_indexes(True)

Để tạo các chỉ mục cần thiết, hãy chạy:

SELECT * FROM create_missing_spatial_indexes()

hoặc là

SELECT * FROM create_missing_spatial_indexes(False)

Làm việc như người ở! Công cụ tuyệt vời.
RyanKDalton
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.