Theo tài liệu của Microsoft, các chỉ mục không gian sẽ được sử dụng với các loại địa lý theo các phương pháp sau khi chúng xuất hiện ở đầu một vị từ so sánh với một WHERE
mệnh đề:
STIntersects
STDistance
STEquals
Chỉ các phương thức của loại hình học (danh sách hạn chế) sẽ kích hoạt sử dụng chỉ mục không gian JOIN ... ON
, vì vậy hãy thay đổi mã của bạn để sử dụng WHERE geog1.STIntersects(geog2) = 1
và điều đó sẽ cải thiện tốc độ.
Tôi cũng khuyên bạn nên đưa ra lời khuyên trong câu trả lời của g2server và thêm phần sau đây để lọc và thêm chỉ mục không gian trên đó
ALTER TABLE [dbo].[T_POLYGON] ADD SimplePolysGeog AS
([geography]::STGeomFromWKB([geometry]::STGeomFromWKB([COORD].[STAsBinary](),
[COORD].[STSrid])
.STEnvelope().STAsBinary(),(4326))) PERSISTED
sau đó bạn có thể có một truy vấn như sau (tôi đã viết bài đăng này một cách nhanh chóng và chưa được kiểm tra, đây chỉ là một điều cần thử vì tôi thấy rằng truy vấn của bạn và câu trả lời được đăng cao nhất sử dụng THAM GIA không gian op = 1 sẽ không sử dụng chỉ số không gian):
SELECT
(SELECT p2.polygon_id
FROM T_Polygon p2
WHERE p2.coords.STIntersects(t.coords) = 1),
t.pin_id
FROM T_PIN t
WHERE
(SELECT t.coords.STIntersects(p.coords)
FROM T_POLYGON p
WHERE t.coords.STIntersects(p.SimplePolysGeog) = 1) = 1
FYI: Ở trên không hoạt động nếu SimplePolysGeog
cuối lên chồng chéo (như trong một pin có thể ở hai geogs đơn giản, chỉ cần chạy này trên người trong phường trong tình trạng và kể từ polys bình thường chia sẻ ranh giới, các hộp bounding chồng chéo), sử dụng như vậy trong hầu hết trường hợp, nó sẽ đưa ra một lỗi mà truy vấn con trả về nhiều hơn một kết quả.
Từ Tổng quan về chỉ mục không gian của MS Docs :
Phương pháp địa lý được hỗ trợ bởi các chỉ số không gian
Trong một số điều kiện nhất định, các chỉ mục không gian hỗ trợ các phương pháp địa lý theo định hướng tập hợp sau: STIntersects (), STEquals () và STDistance (). Để được hỗ trợ bởi một chỉ mục không gian, các phương thức này phải được sử dụng trong mệnh đề WHERE của truy vấn và chúng phải xuất hiện trong một vị từ có dạng chung sau đây:
địa lý1.method_name (địa lý2) so sánh_operatorvalid_number
Để trả về kết quả không null, địa lý1 và địa lý2 phải có cùng Mã định danh tham chiếu không gian (SRID) . Mặt khác, phương thức trả về NULL.
Các chỉ mục không gian hỗ trợ các dạng vị ngữ sau:
Các truy vấn sử dụng Chỉ mục không gian
Các chỉ mục không gian chỉ được hỗ trợ trong các truy vấn bao gồm toán tử không gian được lập chỉ mục trong mệnh đề WHERE. Ví dụ cú pháp như:
[spatial object].SpatialMethod([reference spatial object]) [ = | < ] [const literal or variable]
Trình tối ưu hóa truy vấn hiểu tính giao hoán của các hoạt động không gian (đó @a.STIntersects(@b) = @b.STInterestcs(@a)
). Tuy nhiên, chỉ mục không gian sẽ không được sử dụng nếu bắt đầu so sánh không chứa toán tử không gian (ví dụ: WHERE 1 = spatial op
sẽ không sử dụng chỉ mục không gian). Để sử dụng chỉ mục không gian, viết lại so sánh (ví dụ WHERE spatial op = 1
).
...
Truy vấn sau đây sẽ hoạt động nếu SimplePolysGeogs
trùng lặp:
;WITH cte AS
(
SELECT T_PIN.PIN_ID,
T_POLYGON.POLYGON_ID,
T_POLYGON.COORD
FROM T_PIN
INNER JOIN T_POLYGON
ON T_PIN.COORD.STIntersects(T_POLYGON.SimplePolysGeog) = 1
)
SELECT COUNT(*)
FROM T_PIN
INNER JOIN cte
ON T_PIN_PIN_ID = cte.PIN_ID
where cte.[COORD].STIntersects(T_PIN.COORD) = 1