2009-08-27 7 views
7

Tôi có một ứng dụng về cơ bản tôi có một bảng khổng lồ (100 triệu bản ghi) thông tin, với mỗi hàng chứa một giá trị lat/long.Các tính năng Dữ liệu không gian của SQL Server 2008 có hữu ích cho các truy vấn ánh xạ không?

Tôi liên tục truy vấn bảng này để nhận tất cả các bản ghi vừa với bán kính xung quanh một điểm nhất định. Ví dụ, "tất cả hồ sơ trong vòng 5 dặm của 39,89288, -104,919434"

Đối với điều này, tôi có một chỉ số trên các cột Lat/Long, và tôi nhận được "bounding vuông" của các điểm, và sau đó loại bỏ tất cả những điểm nằm ngoài vòng tròn trong ứng dụng ASP.Net của tôi, vì nó nhanh hơn so với tính toán vòng tròn trong SQL Server.
LƯU Ý: Đây là tất cả dữ liệu về Hoa Kỳ, vì vậy tôi xem xét trái đất là phẳng để tính toán của tôi, đó là chính xác, đủ cho nhu cầu của tôi.

Bây giờ, vấn đề chính với chỉ số Lat/Long là "hình vuông" của các điểm và vì tôi đang cố gắng tìm "Độ lệch giữa x và y" và "Dài giữa x và y", không thể thực sự sử dụng chỉ mục siêu hiệu quả, vì nó có thể nếu tôi đang tìm kiếm trên "một dòng" của các điểm.

Tôi đã đọc về các tính năng không gian của SQL 2008, nhưng tôi chưa tìm thấy đủ thông tin cụ thể để biết liệu điều này có hữu ích cho tôi hay không. Vì vậy, câu hỏi đặt ra là: Liệu SQL 2008 có một loại loại chỉ mục khác nhau sẽ làm cho loại truy vấn cụ thể này nhanh hơn nhiều so với SQL 2005?

+0

Câu hỏi hay! Tôi đã làm một cái gì đó rất giống với những gì bạn đang làm bây giờ trong SQL2005, vì vậy tôi muốn được quan tâm để nghe những gì mọi người đến với –

Trả lời

3

Tìm thấy này:

Đối với SQL 2008:
http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/sql-server-2008-proximity-search-with-th

Rõ ràng nó IS có thể

LƯU Ý: Phiên bản SQL 2005 của bài viết mà không thực hiện quá tốt. Tôi đã thử loại điều đó và nó hoạt động tốt hơn để chỉ nhận được hình vuông từ SQL Server, và sau đó cull vòng tròn trong mã của riêng bạn.

Thêm liên kết quan tâm:

http://msdn.microsoft.com/en-us/library/bb964712.aspx
(Cuối cùng một lời giải thích !!)

Và một truy vấn mẫu ... Rõ ràng đây là làm thế nào để thực hiện tìm kiếm tôi muốn (điểm trong vòng 5 vòng tròn -mile):

DECLARE @Location GEOGRAPHY 
SET @Location = GEOGRAPHY::STPointFromText('POINT(73.9517061 40.7934358)',4326).STBuffer(5 * 1600); 
SELECT [fields] FROM [table] WHERE LocGeog.STIntersects(@Location) = 1 

(LocGeog là cột Địa lý)

Kỳ lạ thay, điều này chạy chậm hơn so với truy vấn cũ thông thường của tôi (chậm hơn 7 lần), vì vậy tôi rõ ràng vẫn đang làm điều gì đó rất sai.

1

Có, điều này có thể được thực hiện rất tốt với dữ liệu không gian SQL 2008. Có một số chuyên môn/thử nghiệm và lỗi (?) Trong việc thiết lập chỉ mục không gian lên ở mức lưới bên phải, nhưng sau đó nó được cho là tuyệt vời (được bạn bè chuyển tiếp, tôi đã không sử dụng nó trong sản xuất bản thân mình).

Đối với mục đích của bạn (lat/lon), bạn sẽ wan các geo đồ họa loại và không các geo metric.Tôi tin rằng các chỉ mục không gian thiết lập một loại hình lập chỉ mục "lồng nhau tam giác" là một sự cải tiến so với kiểu "bounding box" của điều kiện tiên quyết mà chúng ta buộc phải làm trong SQL mà không có nó.

OK, tôi khuyên bạn nên bắt đầu từ this post tại "Trang chủ của Scary DBA" Blog của Grant Fritchey (nói với anh ấy tôi đã gửi cho bạn nếu bạn muốn đặt câu hỏi :-)). Đây là một lời giải thích tốt về một số phân tích hiệu suất & điều chỉnh các chỉ mục không gian mà anh ta vừa mới bắt đầu học và cũng bao gồm các liên kết đến nhiều tài liệu khác.

5

Có! Hãy xem this article về chỉ mục không gian. Bạn sẽ thấy rằng các loại chỉ mục này hoạt động tốt hơn phương pháp "hình chữ nhật được lập chỉ mục". Bên cạnh đó, không chỉ bạn sẽ có thể truy vấn hiệu quả cho "là điểm gần một điểm khác", nhưng làm tất cả các loại hoạt động địa lý khác. Here's danh sách đầy đủ tất cả các phương pháp có sẵn trên loại.

0

bạn đã biết, tôi đang làm các truy vấn Longitude/Lạt tại Starbucks khoảng 5 năm về trước ...

và về cơ bản, chúng tôi muốn tương quan cửa hàng để trung tâm phân phối .. Tôi đã làm việc trong bộ phận hoạt động của họ, và họ một cách trung thực không thể nói cửa hàng nào được cung cấp bởi một nhà kho cụ thể.

Vì vậy, tôi đã kết thúc với thuật toán 'vòng tròn ma thuật' này.

về cơ bản, họ đã có một loạt các truy vấn mà trông như thế này: select * from table1, table2 đâu UdfDistance (table1.Lat, table1.Long, table2.Lat, table2.Long)> = 250

Tôi đã kết thúc với một cái gì đó REALLY tương tự, nhưng nó chạy một LOT nhanh hơn

chọn * từ table1, table2 Where UdfDistance (table1.Lat, table1.Long, table2.Lat, table2.Long)> = 250 và table1.Lat giữa (table2.Lat - 1) và (table2.Lat + 1) và table1.Long giữa (table2.Long - 1) và (table2.Long + 1)

Về cơ bản, đừng thử so sánh hai điểm địa lý nếu có chênh lệch lớn hơn 1 độ (vĩ độ và dài) giữa hai điểm.

Nói cách khác, nó sử dụng các chỉ số quan hệ NORMAL để lọc ra rất nhiều giá trị, và sau đó tính toán khoảng cách UDF có ít thông tin hơn để xử lý.

Hy vọng điều đó sẽ giúp ích, tôi sẽ cố gắng giúp làm rõ nếu tôi cần