জিআইএসটি সূচক (<-> ফাংশন) ব্যবহার করে পোস্টগিস ২.০ এ নিকটস্থ নিকটবর্তী সমস্যা


25

আমি আমার টেবিলের প্রতিটি সারি (মহাকাশ 1), একই বর্গের নিকটতম বহুভুজের দূরত্ব গণনা করতে Postgis 2.0 নতুন ফাংশন <-> (জ্যামিতি দূরত্ব সেন্ট্রয়েড) ব্যবহার করার চেষ্টা করছি।

আমি নিম্নলিখিত কোডটি ব্যবহার করার চেষ্টা করছিলাম:

WITH index_query AS (
  SELECT g1.gid As ref_gid, ST_Distance(g1.the_geom,g2.the_geom) As ENN    
    FROM "cosn1" As g1, "cosn1" As g2   
    WHERE g1.gid <> g2.gid AND g1.class = g2.class
    ORDER BY g1.gid, g1.the_geom <-> g2.the_geom) 
SELECT DISTINCT ON (ref_gid) ref_gid, ENN 
    FROM index_query
ORDER BY ref_gid, ENN;

তবে আমি তখন সতর্কতাটি বুঝতে পারি:

দ্রষ্টব্য: সূচকগুলি কেবল তখনই কিক্স করে যদি কোনও জ্যামিতির কোনও একটি ধ্রুবক হয় (কোনও subquery / cte এ নয়)। যেমন 'এসআরআইডি = 3005; পয়েন্ট (1011102 450541)' :: a.geom এর পরিবর্তে জ্যামিতি

অর্থাত্ সূচকটি মোটেও ব্যবহৃত হবে না, এবং ক্যোয়ারীটি ব্যবহারের আগের মতো প্রায় একই সময় নেবে:

SELECT DISTINCT ON(g1.gid)  g1.gid As ref_gid, ST_Distance(g1.the_geom,g2.the_geom) As ENN    
    FROM "cosn1" As g1, "cosn1" As g2   
    WHERE g1.gid <> g2.gid AND g1.class = g2.class
    ORDER BY g1.gid, ST_Distance(g1.the_geom,g2.the_geom)

কেউ কি আমাকে এমন কোনও কাজের নির্দেশ করতে পারেন যা আমাকে আমার প্রশ্নের পারফরম্যান্স উন্নত করতে দেয়?

আপনাকে অনেক ধন্যবাদ.


এখনও কোনও প্রতিক্রিয়া দেওয়া হয়নি, আপনি এটি পোস্টজিআইএস মেলিং তালিকায় জানতে চাইতে পারেন।
জিআইএস-জনাথন

আমি ইতিমধ্যে করেছি, কিন্তু কোনও প্রতিক্রিয়া ছাড়াই।
আলেকজান্দ্রি নেটো

3
আপনি যেখানে ক্লজটিতে g1.gid> g2.gid ব্যবহার করতে পারেন, তা আপনাকে করতে হবে এমন দূরত্ব গণনার সংখ্যা হ্রাস করবে। দুর্ভাগ্যক্রমে, <<> অপারেটর ধ্রুবক ছাড়াই কাজ না করা পর্যন্ত আমরা এই ধরণের ক্যোয়ারিতে গতির উন্নতি খুব বেশি দেখতে পাব না।
জন পাওয়েল

জন, আমার সমস্ত গিডগুলি রাখতে হবে, এমনকি আমার "মহাবিশ্বাস" টেবিলের বহুভুজের প্রত্যেকটির জন্য ইইএন আপডেট করার প্রয়োজন অনুসারে পুনরাবৃত্তি করা উচিত। তবে আপনি যা বলেছিলেন তা আমাকে ধারণা দিয়েছে। আপনি g1.gid> g2.gis ব্যবহার করে দূরত্বের গণনা হ্রাস করতে বলেছিলেন, তবে ফলাফলটিতে g1.gid এবং g2.gid রেখেছি do এর পরে, আমি এর দুটি সাবকিউরিয়াকে সংযুক্ত করতে পারলাম (একটি জিডির সাথে জিড হিসাবে এবং অন্যটি জি 2 এসআইডি সহ)। ধন্যবাদ
আলেকজান্দ্রে নেটো

