Theo mô tả, câu trả lời là "không", vì những lý do sau:
- Lấy một bảng không gian trong 4326. Xây dựng một chỉ số không gian trên đó. Chỉ số không gian là một chỉ số phẳng, bao gồm các giới hạn 2D của các tính năng, trong 4326, được sắp xếp thành một cấu trúc cây.
- (a) chạy truy vấn bộ lọc khoảng cách bằng cách sử dụng, như
ST_DWithin(geom::geography, %anothergeom, %radius)
. Vì địa lý có liên quan, hệ thống sẽ tìm kiếm một chỉ số địa lý (được xây dựng trên một hình cầu, không phải trên một mặt phẳng) và sẽ không tìm thấy. Vì nó không có chỉ mục, nó sẽ thực hiện phép nối bằng cách quét toàn bộ (các) bảng. Nó sẽ chậm thôi.
- (b) chạy truy vấn bộ lọc khoảng cách bằng cách sử dụng một biến đổi, như
ST_DWithin(ST_Transform(geom, 2163), %anothergeom, %radius)
. Các thử nghiệm của bạn không chống lại cột được lập chỉ mục (geom), nhưng đối với một hàm được áp dụng cho cột ( ST_Transform(geom,2163)
) và một lần nữa, chỉ mục không gian của bạn sẽ không được sử dụng. Nó sẽ chậm thôi.
Bạn cần cho truy vấn của bạn và chỉ mục của bạn để hài hòa. Nếu bạn không muốn thay đổi phép chiếu dữ liệu của mình, bạn sẽ phải sử dụng chỉ mục chức năng, ví dụ: nếu bạn tạo chỉ mục địa lý chức năng, bạn có thể sử dụng truy vấn dựa trên địa lý:
CREATE INDEX mytable_geog_x
ON mytable USING GIST (geography(geom));
SELECT *
FROM mytable
WHERE ST_DWithin(geography(geom), %anothergeography, %radius);
Hoặc, trong trường hợp chuyển đổi:
CREATE INDEX mytable_geog_x
ON mytable USING GIST (ST_Transform(geom, 2163));
SELECT *
FROM mytable
WHERE ST_DWithin(ST_Transform(geom, 2163), %another2163geometry, %radius);
Hiệu suất nhanh nhất tuyệt đối sẽ là nếu bạn chuyển đổi dữ liệu trong bảng của mình sang phép chiếu phẳng (như EPSG: 2163 ), tạo chỉ mục không gian và sau đó sử dụng ST_DWithin()
kết quả.
ALTER TABLE mytable
ALTER COLUMN geom
TYPE Geometry(Point, 2163)
USING ST_Transform(geom, 2163);
CREATE INDEX mytable_geom_x ON mytable USING GIST (geom);
SELECT *
FROM mytable
WHERE ST_DWithin(geom, %some2163geom, %radius)