পোস্টজিআইএসে বাউন্ডিং বক্স কোয়েরি সম্পাদন করছেন? [বন্ধ]


22

আমার কাছে প্রায় 2 মিলিয়ন সারি সহ পোস্টগ্র্রেএসকিউএল টেবিল রয়েছে, coordinatesফর্মটিতে দীর্ঘ-লাত্ত ক্ষেত্র রয়েছে POINT(-73.4938 33.2405)

মনে করুন যে সেই ক্ষেত্রটিতে একটি ভূ-স্থানিক সূচক রয়েছে, একটি স্বেচ্ছাসেবী সীমানা বাক্সের মধ্যে সমস্ত সারি নির্বাচন করার সবচেয়ে দক্ষ, দ্রুততম কোন উপায়?

বক্স মত হল SW long-lat: -74.0042 40.7688, NE long-lat: -73.8809 40.7984


আপনার সঞ্চিত স্থানাঙ্কগুলি কি ইতিমধ্যে দীর্ঘ-লাত্ত বা সেগুলি গ্রিড (এক্স, ওয়াই)?
মার্টিন এফ

1
সরল গণিত এখানে করবে ... পয়েন্ট.এক্স যদি SW.x এর চেয়ে বড় এবং NE.x এর চেয়ে ছোট এবং পয়েন্ট.ই একই সাথে SW.y এর চেয়ে বড় এবং NE.y এর চেয়ে ছোট হয় তবে বিন্দুটি ভিতরে থাকে MBR- এ। যদিও এটি স্থানিক ক্যোয়ারী ব্যবহার করার চেয়ে দ্রুততর কিনা তা আমি জানি না। আপনি চেষ্টা করতে মন আছে?
মিশাল জিম্মারম্যান

@zimmi তিনি নেই আসলে বলে যে আইটেম হয় মাত্র পয়েন্ট; তারা জটিল জ্যামিতি হতে পারে।
মার্টিন এফ

তারা হয় মাত্র পয়েন্ট, যদিও ;-)। তারা ডাব্লুকেবি হিসাবে সঞ্চিত POINT (-73.4938 33.24059) আকারে দীর্ঘস্থায়ী।
আভিশাই

আমি তথ্যটি প্রতিবিম্বিত করতে Q (এবং আমার A) সম্পাদনা করেছি। :-)
মার্টিন এফ

উত্তর:


24

ধরে নেওয়া যে প্রদত্ত বাউন্ডিং বাক্স সীমাগুলি সংরক্ষণ করা স্থানাঙ্কগুলির মতো একই স্থানিক রেফারেন্স সিস্টেমে রয়েছে এবং আপনি জানেন যে কোন স্থানিক অপারেটর (ছেদ করে বা এর দ্বারা সংযুক্ত) আপনার প্রয়োজন:

SELECT *
FROM   my_table
WHERE  coordinates 
    && -- intersects,  gets more rows  -- CHOOSE ONLY THE
    @ -- contained by, gets fewer rows -- ONE YOU NEED!
    ST_MakeEnvelope (
        xmin, ymin, -- bounding 
        xmax, ymax, -- box limits
        my_srid)

বিকল্পভাবে, আপনি যদি "অন্তর্ভুক্ত" ("অন্তর্ভুক্ত" এর পরিবর্তে) শব্দটি পছন্দ করেন তবে এই WHEREধারাটি উল্টানো উচিত:

WHERE  ST_MakeEnvelope (...)
    ~ -- contains, gets same fewer rows 
    coordinates 

দ্রষ্টব্য: (পরে উপরে পোস্ট করা হয়েছে ওপি দ্বারা) প্রদত্ত যে রেকর্ড হয় সহজ পয়েন্ট, আমি মনে করি যে পার্থক্য "ছেদ করে" এবং "সংবরণ" এর মাঝে খুব সূক্ষ্ম হয়ে, শুধুমাত্র পয়েন্ট প্রভাবিত প্রান্ত উপর সীমান্ত বাক্সের।


এটা একটা ভাল দিক. ধারণাগুলি ভাল হওয়া উচিত, যেহেতু আপনি কোনও মানচিত্রের চিহ্নিতকারীকে সীমানার উপরে অবস্থান করতে সক্ষম হতে পারবেন না (যেমন, সম্ভবত ব্রাউজার ক্রোম)।
অবভিশাই

What's the fastest ...?: ওপি
ম্যাগনো সি

সচেতন থাকুন: &&এবং @যখন বহুভুজ জ্যামিতি সঙ্গে ছেদ কাজ বলে মনে হচ্ছে না। এই ক্ষেত্রে, ST_Intersects(latlng_column,ST_GeomFromText('Polygon ((...))',4326))বা বিকল্পভাবে ব্যবহার করুনST_Contains
অ্যালেক্স


2

স্পষ্টতই, আমার কাছে কোনও মন্তব্য যুক্ত করার মতো পর্যাপ্ত পয়েন্ট নেই তাই আমি এই উত্তরটি ব্যবহার করে বলছি যে আমি "x> মিনি_ x এবং x <সর্বোচ্চ_ x এবং y> মিনি_ই এবং y <ম্যাক_ই" এর তুলনায় গণিতের তুলনায় ST_MakeEnvelope উভয়ই চেষ্টা করেছি। .. গড়পড়তাতে ST_MakeEnvelope 60 মিমি নিয়েছে এবং গণিতের তুলনাটি আমার বিশেষ ববক্স ক্যোয়ারীতে 155 মিমি নিয়েছে।

সুতরাং স্থানিক অনুসন্ধান ST_MakeEnvelope গণিতের তুলনায় দ্রুত হওয়া উচিত!


1
প্রকৃতপক্ষে, আপনি সঠিক সূচকগুলি min_x, সর্বোচ্চ_ x, মিনি_ই এবং সর্বোচ্চ_এটি তৈরি করলে আরও দ্রুত হবে। আমার একটি খুব বড় ডেটাসেট রয়েছে (3 মিলিয়নেরও বেশি বহুভুজ) এবং INDEXএসT_MakeEnvelope এবং (ST_XMax, ST_XMin, ST_YMax, ST_YMin) উভয়ই করেছিলাম এবং এই পার্থক্যটি গণিতের পক্ষে বিপুল পরিমাণে। ম্যাথ আমাকে 20 দশকেরও কম সময় নিয়েছে (আইএনডিএক্সএক্স + কোয়েরি) যখন
খামটি ছেদটি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.