আমি খুঁজে পেয়েছি যে অবিচ্ছিন্ন সমস্যার সমাধানের একটি সম্ভাব্য সমাধান হ'ল <-> একটি এসকিউএল ফাংশনের ভিতরে <_> পরামিতি হিসাবে ব্যবহার করে use আমি কিছু পরীক্ষা করেছি এবং কিছু ক্ষেত্রে এটির দ্রুততা ()। তবে আমার ক্ষেত্রে, যেহেতু দূরত্ব একই টেবিলের মধ্যে রয়েছে তাই প্রক্রিয়া চলাকালীন অনেক দূরত্বের গণনা পুনরাবৃত্তি হয়, এটি সরাসরি জিজ্ঞাসাটি ব্যবহারের চেয়ে ধীর করে তোলে।
আলেকজান্দ্রে নেটো

উত্তর:


2

আমার মেশিনে কিছু পরীক্ষা করা হুম এই অপারেটরের মতো শোনাচ্ছে <-> সঠিকভাবে কাজ করছে না। আমি নিশ্চিত নই যে এটি একটি ত্রুটিযুক্ত তবে এটি ওভারল্যাপড জ্যামিতিগুলিতে শূন্যতম দূরত্বের প্রতিবেদন করেছে। না জড়ো?

ওয়েল ফেয়ার ট্র্যাডিশনাল এসকিউএল কোয়েরি অপটিমাইজেশন সম্পর্কে কী? <-> অপারেটরের সাথে এই অপ্রত্যাশিত ফলাফলের পরে আমি এটিকে st_centroid এর সাথে প্রতিস্থাপন করি। গতিতে অনেক ভাল ফলাফল পেয়েছে।

আশা করি st_overlaps সহ শব্দার্থকতা একই রকম থাকবে। অন্তত <-> সম্পর্কে ডকুমেন্টেশন থেকে আমি বুঝতে পেরেছিলাম

পোস্তিগেজে ডক্স থেকে <->

অন্যান্য জ্যামিতির ধরণের জন্য ভাসমান পয়েন্ট বাউন্ডিং বক্স সেন্ট্রয়েডের মধ্যে দূরত্ব ফিরে আসে।

আমার পরীক্ষার ডেটাতে .5 5.5 কে বহুভুজ সহ স্থানিক সূচক ছাড়াই 1000 ডলার থেকে সেকেন্ডে 5 গিগাবাইট পর্যন্ত গতি পেয়েছে।

যাইহোক কেন গোষ্ঠীকরণ করতে DISTINCT ব্যবহার করছেন? আমি দেখতে পাচ্ছি কিছু লোক এটি ব্যবহার করছে তবে দলটি নকলগুলি অপসারণের জন্য বিদ্যমান নেই?

St_centroid ত্রুটি ছাড়াই স্ট্যান্ডার্ড এসকিউএল অপ্টিমাইজেশন সহ আপনার ক্যোয়ারী প্রবর্তিত

select g1.gid, min( st_distance( g1.the_geom, g2.the_geom ) ) AS enn
FROM 
  "cosn1" AS g1, "cosn1" AS g2
WHERE
  g1.gid <> g2.gid
  AND g1.class = g2.class
  AND g1.the_geom && g2.the_geom
GROUP BY
  g1.gid

শুভ বড়দিনের ছুটি!


দুঃখিত তবে আপনার উত্তরটি সমস্যার সমাধান করে না। এটি বাস্তবে অনেক দ্রুত, তবে ফলাফলগুলি নির্ভুল নয়, যেহেতু চূড়ান্ত ফলাফলটি তাদের বাস্তব জ্যামিতির পরিবর্তে বহুভুজগুলির সেন্ট্রয়েড ব্যবহার করে গণনা করা হয়। <-> লক্ষ্য নিকটবর্তী প্রতিবেশী প্রার্থীদের জন্য অনুসন্ধানের জন্য অনুকূলিতকরণ করা তবে শেষ পর্যন্ত সেরা প্রার্থীদের দূরত্ব গণনা করতে আসল জ্যামিতিগুলি ব্যবহার করা উচিত। আমি DISTINCT ON ON অর্ডার দ্বারা পরিবর্তে MIN \ GROUP BY ব্যবহার করার চেষ্টা করেছি এবং এটি ধীর বলে মনে হচ্ছে।
আলেকজান্দ্রে নেটো

