Làm thế nào để tăng tốc truy vấn cho cơ sở dữ liệu raster?


16

Tôi có một cơ sở dữ liệu raster trong postgresql / postgis với các cột sau:

(ID, rast, data_of_data) .

'rast' là cột có các tệp raster ở định dạng WKT. Một truy vấn mẫu để tìm giá trị DN của một điểm trong hệ thống WGS84 (30.424, -1.66) và cho 2002-01-09 là như sau:

SELECT 
     st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val
FROM 
     my_table
WHERE
     date_of_data='2002-01-09'

Có một phương pháp (ví dụ: chỉ số không gian) để tăng tốc các loại truy vấn đó không?


Có lẽ bạn có thể giúp chúng tôi bằng cách cung cấp thêm một số chi tiết: Có bao nhiêu bản ghi trong my_table? Làm thế nào lớn là dữ liệu trong cột raster? Bạn có bao nhiêu ngày riêng biệt trong date_of_data?
Lướt sóng

Thêm vào đây: SRID của cột rast là gì?
Lướt sóng

Câu trả lời:


12

Đây là một câu hỏi thú vị! Làm thế nào lớn là raster bạn muốn truy vấn? WKTRaster được lưu trữ trong cơ sở dữ liệu dưới dạng BLOB . Để tìm giá trị tại một điểm cụ thể, từ các chỉ số hàng / cột tọa độ góc đã biết (x_0, y_0) (i, j) được tính bằng các bước (dx, dy) và xoay. Với (i, j) đã biết, hàm ST_Value () có thể truy cập dữ liệu thực tế ở độ lệch byte chính xác.

Điều này có nghĩa là DB phải đọc trung bình ít nhất một nửa số blob dữ liệu khi trả lời một truy vấn cho một điểm (tùy thuộc vào việc thực hiện nó có thể thực sự đọc tất cả dữ liệu mọi lúc). Do đó, tôi đoán rằng hiệu suất của WKTRaster bị ảnh hưởng khi các BLOB dữ liệu quá lớn. Ốp dữ liệu nên tăng tốc truy vấn. Hãy xem cách dữ liệu SRTM (sắp tới là 6000x6000 pixel) được xử lý trong hướng dẫn này . Họ thực sự xếp dữ liệu thành 50x50 pixel thực sự nhỏ, đó là một gợi ý rõ ràng rằng suy đoán của tôi có thể không quá xa sự thật.

Dữ liệu raster lập chỉ mục không gian có thể sẽ chỉ lập hộp giới hạn, điều này không giúp ích gì cho vấn đề của bạn.


1
Điều ốp lát dường như là cách để đi - xem liên kết này . Bạn cũng cần thêm một chỉ mục như thế này: CREATE INDEX srtm_tiled_rast_gist_idx ON srtm_tiled USING GIST (ST_ConvexHull(rast));( nguồn )
dwurf

4

Hai khía cạnh mà tôi tìm thấy đã tăng tốc các tính toán raster PostGIS của tôi, đó là sử dụng các giá trị nguyên trong raster và sử dụng các raster đa băng tần nếu có thể. Trong trường hợp này, giá trị DN có thể được lưu trữ dưới dạng số nguyên không, nếu điều này chưa được thực hiện?

Ý nghĩ khác (và tôi không chắc nó có liên quan ở đây) là sử dụng các trình quét đa băng tần. Ví dụ: nếu bạn đang xem các lát dữ liệu hàng tháng, mỗi tháng có thể là một lớp raster. Sau đó, bạn có thể truy xuất nhiều giá trị của một điểm tại các lát thời gian khác nhau bằng cách truy vấn raster lớp. Tôi thấy cách tiếp cận này nhanh hơn nhiều so với truy vấn các raster riêng biệt.

Cuối cùng, khi bạn tải dữ liệu của mình, có -tcờ cho TILE_SIZE . Bạn có thể khám phá nếu kích thước ô mà bạn đang sử dụng có hoạt động tốt cho truy vấn của bạn không.


Trình quét nhiều mức có thể sẽ giúp ích nếu bạn cần truy vấn cùng một giá trị pixel trong vài tháng cùng một lúc (để lấy ví dụ của bạn), ví dụ để phân tích chuỗi thời gian. Truy vấn trong câu hỏi chỉ lấy một ngày cụ thể. Nếu ngày được chứa trong một băng tần, DBMS cũng cần phải đọc tất cả các băng tần khác, mặc dù chúng không được quan tâm để trả lời truy vấn. Điều này có thể sẽ làm giảm hiệu suất.
bhell

Tôi đồng ý - có lẽ tôi đã không nhấn mạnh rằng nó chỉ hữu ích nếu cần một vài giá trị cùng một lúc; Tôi sẽ làm rõ điều này.
djq

3

Tùy thuộc vào việc phân phối dữ liệu của bạn, bạn có thể nhận được một số tăng tốc rất tốt chỉ bằng cách lập chỉ mục date_of_datacột.

Bạn có thể sử dụng cú pháp GIẢI THÍCH ANALYZE để tìm hiểu xem các chỉ mục của bạn có đang được sử dụng hay không.


Những loại chỉ số? Bạn có thể đặc sắc hơn không?
f.ashouri

Chỉ là một chỉ số btree tiêu chuẩn : create index tbl_name_date_idx on tbl_name (date_of_data). Nếu bạn có nhiều ngày riêng biệt, điều này sẽ cắt giảm đáng kể lượng dữ liệu mà PostGIS phải xử lý.
Lướt sóng

Cảm ơn bạn, nhưng nó không hoạt động cho truy vấn của tôi.
f.ashouri

Làm thế nào mà nó không hoạt động? Không có hiệu suất đáng chú ý, hoặc các vấn đề khác? Nếu bạn có một cột bảng thường xuyên xuất hiện trong một WHEREmệnh đề, bạn nên luôn luôn xem xét lập chỉ mục nó. Nó sẽ không chỉ giúp ích trong trường hợp này nếu bạn có nhiều ngày riêng biệt (tức là một miền có giá trị lớn) mà còn nếu bạn có một số lượng lớn các bản ghi trong bảng.
bhell

Là truy vấn sử dụng chỉ mục? Bạn có thể pastebin đầu ra của explain analyze SELECT st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val from my_table where date_of_data='2002-01-09'?
Lướt sóng
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.