Tôi vẫn chưa quen với quản trị cơ sở dữ liệu và tôi đang cố gắng tối ưu hóa truy vấn tìm kiếm.
Tôi đã có một truy vấn giống như thế này và mất 5-15 giây để thực thi trong một số trường hợp và cũng gây ra việc sử dụng CPU 100%:
DECLARE @point geography;
SET @point = geography::STPointFromText('POINT(3.3109015 6.648294)', 4326);
SELECT TOP (1)
[Result].[PointId] AS [PointId],
[Result].[PointName] AS [PointName],
[Result].[LegendTypeId] AS [LegendTypeId],
[Result].[GeoPoint] AS [GeoPoint]
FROM (
SELECT
[Extent1].[GeoPoint].STDistance(@point) AS distance,
[Extent1].[PointId] AS [PointId],
[Extent1].[PointName] AS [PointName],
[Extent1].[LegendTypeId] AS [LegendTypeId],
[Extent1].[GeoPoint] AS [GeoPoint]
FROM [dbo].[GeographyPoint] AS [Extent1]
WHERE 18 = [Extent1].[LegendTypeId]
) AS [Result]
ORDER By [Result].distance ASC
Bảng này có một chỉ mục được nhóm trên PK và một Chỉ mục không gian trên geography
cột loại.
Vì vậy, khi tôi thực hiện truy vấn trên, nó đã thực hiện thao tác quét.
Vì vậy, tôi đã tạo một chỉ mục không được nhóm trên LegendTypeId
cột:
CREATE NONCLUSTERED INDEX [GeographyPoint_LegendType_NonClustered] ON [dbo].[GeographyPoint]
(
[LegendTypeId] ASC
)
INCLUDE ( [PointId],
[PointName],
[GeoPoint])
WITH (PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF,
DROP_EXISTING = OFF,
ONLINE = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
và thay đổi truy vấn thành:
DECLARE @point geography;
SET @point = geography::STPointFromText('POINT({0} {1})', 4326);
SELECT TOP (1)
[GeoPoint].STDistance(@point) AS distance,
[PointId],
[PointName],
[LegendTypeId],
[GeoPoint]
FROM [GeographyPoint]
WHERE 18 = [LegendTypeId]
ORDER By distance ASC
Và bây giờ SQL Server thực hiện tìm kiếm thay vì quét:
Theo quan điểm của tôi đã tăng hiệu quả của truy vấn, nhưng khi tôi triển khai nó vào sản xuất, tôi vẫn nhận được kết quả tương tự (sử dụng CPU cao và trung bình 10 giây để thực hiện truy vấn).
Lưu ý: Không có dữ liệu nào được chèn, cập nhật hoặc xóa khỏi bảng này - chỉ tìm kiếm / đọc.
Có phải tôi đang làm gì sai không?
Làm thế nào tôi có thể sửa lỗi này?
BIÊN TẬP
Chỉ số chi tiết
EDIT 2:
Tôi đã thay đổi truy vấn, để sử dụng phương thức: 'Hàng xóm gần nhất' từ liên kết: https://msdn.microsoft.com/en-us/l Library / ff929109.aspx và bây giờ đây là kết quả, Truy vấn này cũng đang mất 3 -5 giây cho tìm kiếm - tương tự như Truy vấn thứ hai, (nhưng không được thử nghiệm trên Sản xuất)
Cài đặt chỉ mục không gian:
CREATE SPATIAL INDEX [SPATIAL_Point] ON [dbo].[GeographyPoint]
(
[GeoPoint]
)USING GEOGRAPHY_GRID
WITH (GRIDS =(LEVEL_1 = MEDIUM,LEVEL_2 = MEDIUM,LEVEL_3 = MEDIUM,LEVEL_4 = MEDIUM),
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) ON [PRIMARY]
GO
EDIT 3
Tôi đã làm theo hướng dẫn của @MickyT, bỏ Index vào [LegendTypeId]
và thực hiện truy vấn sau:
DECLARE @point geography;
SET @point = geography::STPointFromText('POINT(3.3109 6.6482)', 4326);
SELECT TOP (1)
[PointId],
[PointName],
[LegendTypeId],
[GeoPoint]
FROM [GeographyPoint] WITH(INDEX(SPATIAL_Point))
WHERE
[GeoPoint].STDistance(@point) IS NOT NULL AND
18 = [LegendTypeId]
ORDER By [GeoPoint].STDistance(@point) ASC
OPTION(MAXDOP 1)
Thống kê cho truy vấn này là
Và sau đó tôi thực hiện lại Truy vấn này:
DECLARE @point geography;
SET @point = geography::STPointFromText('POINT(3.3109 6.6482)', 4326);
SELECT TOP (1)
[GeoPoint].STDistance(@point) AS distance,
[PointId],
[PointName],
[LegendTypeId],
[GeoPoint]
FROM [GeographyPoint] --WITH(INDEX(SPATIAL_Point))
WHERE 18 = [LegendTypeId]
ORDER By distance ASC
Thống kê cho truy vấn này là
ORDER BY Distance
mệnh đề.