তবে অপারেটরের জন্য পোস্টগিস্ট ম্যানুয়াল <>> বলেছে যে এটি নন পয়েন্ট জ্যামিতির জন্য সেন্ট্রয়েড ব্যবহার করে। সুতরাং আমার সমাধান আপনাকে অনুরূপ ফলাফল দেবে। এটি আপনাকে আপনার শীর্ষ ক্যোয়ারির মতো ফলাফল দেয়। অপারেটরের </> এর সাথে ফলাফলগুলিও ঠিক আছে কিনা তা পরীক্ষা করে দেখুন। এটি আমার পরীক্ষার ডেটাতে শূন্য দৈর্ঘ্যের জ্যামিতিগুলির প্রতিবেদন করেছিল যাতে এর ফলাফলগুলি ভেঙে যেতে পারে এবং এই সমাধানটি আরও সঠিক ডেটা দেয়। আপনি যদি কিছু পাস্টি সাইটে ত্রুটিগুলি দেখিয়ে কিছু নমুনা রেকর্ড পোস্ট করতে সক্ষম হন তবে আমরা সমাধানের ত্রুটিগুলি আবিষ্কার করতে পারি।
কাভিলা

আপনি যদি আমার জিজ্ঞাসাটি পরীক্ষা করেন তবে <-> অপারেটরটি কেবলমাত্র প্রার্থীদের অর্ডার দেওয়ার জন্য ব্যবহার করা হত, চূড়ান্ত ফলাফলটি আসল জ্যামিতিগুলি ব্যবহার করে গণনা করা হয়। যাইহোক, যেমন আমি আগেই বলেছিলাম, <-> পারফরম্যান্স বুস্ট কেবলমাত্র নির্দিষ্ট পয়েন্টগুলির সাথে কাজ করে। এটা আমার মূল প্রশ্ন ছিল।
আলেকজান্দ্রে নেটো

সুতরাং, আপনি কি সম্মত হন যে শীর্ষ কোয়েরিটি নীচের প্রশ্নের সাথে সমান নয়? যেহেতু আদেশটি পরিবর্তিত হবে কারণ অপারেটর <-> স্ট্রিডেন্ট্রয়েড দ্বারা অর্ডার করবে এবং st_distance আপনাকে একটি পৃথক মান দেবে? বিভাগে DISTINCT এ যাওয়ার জন্য বিভিন্ন ক্রমটি প্রথম সারিতে আলাদা ক্যোয়ারী আনতে পারে? বৈধ ক্যোয়ারী নীচে এক যে গতির উন্নতি প্রয়োজন?
ক্যাভিলা

হ্যাঁ, প্রথম ক্যোয়ারী নীচের দিকের গতি উন্নত করার উদ্দেশ্য। এবং হ্যাঁ, এটি কিছুটা আলাদা ফলাফল দিতে পারে, যেহেতু g1.geom <-> g2.geom সেন্ট্রয়েড ব্যবহার করে এবং এর অর্থ হ'ল প্রথম সারিটি খুব কাছের নাও হতে পারে। এটিকে কাজ করার জন্য আমি বিশ্বাস করি যে ধারাটিতে বলার জন্য আমাকে সীমাতে একটি সীমা রাখতে হবে 10 বলুন তারপর দূরত্বের আসল মানগুলি বের করতে হবে ract এমনকি পরিবর্তে <#> ব্যবহার করতে পারে, এটি সেন্ট্রয়েডের পরিবর্তে বাউন্ডিং বাক্স ব্যবহার করে।
আলেকজান্দ্রি নেটো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.