ST_DWithin tài liệu nói rằng chữ ký hàm đầu tiên chấp nhận các loại địa lý không phải là các loại hình học:
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);
vì (location, ST_SetSRID (ST_MakePoint (20, -30), 4326)) đều là dạng hình học nên việc thực thi hàm sẽ lộn xộn. :
boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);
Và như bạn đã nói rằng việc chuyển các loại cột thành Địa lý thay vì Hình học sẽ giải quyết được vấn đề vì điều đó sẽ giúp bạn thực thi chính xác:
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters);
boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);
Hy vọng điều này sẽ giúp một chút.
Chỉnh sửa:
Tìm thấy phần này trong tài liệu nói rằng khi nhập dữ liệu
điều này có thể giải thích tại sao Postgres chấp nhận lệnh gọi ST_DWithin () đầu tiên của bạn vì dường như postgis sẽ truyền nó tới vị trí địa lý và điều đó cũng giải thích tại sao quá trình thực thi mất nhiều thời gian hơn và bỏ qua chỉ mục vì mỗi lần truyền sẽ dẫn đến một đối tượng mới không được lập chỉ mục cột ban đầu của bạn.