Tối ưu hóa truy vấn cơ sở dữ liệu


10

Tôi có một bộ raster ở định dạng DTED mà tôi tải vào cơ sở dữ liệu PostGIS bằng công cụ dòng lệnh raster2pgsql.

Mỗi raster chỉ được lưu trữ trong một hàng và được mô tả bằng cách loại bỏ và một giá trị của định dạng raster.

Bây giờ, tôi muốn tạo một hàm cơ sở dữ liệu lấy kinh độ và vĩ độ của một điểm và trả về giá trị pixel tương ứng với điểm này.

Vấn đề tôi gặp phải là phải mất khá nhiều thời gian để làm điều đó (3-4 giây) vì cơ sở dữ liệu hoạt động trên bảng Odroid.

Tôi biết rằng tập dữ liệu tôi xử lý khá lớn (các trình quét bao quát toàn bộ khu vực Vương quốc Anh) nhưng vì tôi không quen lắm với PostgreQuery và PostGIS nên tôi nghi ngờ nó có thể được thực hiện nhanh hơn.

Đây là những gì tôi đã làm cho đến nay:

SELECT ST_Value(rast, ST_GeomFromText(CONCAT('POINT(', $1, ' ', $2, ')'), 4326))
FROM (
    SELECT * FROM rasters
    WHERE rast && ST_GeomFromText(CONCAT('POINT(', $1, ' ', $2, ')'), 4326)
) x;

$1$2dài và lat tương ứng.


2
Bạn đã cắt raster thành gạch khi bạn nhập vào postgis? (tham số -t chiều rộng x chiều cao)?
mutolisp

Vâng, tôi đã làm. Nó cải thiện một hiệu suất một chút. Tôi có lẽ cũng nên thêm rằng cơ sở dữ liệu nằm trên bảng Odroid, do đó nó hoạt động chậm hơn đáng kể so với trên Máy tính để bàn. Tôi chỉ tự hỏi liệu tôi có thể thay đổi bằng cách nào đó cách tiếp cận xử lý raster để nó không tính toán không cần thiết. Ví dụ ban đầu, tôi đã gọi hàm ST_Value trên tất cả các trình quét và sau đó tôi sẽ tìm hàng thực sự chứa một số giá trị. Đó là cách tiếp cận đơn giản nhất nhưng làm việc chậm hơn nhiều.
zedsdead

2
Sử dụng ST_SetSRID(ST_MakePoint($1, $2),4326)thay cho chuỗi concats có thể giúp bạn tiết kiệm thời gian nếu có đủ số lần lặp.
Scro

1
Nó dường như không giúp được gì nhiều nhưng cảm ơn bạn. Tôi đã suy nghĩ về việc thêm một cột khác khi bảng được tạo sẽ chỉ đơn giản là một hộp giới hạn cho một raster duy nhất. Có lẽ cách này có thể tìm thấy raster bên phải nhanh hơn ... Ngoài ra, tôi tự hỏi liệu việc tính toán trước vị trí pixel trong raster dựa trên tọa độ góc và bước pixel trong lon / lat có thể giúp ... Nếu có ai có những suy nghĩ về điều đó tôi sẽ biết ơn vì đã chia sẻ chúng :)
zedsdead

2
Có lẽ bạn có thể thử sử dụng chương trình giải thích trực tuyến để kiểm tra cổ chai ở đâu.
mutolisp

Câu trả lời:


1

Bạn có thể thử điều này:

--calculate and store geom point just One time
WITH point_geom AS 
(
    SELECT ST_setsrid(ST_GeomFromText('POINT('|| $1 || ' '|| $2 || ')'), 4326) as geom
)
-- Your subquery is maybe useless , alias "x" isn't used
SELECT ST_Value( rast, point_geom.geom )
FROM rasters
WHERE rast && point_geom.geom;

Nhưng vấn đề thực sự là raster queriing; ốp lát dữ liệu sẽ tăng tốc truy vấn. Bạn có thể thử sử dụng PostGIS WKT Raster và làm theo hướng dẫn này .

Tôi hy vọng nó sẽ hữu ích,

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.