Chiến lược nhanh nhất cho các tìm kiếm gần trong SQL Server 2012


8

Đây là câu hỏi đầu tiên của tôi ở đây, vì vậy hãy chịu đựng với tôi!

Tôi đang triển khai một mặt sau cho một ứng dụng di động sẽ phải thực hiện các tìm kiếm gần để tìm POI gần đó (điểm os quan tâm). Tôi biết đó là một kịch bản rất phổ biến và trông rất đơn giản, nhưng có nhiều cách khác nhau tôi có thể thực hiện nó, vì vậy tôi rất thích xem các chuyên gia giàu kinh nghiệm hơn đang thực hiện các tìm kiếm không gian đơn giản này như thế nào.

Vì POI chỉ là một ĐIỂM, chúng tôi không cần bất kỳ phép tính phức tạp nào liên quan đến giao lộ hoặc tương tự. Đó là lý do ban đầu tôi nghĩ rằng việc sử dụng các cột và chỉ số không gian GEOGRAPHY có thể là quá mức hoặc thậm chí chậm hơn các chiến lược khác. Vì vậy, tôi đã thu hẹp nó xuống còn 3 cách tiếp cận:

1) Cột GEOGRAPHY + Chỉ số không gian

Đây có lẽ là giải pháp thực tế cho vấn đề này. Vì chúng tôi có các chỉ mục không gian và cột địa lý, chúng tôi chỉ có thể sử dụng nó và tìm kiếm theo khoảng cách. Một cái gì đó như thế này.

SELECT * FROM POIs WHERE Loc.STDistance(@radius) <= @distance;

Vì chúng tôi có chỉ số không gian trên Lộc, nên sẽ rất nhanh.

2) Sử dụng "hộp giới hạn" trên các cột Vĩ độ và Kinh độ

Đây là cách tiếp cận tầm thường mà không liên quan đến các chỉ số không gian. Chúng tôi tìm thấy một hộp giới hạn cho điểm và bán kính của chúng tôi sau đó chỉ cần tìm kiếm trên các cột Vĩ độ và Kinh độ. Nếu cả hai được lập chỉ mục tìm kiếm này sẽ rất nhanh. Chúng ta sẽ phải áp dụng hàm khoảng cách để lọc ra một số giá trị bên ngoài "vòng tròn" nhưng không có hộp giới hạn. Nhưng điều đó sẽ khá nhanh. Ý tưởng này được giải thích tốt hơn ở đây: http://www.movable-type.co.uk/scripts/latlong-db.html

Một cái gì đó như thế này:

DECLARE @lat float
DECLARE @lon float
SET @lat = -23.001029
SET @lon = -43.328422
DECLARE @maxLat float, @minLat float, @maxlon float, @minLon float
DECLARE @R float
DECLARE @distance FLOAT = 100 -- A distance in meters   
SET @R = 6378137 -- Earth
SET @maxLat = @lat + DEGREES(@distance/@R)
SET @minLat = @lat - DEGREES(@distance/@R)

SET @maxLon = @lon + DEGREES((@distance/@R/COS(RADIANS(@lat))))
SET @minLon = @lon - DEGREES((@distance/@R/COS(RADIANS(@lat)))) 

SELECT * from POIs 
WHERE
        Lat Between @minLat And @maxLat
    And Lng Between @minLon And @maxLon 

3) Sử dụng GEOHASH tích hợp được lưu trữ trên cột được lập chỉ mục

Cách tiếp cận này rất thú vị và đó là thứ mà mọi người đang sử dụng cùng với các bộ được đặt hàng của REDIS để thực hiện tìm kiếm gần. Nguyên tắc có thể được chuyển sang SQL Server bằng cách sử dụng một cột được lập chỉ mục lưu trữ GEOHASH tích hợp.

Tôi đã có ý tưởng này từ Ardb: https://github.com/yinqiwen/ardb/wiki/Spatial- Index

Nó cũng được giải thích theo cách thân thiện hơn ở đây: Sử dụng geohash cho các tìm kiếm gần?

Nói cách khác, người ta sẽ tính toán GEOHASH với độ sâu bit tương ứng với bán kính của tìm kiếm mà người ta mong muốn, sau đó tính toán 8 geohash geohash và cuối cùng gửi tìm kiếm bằng cách sử dụng các geohash này dưới dạng các hộp giới hạn trên cột được lập chỉ mục. Đây sẽ là 9 toán tử GIỮA trên mệnh đề WHERE của SQL ... Các kết quả sẽ phải được lọc do một số POI giả được trả về.

Nhưng có vẻ như điều này sẽ chậm hơn phương thức 2 vì mệnh đề where sẽ phức tạp hơn mặc dù nó sẽ chỉ truy vấn trên một cột thay vì hai.

Có ai có bất kỳ kinh nghiệm để chia sẻ về điều này? Có một cách tiếp cận tốt hơn / chính xác cho điều này?


