মাইক্রোসফ্ট ডক্স অনুসারে, স্পেসিয়াল ইনডেক্সগুলি যখন কোনও 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
আপনার নীচের মত একটি প্রশ্ন থাকতে পারে (আমি এই পোস্টটি দ্রুত লিখেছিলাম এবং এখনও পরীক্ষা করে দেখিনি, এটি চেষ্টা করার মতো কিছু কারণ আমি দেখেছি যে আপনার ক্যোয়ারী এবং সর্বাধিক পোস্ট করা উত্তরগুলি স্থানিক ওপ = 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
এফওয়াইআই: SimplePolysGeog
ওভারল্যাপিং শেষ না হলে উপরেরগুলি কাজ করে না (একটি পিনের মতো দুটি সরল ভূগোলের মধ্যে থাকতে পারে, এটি কেবল একটি রাজ্যের সীমান্তে লোকের উপর দৌড়ে এবং যেহেতু সাধারণ পলিসি সীমানা ভাগ করে দেয়, সীমাবদ্ধ বাক্সগুলি ওভারল্যাপ করে) তাই বেশিরভাগ ব্যবহারে কেসগুলি, এটি এমন একটি ত্রুটি ছুঁড়ে দেবে যা subquery একাধিক ফলাফল প্রত্যাবর্তন করেছে।
এমএস ডক্সের স্পেশাল ইনডেক্সগুলি ওভারভিউ থেকে :
ভূগোল পদ্ধতি স্থানীয় সূচকগুলি দ্বারা সমর্থিত
কিছু শর্তের মধ্যে, স্থানিক সূচকগুলি নিম্নলিখিত সেট-ভিত্তিক ভূগোল পদ্ধতিগুলি সমর্থন করে: STIntersects (), STEquals (), এবং STDistance ()। একটি স্থানিক সূচক দ্বারা সমর্থিত হওয়ার জন্য, এই পদ্ধতিগুলি অবশ্যই কোনও প্রশ্নের কোনও ক্লজের মধ্যে ব্যবহার করা উচিত এবং সেগুলি অবশ্যই নিম্নলিখিত সাধারণ ফর্মের একটি প্রাকটিকের মধ্যে উপস্থিত হতে হবে:
geography1.method_name (geography2) comparison_operatorvalid_number
একটি নন-ফলাফল বাতিল করতে, ভূগোল 1 এবং ভূগোল 2 এর অবশ্যই একই স্থানিক রেফারেন্স আইডেন্টিফায়ার (এসআরআইডি) থাকতে হবে । অন্যথায়, পদ্ধতিটি NULL প্রদান করে।
স্থানিক সূচকগুলি নিম্নলিখিত ভবিষ্যদ্বাণীপূর্ণ ফর্মগুলি সমর্থন করে:
স্থানিক সূচকগুলি ব্যবহার করে এমন প্রশ্নগুলি
স্পেসিয়াল ইনডেক্সগুলি কেবলমাত্র কোয়েরিতে সমর্থিত হয় যেখানে 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