У мене близько 75 мільйонів записів у базі даних SQL Server 2008 R2 Express. Кожен - це lat long, що відповідає деякому значенню. У таблиці є стовпчик з географії. Я намагаюся знайти одного найближчого сусіда для заданої широти (точки). У мене вже є запит із просторовим індексом. Але залежно від того, де знаходиться запис у базі даних, скажімо, першої чи останньої чверті, запит може зайняти від 3 до 30 секунд, щоб знайти найближчого сусіда. Я думаю, що це можна оптимізувати, щоб отримати набагато швидший результат, оптимізуючи запит або просторовий індекс. Зараз застосовано деякий просторовий індекс із налаштуваннями за замовчуванням. Ось як виглядає моя таблиця та запит.
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]
Просторовий індекс, який я використовую:
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]
Ось запит, який я використовую:
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
Ось зразок lat longs у моїй базі даних. дати уявлення про точність і щільність. Усі 70 мільйонів записів для одного міста (дані Лідара).
POINT (-95.669434934023087 30.049513838913736)
Тепер цей запит дає результати, як я описав вище, але я хочу максимально покращити продуктивність. Моя здогадка, налаштовуючи значення за замовчуванням просторового індексу, я можу бути вище, щоб краще оптимізувати продуктивність. Якісь підказки з цього приводу?
Я спробував змінити буфер від 10 до 1000, але з майже однаковими результатами.
Також вітаються будь-які інші пропозиції щодо підвищення продуктивності.
Ось система, якою я зараз користуюся:
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
тег.