PostGIS ST_Intersects এ পারফরম্যান্স সমস্যাটি কীভাবে ঠিক করবেন?


9

আমি পোস্টগিসে নবাগত এবং ক্যোরি পারফরম্যান্সে আমার সমস্যা আছে have

এটি আমার প্রশ্ন:

SELECT DISTINCT ON (userid) userid ,ST_AsText(position), timestamp  
FROM table1 
WHERE ST_Intersects ( ST_GeomFromText('a multiypolygon geom goes here',4326),position) 
ORDER BY userid, timestamp desc

এবং সমস্যাটি হ'ল আমার মাল্টিপলিংগনটিতে অনেকগুলি বৃহত বহুভুজ অন্তর্ভুক্ত রয়েছে (ওয়ার্ড ডকের লম্বায় pages০০ পৃষ্ঠাগুলি!) এবং এটি কার্যকর করতে 2 ঘণ্টারও বেশি সময় লেগেছিল!

আমার ক্যোয়ারীটি অনুকূল করার বা অন্য কোনও উপায়ে ব্যবহার করার কোনও উপায় আছে?

আপনার সাহায্যের প্রশংসা করা হয় দয়া করে!

উত্তর:


8

আপনার যা করা উচিত তা হ'ল একক বহুভুজ হিসাবে (এসT_ ডাম্প সহ) একটি বড় টেবিলে আপনার বৃহত গুণকটি স্থাপন করা এবং এটিতে একটি সূচক স্থাপন করা। কিছুটা এইরকম:

CREATE TABLE big_polygon as
SELECT (ST_Dump( ST_GeomFromText('a multiypolygon geom goes here',4326))).geom as geom;

-- It is always great to put a primary key on the table
ALTER table big_polygon ADD Column gid serial PRIMARY KEY;

-- Create the index
CREATE INDEX idx_big_polygon_geom
on big_polygon
USING gist(geom);

-- To give the database some information about how the index looks
analyze big_polygon;

-- Then you go:
SELECT DISTINCT ON (userid) userid ,ST_AsText(position), timestamp  
FROM table1, big polygon WHERE ST_Intersects ( big_polygon.geom,position) 
ORDER BY userid, timestamp desc;

বেশ কয়েকটি কারণে তা দ্রুত হওয়া উচিত।


এই দুর্দান্ত উত্তরের জন্য নিক্লাসকে ধন্যবাদ। দুঃখিত, আমি উল্লেখ করতে মিস করলাম যে আমার একাধিক বহুভুজ রয়েছে এবং সেগুলি ইতিমধ্যে সূচী সহ একটি টেবিলে সঞ্চিত রয়েছে। তবে আমি জিওমের ডেটা সরাসরি সরবরাহ করার চেষ্টা করতাম দ্রুত। যাইহোক, আমি আপনার পরামর্শ মতো চেষ্টা করে দেখি তবে এটি এখনও খুব দীর্ঘ সময় নেয়! অন্য কোন পরামর্শ?
সারা

@ সারা ঠিক আছে, তাই আমি ST_Dump এর সাথে পরামর্শ হিসাবে আপনি বহুগুণবিদ্যাকে একক জ্যামিতিতে বিভক্ত করার চেষ্টা করেছেন?
নিক্লাস আভেন

আমরা কয়টি ব্যবহারকারীর অবস্থানের কথা বলছি? কত বড় বহুভুজ? বড়_পলিগন_সামগ্রী থেকে SELECT ST_npPoint (geom) থেকে আপনি কী পাবেন ??
নিক্লাস আভেন

দুঃখিত আমার খারাপ, আমার টেবিলগুলি আপনার জন্য আরও স্পষ্ট করার জন্য আমাকে আরও ব্যাখ্যা করতে দিন: আমার টেবিল 1 রয়েছে যেখানে একটি জিওম কলাম রয়েছে যার প্রায় 230 সারি রয়েছে এবং প্রতিটি সারিতে একটি বহুভুজ রয়েছে (তারা দেশগুলিকে প্রতিনিধিত্ব করে তাই তারা আকারে পরিবর্তিত হয়) , এবং সূচী_জাম করল মধ্যে রয়েছে। টেবিল 2 যা অবস্থান কলাম (পয়েন্ট), টাইমস্ট্যাম্প, ইউজারিড এবং আইডি (পিকে) এবং 3 সূচক (অবস্থান, টাইমস্ট্যাম্প, ইউজারিড) ব্যবহার করে তৈরি করা হয়েছে। ১.. আমি আপনাকে বিভ্রান্ত করলে আমি দুঃখিত তবে সত্যই আপনার সহায়তা দরকার! ধন্যবাদ
সারা

2

এটি নির্ভর করে কী ধরণের গুণমান - নির্ভুলতা আপনার প্রয়োজন। আপনি বহুভুজগুলি স্পষ্টতই সরল করতে পারেন: http://postgis.net/docs/ST_Simplify.html

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

আশা করি আপনি কিছুটা সাহায্য করেছেন!


আপনার দ্রুত প্রতিক্রিয়া জন্য ধন্যবাদ মার্টিন। আমার সমস্যাটি হ'ল ফলাফলটি খুব নির্ভুল হওয়ার জন্য আমার প্রয়োজন দরকার তাই আমি মনে করি এই ফাংশনটি এখানে আমাকে সহায়তা করবে না! তবে পরামর্শের জন্য ধন্যবাদ
সারা

0

