ตามเอกสารของ Microsoft ดัชนีเชิงพื้นที่จะถูกใช้กับประเภททางภูมิศาสตร์ในวิธีการต่อไปนี้เมื่อปรากฏที่จุดเริ่มต้นของการเปรียบเทียบกับส่วนWHERE
คำสั่ง:
STIntersects
STDistance
STEquals
วิธีการประเภทเรขาคณิตเท่านั้น (รายการที่ถูก จำกัด ) จะทริกเกอร์การใช้ดัชนีเชิงพื้นที่ในJOIN ... ON
ดังนั้นเปลี่ยนรหัสของคุณเพื่อใช้WHERE geog1.STIntersects(geog2) = 1
และที่ควรปรับปรุงความเร็ว
ฉันยังแนะนำให้รับคำแนะนำในคำตอบของ g2serverและเพิ่มสิ่งต่อไปนี้สำหรับการกรองและเพิ่มดัชนีเชิงพื้นที่
ALTER TABLE [dbo].[T_POLYGON] ADD SimplePolysGeog AS
([geography]::STGeomFromWKB([geometry]::STGeomFromWKB([COORD].[STAsBinary](),
[COORD].[STSrid])
.STEnvelope().STAsBinary(),(4326))) PERSISTED
แล้วคุณอาจจะมีแบบสอบถามเหมือนดังต่อไปนี้ (i โพสต์นี้ได้อย่างรวดเร็วและยังไม่ได้ผ่านการทดสอบนี้เป็นเพียงบางสิ่งบางอย่างที่จะลองเพราะผมเห็นว่าแบบสอบถามและคำตอบที่โพสต์สูงสุดของคุณใช้ JOIN บนอวกาศ op = 1 ซึ่งจะไม่ใช้ ดัชนีเชิงพื้นที่):
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: ด้านบนใช้ไม่ได้หากSimplePolysGeog
จบลงด้วยการทับซ้อนกัน (ในพินสามารถอยู่ใน geogs แบบง่าย ๆ สองอันเพียงแค่วิ่งไปหาคนที่อยู่ในบริเวณในรัฐและตั้งแต่ขอบเขตปกติของ polys ที่ใช้ร่วมกัน กรณีมันจะโยนข้อผิดพลาดที่แบบสอบถามย่อยส่งคืนมากกว่าหนึ่งผลลัพธ์
จากภาพรวมดัชนีเชิงพื้นที่ของ MS Docs :
วิธีการทางภูมิศาสตร์สนับสนุนโดยดัชนีเชิงพื้นที่
ภายใต้เงื่อนไขบางประการดัชนีเชิงพื้นที่สนับสนุนวิธีการทางภูมิศาสตร์แบบ set-oriented ต่อไปนี้: STIntersects (), STEquals () และ STDistance () เพื่อให้ได้รับการสนับสนุนโดยดัชนีอวกาศวิธีการเหล่านี้จะต้องใช้ภายในส่วนคำสั่ง WHERE ของแบบสอบถามและจะต้องเกิดขึ้นภายในภาคแสดงของแบบฟอร์มทั่วไปต่อไปนี้:
geography1.method_name (geography2) comparison_operatorvalid_number
หากต้องการส่งคืนผลลัพธ์ที่ไม่เป็นค่าว่างภูมิศาสตร์ 1และภูมิศาสตร์ 2ต้องมีSpatial Reference Identifier (SRID)เดียวกัน มิฉะนั้นวิธีการส่งกลับ NULL
ดัชนีเชิงพื้นที่สนับสนุนรูปแบบเพรดิเคตต่อไปนี้:
geography1 STIntersects (ภูมิศาสตร์ 2) = 1
geography1 STEquals (ภูมิศาสตร์ 2) = 1
geography1 ระยะทาง (ภูมิศาสตร์ 2) <จำนวน
geography1 ระยะทาง (ภูมิศาสตร์ 2) <= จำนวน
คำค้นหาที่ใช้ดัชนีเชิงพื้นที่
ดัชนีเชิงพื้นที่ได้รับการสนับสนุนเฉพาะในแบบสอบถามที่มีตัวดำเนินการเชิงพื้นที่ที่จัดทำดัชนีไว้ในส่วนคำสั่ง WHERE ตัวอย่างเช่นไวยากรณ์เช่น:
[spatial object].SpatialMethod([reference spatial object]) [ = | < ] [const literal or variable]
เครื่องมือเพิ่มประสิทธิภาพแบบสอบถามเข้าใจถึงการสับเปลี่ยนของการดำเนินงานเชิงพื้นที่ (นั้น@a.STIntersects(@b) = @b.STInterestcs(@a)
) อย่างไรก็ตามดัชนีอวกาศจะไม่ถูกใช้หากจุดเริ่มต้นของการเปรียบเทียบไม่มีตัวดำเนินการเชิงพื้นที่ (ตัวอย่างเช่นWHERE 1 = spatial op
จะไม่ใช้ดัชนีเชิงพื้นที่) หากต้องการใช้ดัชนีเชิงพื้นที่ให้เขียนการเปรียบเทียบใหม่ (ตัวอย่างWHERE spatial op = 1
)
...
แบบสอบถามต่อไปนี้จะทำงานหากSimplePolysGeogs
ทับซ้อน:
;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