Thực sự đó là một câu trả lời 'Nó phụ thuộc'. Lượng dữ liệu bạn đang truy vấn chắc chắn là một yếu tố. Vì bạn đang sử dụng SQL Server 2012, nên truy vấn cơ sở dữ liệu sẽ khá nhanh. Tuy nhiên, hãy đảm bảo bạn tuân theo các quy tắc msdn.microsoft.com/en-us/l Library / ff929109.aspx hoặc chỉ mục không gian sẽ không được sử dụng.
MickyT

@MickyT Có phải truy vấn Hàng xóm gần nhất được tối ưu hóa theo một cách khác không? Tôi không có thứ tự theo mệnh đề, cũng không phải mệnh đề TOP, vì tôi sẽ nhận được tất cả các điểm trong bán kính. Tôi đã tạo một cơ sở dữ liệu thử nghiệm với Lat, Long và Geometry columng, đã thêm 4 triệu bản ghi vào đó và tìm kiếm dựa trên chỉ mục không gian với STDistance là tức thời, nhưng các cột Lat và Long có hộp giới hạn cũng rất nhanh. Tôi sẽ cố gắng thêm hàng tỷ điểm để xem cái này có hoạt động tốt hơn cái kia không. Nếu không tôi sẽ gắn bó với chỉ số không gian!
Lâu đài

Có vẻ như truy vấn của bạn đang sử dụng chỉ mục không gian. Tôi đã không thực hiện nhiều thử nghiệm trên cái cụ thể đó, chỉ cần nhớ đọc có điều kiện. Là một tùy chọn khác, nếu bạn muốn thực hiện tìm kiếm hộp giới hạn, bạn có thể muốn thử Bộ lọc. msdn.microsoft.com/en-us/l
Library / cc645883.aspx

Lý do cơ sở dữ liệu triển khai các chỉ mục R-tree cho không gian là vì chúng nhanh hơn so với geohash hoặc tìm kiếm trên các chỉ mục x và y riêng biệt. Cách sử dụng sẽ khác nhau, nhưng sẽ không quá mức khi sử dụng không gian chỉ vì bạn chỉ có điểm. Bạn không mất gì khi sử dụng một loại hình học và có khả năng đạt được rất nhiều (không chỉ về tốc độ), mà còn trong việc chứng minh trong tương lai. Điều gì nếu bạn muốn thêm giao diện đệm hoặc đa giác vào một ngày sau đó? Cuối cùng, cách duy nhất để biết là kiểm tra trường hợp sử dụng của bạn, nhưng 2c của tôi là cách tiếp cận sử dụng 1.
John Powell

@ JohnBarça Tôi đã thực hiện thêm một số thử nghiệm thêm 50.000.000 điểm và sau khi truy vấn tính toán kế hoạch truy vấn sử dụng chỉ số không gian vẫn gần như ngay lập tức, trong khi các phương pháp khác mất vài giây để kết thúc. Tôi sẽ thực hiện thêm một số thử nghiệm: vì các truy vấn của tôi sẽ chạy ở khu vực thành thị, tôi sẽ thêm bộ lọc vùng / khu phố / quận / thành phố (các vị trí sẽ được mã hóa ngược trước đó). Điều này có thể hoặc không thể cải thiện tốc độ tìm kiếm. Nhưng bây giờ tôi chắc chắn rằng chỉ số không gian thực hiện tốt điều này với 50000000 điểm, tôi sẽ chỉ cố gắng tối ưu hóa nếu có nhu cầu thực sự.
Lâu đài

Câu trả lời:


2

Lý do cơ sở dữ liệu triển khai các chỉ mục R-tree cho không gian là vì chúng nhanh hơn so với geohash hoặc tìm kiếm trên các chỉ mục x và y riêng biệt. Vấn đề với geohash, là bạn phải tìm kiếm 9 góc phần tư, không chỉ 1, để thực hiện tìm kiếm loại gần - xem giới hạn geohash . Chúng rất hữu ích trong các cơ sở dữ liệu thiếu cây R, để cho phép biểu hiện của một đối tượng có phạm vi 2 chiều, theo một chiều, sau đó có thể được lập chỉ mục bằng cây B. Việc có các chỉ mục (hoặc hợp chất) riêng biệt trên x và y cũng sẽ chậm hơn, vì bạn cần quét thêm chỉ mục về 0 trong khu vực bạn quan tâm, trong khi với R-cây, bạn tìm kiếm chỉ mục nằm trên hộp giới hạn.

Cách sử dụng sẽ khác nhau, nhưng sẽ không quá mức khi sử dụng không gian chỉ vì bạn chỉ có điểm. Bạn không mất gì khi sử dụng một loại hình học và có khả năng đạt được rất nhiều (không chỉ về tốc độ), mà còn trong việc chứng minh trong tương lai. Điều gì nếu bạn muốn thêm giao diện đệm hoặc đa giác vào một ngày sau đó? Cuối cùng, cách duy nhất để biết là kiểm tra trường hợp sử dụng của bạn, nhưng 2c của tôi là sử dụng phương pháp 1.

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.