Tối ưu hóa truy vấn hàng xóm gần nhất trên đám mây 70 triệu điểm trên SQL Server 2008


16

Tôi có khoảng 75 triệu bản ghi trong cơ sở dữ liệu SQL Server 2008 R2 Express. Mỗi cái là một lat dài tương ứng với một số giá trị. Bảng có cột địa lý. Tôi đang cố gắng tìm một người hàng xóm gần nhất cho một kinh độ (điểm) vĩ độ nhất định. Tôi đã có một truy vấn với chỉ số không gian tại chỗ. Nhưng tùy thuộc vào vị trí của bản ghi trong cơ sở dữ liệu, giả sử quý đầu tiên hoặc quý trước, truy vấn có thể mất khoảng từ 3 đến 30 giây để tìm người hàng xóm gần nhất. Tôi cảm thấy điều này có thể được tối ưu hóa để cho kết quả nhanh hơn nhiều bằng cách tối ưu hóa truy vấn hoặc chỉ mục không gian. Ngay bây giờ áp dụng một số chỉ mục không gian với các thiết lập mặc định. Đây là những gì bảng và truy vấn của tôi trông như thế nào.

CREATE TABLE lidar(
    [id] [bigint] IDENTITY(1,1) NOT NULL,
    [POINTID] [int] NOT NULL,
    [GRID_CODE] [numeric](17, 8) NULL,
    [geom] [geography] NULL,
 CONSTRAINT [PK_lidar_1] PRIMARY KEY CLUSTERED ([id] ASC)
 WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 
 ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Chỉ số không gian tôi đang sử dụng:

CREATE SPATIAL INDEX [SPATIAL_lidar] ON [dbo].[lidar] ([geom]) USING  GEOGRAPHY_GRID 
WITH (
GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM), 
CELLS_PER_OBJECT = 16, PAD_INDEX  = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF,  
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

Đây là Truy vấn tôi đang sử dụng:

declare @ms_at geography = 'POINT (-95.66 30.04)';
select TOP(1) nearPoints.geom.STAsText()as latlon 
from
(
select r.geom
from lidar r With(Index(SPATIAL_lidar))
where r.geom.STIntersects(@ms_at.STBuffer(1000)) = 1
) nearPoints

Đây là một mẫu lat longs trong cơ sở dữ liệu của tôi. để đưa ra một ý tưởng về độ chính xác và mật độ. Tất cả 70 triệu hồ sơ là cho một thành phố (dữ liệu của Lidar).

POINT (-95.669434934023087 30.049513838913736)

Bây giờ truy vấn này cho tôi kết quả như tôi đã mô tả ở trên, nhưng tôi muốn cải thiện hiệu suất càng nhiều càng tốt. Tôi đoán là bằng cách điều chỉnh các giá trị mặc định của chỉ số không gian tôi có thể ở trên để tối ưu hóa hiệu suất tốt hơn. Có manh mối nào về việc này không?

Tôi đã thử thay đổi bộ đệm từ 10 đến 1000 nhưng với kết quả gần như giống nhau.

Ngoài ra bất kỳ đề xuất khác để cải thiện hiệu suất đều được chào đón.

Đây là hệ thống tôi đang sử dụng ngay bây giờ:

Windows 7 64bit Professional
Intel(R) Core(TM)2 Quad CPU    Q9650  @ 3.00GHz (4 CPUs), ~3.0GHz
Ram: 8 GB
NVIDIA GeForce 9500 GT

1
Đây có phải là dữ liệu khai thác không? Nếu vậy hãy xem xét thêm một lidarthẻ.
Kirk Kuykendall

2
Tôi không nói SQL Server, nhưng theo tôi, truy vấn của bạn phải tìm tất cả các điểm nằm trong bộ đệm 1000 mét của điểm mục tiêu. Các xét nghiệm point-in-polygon sẽ được cách chậm hơn so với kiểm tra khoảng cách, mà là cơ sở cho các giải pháp cung cấp trong bạn câu hỏi trước .
whuber

@whuber: Tôi đã thử truy vấn dựa trên khoảng cách và thời gian tính bằng phút. đường lên cao. Có thể tôi đang đi sai một số nơi. Kể từ những điểm này trong đa giác, phải mất thời gian tính bằng giây. Ngay cả việc thay đổi bộ đệm từ 10 đến 10000 cũng không có nhiều thời gian.
Shaunak

1
@Shaunak Sau đó, có vấn đề với các truy vấn dựa trên khoảng cách, vì về mặt lý thuyết, chúng có thể được thực hiện trung bình tính bằng micrô giây (hoặc tốt hơn) và tính bằng mili giây (trường hợp xấu nhất) bằng cách sử dụng các chỉ mục thích hợp như cây KD . Bạn có thể muốn nghĩ về việc cải thiện chúng hơn là tìm cách tối ưu hóa tìm kiếm điểm trong bộ đệm.
whuber

Đây có phải là dữ liệu lưới? Tại sao không sử dụng raster?
Matthew Snape

Câu trả lời:


9

Hãy thử chạy thủ tục lưu trữ sp_help_spatial_geography_index để biết chi tiết về cách sử dụng chỉ mục không gian của bạn. Bạn sẽ có thể sử dụng một cái gì đó như:

declare @ms_at geography = 'POINT (-95.66 30.04)'
set @ms_at = @ms_at.STBuffer(1000).STAsText()
exec sp_help_spatial_geography_index 'lidar', 'SPATIAL_lidar', 0, @ms_at;

Đăng kết quả trong câu hỏi của bạn để xem có gì nổi bật không. Ý nghĩa cho từng mục có thể được tìm thấy ở đây .

Nếu tọa độ của bạn được chiếu thì bạn cũng có thể thực hiện một truy vấn không gian đơn giản trên các trường X, Y được tính toán và kiểm tra X <MinX và X> MaxX, v.v.

Chiếu tọa độ của bạn (trong trường loại GEOMETRY) cũng cho phép bạn giới hạn chỉ số không gian của mình trong phạm vi dữ liệu có thể tăng tốc hiệu suất đáng kể. Thay thế phạm vi thế giới bằng phạm vi dữ liệu của bạn:

CREATE SPATIAL INDEX [SPATIAL_lidar] ON [dbo].[lidar] ([geom]) USING  GEOMETRY_GRID 
WITH (
GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM), 
CELLS_PER_OBJECT = 16, PAD_INDEX  = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF,  
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON,
BOUNDING_BOX =(-90, -180, 90, 180),) ON [PRIMARY]

1
Theo technet.microsoft.com/en-us/library/bb934196.aspx các BOUNDING_BOX chỉ có thể được sử dụng cho GEOMETRY_GRID, không GEOGRAPHY_GRID
Kelso

1
Cập nhật câu trả lời. Loại GEOMETRY phải nhanh hơn nhiều vì BOUNDING_BOX có thể được đặt.
địa lý

1

Xem xét đơn giản hóa bộ đệm với BufferwithTolerance . Nếu các điểm được đóng gói chặt chẽ, hệ thống phải xác định xem một điểm là một trong hai phía của ranh giới. Dòng đó càng đơn giản thì máy càng ít phải làm.


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.