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
lidar
thẻ.