আপনার পোস্টগ্রিজ এবং / অথবা স্কুয়েল দক্ষতার উপর নির্ভর করে আপনার বেশ কয়েকটি বিকল্প রয়েছে:

  1. আপনি কোনও বিশেষ বাধা মারছেন কিনা তা জানতে এক্সপ্লেইন কমান্ডের মাধ্যমে ক্যোয়ারী বিশ্লেষণ করুন । সতর্কতা: কখনও কখনও এক্সপ্ল্যান এর আউটপুট বুঝতে অসুবিধা হতে পারে

  2. আপনি যদি আশা করেন যে টেবিল 1-এর বেশিরভাগ বা জ্যামিতির কোনও উল্লেখযোগ্য অংশটি একটি বহুভুজকে ছেদ করে না তবে আপনি একটি সরল বহুভুজের বিরুদ্ধে প্রাথমিক শর্ত প্রয়োগ করার চেষ্টা করতে পারেন (অর্থাত্ ছোট টুকরাগুলিতে গুণকটি ভেঙে) এবং তারপরে কেবল ভারি মাল্টিপলিজোন ছেদটি চালান on ফলাফল। একটি উদাহরণ জন্য নিচে দেখুন।

  3. যদি এবং কেবলমাত্র সিপিইউ যদি বাধা হয় (যেমন সার্ভারটি কম্পিউটারের ছেদগুলি আটকে থাকে) তবে আমি আপনাকে দৃly়ভাবে পরামর্শ দিচ্ছি যে আপনি একটি বড়, দ্রুত, আরও শক্তিশালী সিপিইউ পান বা এক সময়ের হাই-সিপিইউ ইনস্ট্যান্ট ভাড়া নেবেন যখন আপনি অ্যামাজনের ইসি 2 বন্ধ করবেন এবং আপনি যখন তা ধ্বংস করবেন সম্পন্ন

আইটেম 2 এর উদাহরণ উদাহরণ:

SELECT DISTINCT ON (st1.userid) st1.userid ,ST_AsText(st1.position), st1.timestamp  
FROM (
    select userid, position, timestamp from table1 
    WHERE ST_Intersects ( YOUR_MULTIPOL_BOUNDS_HERE,position)
) as st1 
WHERE ST_Intersects ( ST_GeomFromText('a multiypolygon geom goes     here',4326),st1.position) 
ORDER BY st1.userid, st1.timestamp desc

পারফরম্যান্স উন্নত করতে আপনি অস্থায়ীভাবে সাবটেলাইট st1 কে টেবিল হিসাবে সাময়িকভাবে রূপায়িত করতে পারেন যাতে আপনি এটি সূচী করতে পারেন।

@ নিক্লাস মন্তব্যগুলিতে ঠিক উল্লেখ করতে পারে যে প্রস্তাবনা 2 উদাহরণস্বরূপ সাহায্য না করা উচিত। তিনি ঠিক আছেন, তবে আমি মনে করি আমিও (আংশিক) ঠিক আছি।

প্রকৃতপক্ষে মনে হয় পোস্টমিস এমএল-তে ঠিক গত নভেম্বরেই খুব অনুরূপ একটি প্রশ্ন জিজ্ঞাসা করা হয়েছিল (এবং উত্তর দেওয়া হয়েছিল):

http://postgis.refractions.net/pipermail/postgis-users/2011-November/031344.html

এবং প্রস্তাবটি প্রমাণ করে দেয় যে বহুভুজটি ভেঙে দেওয়া উচিত যাতে সূচকটি সবচেয়ে কার্যকরভাবে মিথ্যা ছেদগুলি ফিল্টার করতে পারে যা অন্যথায় সাধারণ সীমানা চেক দ্বারা চালিত হতে পারে।


প্রস্তাবনা 2 সাহায্য করবে না কারণ সূচক ঠিক তাই করছে। যাতে কনস্ট্রাক্ট ঠিক আবার একই কাজ করা হবে।
নিক্লাস আভেন

@ নিক্লাসআভান আপনি ঠিক বলেছেন, আমি উত্তরটি সংশোধন করেছি
ইউনিকোলেটী

0

ব্যবহার ST_SubDivide()

পোস্টগিসের ২.২ সংস্করণের জন্য, আপনি ব্যবহার করতে পারেন ST_SubDivide

ST_Subdivide - জ্যামিতির একটি সেট প্রদান করে যেখানে সেটটিতে কোনও জ্যামিতির উল্লম্বের নির্দিষ্ট সংখ্যার বেশি নয়।

setof geometry ST_Subdivide(geometry geom, integer max_vertices=256);

আপনি এছাড়াও

  • একটি টেম্প টেবিল ব্যবহার করুন
  • একটি সূচক

এখানে আমরা ST_SubDivideবহুভুজকে 10 বা ততোধিক কোণে সাব-পলিগনগুলিতে বিভক্ত করতে ব্যবহার করি ।

CREATE TEMP TABLE divided AS
SELECT ST_SubDivide(bigmultipolygon,10)::geometery AS t(geom);

CREATE INDEX divided_idx ON divided USING gist(geom);

তারপর

SELECT DISTINCT ON (userid) userid ,ST_AsText(position), timestamp  
FROM table1
JOIN divided AS d
  ON ST_Intersects( d.geom, position )
ORDER BY userid, timestamp desc;

উপরের কাজটি করবেন না, এটি গোলাকার ত্রুটিগুলি উপস্থাপন করে

সাধারণ টিউনিং

ডক্সে পারফরম্যান্স টিপস শিরোনামে বিভাগটি দেখুন । আপনি যথাযথভাবে সুর করেছেন তা নিশ্চিত করুন। max_parallel_workers_per_gatherসমান্তরালতার সুবিধা গ্রহণের জন্য উত্থাপন বিবেচনা করুন (বর্তমানে ডিফল্ট অফ অফ)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.