Chúng tôi có một bảng SQL Server đơn giản với dữ liệu không gian địa lý trông như thế này:
CREATE TABLE [dbo].[Factors](
[Id] [int] IDENTITY(1,1) NOT NULL,
[StateCode] [nvarchar](2) NOT NULL,
[GeoLocation] [geography] NULL,
[Factor] [decimal](18, 6) NOT NULL,
CONSTRAINT [PK_dbo.Factors] PRIMARY KEY CLUSTERED
(
[Id] ASC
)
Hiện tại chúng tôi có khoảng 100 nghìn hàng trong đó, nhưng dự kiến sẽ tăng lên hàng triệu.
Chúng tôi chạy các truy vấn trên đó trông như thế này:
declare @state nvarchar(2) = 'AL'
declare @point geography = geography::STGeomFromText('POINT(-86.19146040 32.38225770)', 4326)
select top 3
Lat,
Lon,
Factor,
GeoLocation.STDistance(@point) as Distance
from dbo.Factors
where StateCode = @state and GeoLocation.STDistance(@point) is not null
order by Distance
Đây là một chút đó là lạ. Dữ liệu trong bảng đó là không chính xác: chúng tôi đã lấy nó cho các phần phía nam của một tiểu bang, nhưng không phải cho toàn bộ tiểu bang. Nếu điểm chúng tôi tìm kiếm nằm trong phạm vi vài trăm mét mà chúng tôi có dữ liệu (ví dụ: từ phần phía nam của tiểu bang), truy vấn sẽ trả về giây. Nhưng nếu đó là, ví dụ, cách điểm dữ liệu gần nhất 100 km (ví dụ: nếu điểm mục tiêu là từ phía bắc của tiểu bang), thì truy vấn sẽ mất tối đa 3 phút để quay lại. Trong cả hai trường hợp, các kế hoạch truy vấn chỉ ra rằng chúng bắt đầu bằng việc quét chỉ mục không gian địa lý, do đó, đôi khi không phải là vấn đề xảy ra, SQL Server không thể hiểu được nên sử dụng chỉ mục nào trong câu hỏi.
Giả định của tôi là nó có liên quan đến cách chỉ số không gian địa lý được đặt ra.
CREATE SPATIAL INDEX IX_Factors_Spatial
ON [dbo].[Factors] (GeoLocation)
USING GEOGRAPHY_AUTO_GRID
WITH (
CELLS_PER_OBJECT = 16,
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
DROP_EXISTING = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON);
Nhưng tôi không biết rằng tôi đã mò mẫm các chi tiết đủ tốt để đặt ngón tay vào vấn đề.
Bất kỳ đề xuất cho cách tiếp cận xử lý sự cố này?
dbcc freeproccache
sau đó chạy truy vấn cho phần phía bắc của trạng thái để xem nó có nhanh không.