PostgreSQL / PostGIS স্থানিক সূচক - কোনও গতি বাড়েনি


15

পোস্টগ্র্রেএসকিউএল / পোস্টজিআইএস ডাটাবেসে আমার একটি স্থানিক টেবিল রয়েছে। এর প্রতিটি সারি একটি বহুভুজকে উপস্থাপন করে। এটি নিম্নলিখিত ফর্মের:

+----+--------+
|gid |   way  |
+----+--------+
|241 | 01030..|

জ্যামিতিক কলামটি "উপায়" যা বহুভুজের জন্য জ্যামিতি ধারণ করে। ডব্লিউ কেটি-তে এটি হ'ল: পলিজন (('....'))। একে অপরের মধ্যে দুটি বহুভুজ রয়েছে কিনা তা পরীক্ষা করতে আমি এই টেবিলটিতে প্রচুর এসT_Contains কোয়েরি করছি:

Select ST_Contains(a.way, b.way) From table AS a, table AS b Where a.gid = 15 And b.gid = 16

আমি কীভাবে এই ক্যোয়ারীটি গতিময় করব তা ভাবছিলাম এবং টেবিলে একটি স্থানিক সূচক যুক্ত করলাম:

CREATE INDEX table_way_gist ON table USING gist(way);

তবে আসলে আমি গতি বাড়তে দেখছি না। আমি সূচকটি তৈরি করি তারপরে আমি এস-এস-সংক্রান্ত প্রশ্নগুলি করার আগে সমস্ত বহুভুজ দিয়ে টেবিলটি পূরণ করেছি। একটি টেবিল পূরণের আগে সূচিটি যুক্ত করা উচিত? সূচকের সাথে কাজ করার জন্য টেবিলে কি বিশেষ প্রয়োজনীয়তা রয়েছে? জ্যামিতিক কলামের প্রজেকশন (srid) 900913 এ সেট করা আছে।

আমি ব্যবহার করছি: পিএসকিএল (পোস্টগ্রিএসকিউএল) 9.1.4 / পোস্টজিআইএস = "1.5.3"

উত্তর:


16

আপনার প্রশ্নের মধ্যে প্রকাশিত ক্যোয়ারির জন্য সবচেয়ে দক্ষ সূচকটি হ'ল জিডের কারণ এটি কেবলমাত্র কলাম যা যেখানে প্রকাশিত হয়:

 CREATE INDEX table_gid ON table (gid);

আপনি গিস্ট সূচকটি নিরাপদে ফেলে দিতে পারেন কারণ এটি কেবল স্থান গ্রহণ করবে এবং স্লো সন্নিবেশ / আপডেট / মুছে ফেলবে।

দীর্ঘ ব্যাখ্যা

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

  ST_Contains(a.way, b.way)

সূচকের দিকে না তাকিয়ে espression কারণ যে প্রশ্নের সাথে পরিকল্পক সম্ভবত অনুমান করবে আপ খুঁজছেন অতিরিক্ত খরচ সারকথা উভয় কলাম উপর সূচক বনাম আপ খুঁজছেন a.way এবং b.way সরাসরি মান মূল্য সন্ধান করার সারির মোট নম্বর হিসাবে প্রচেষ্টা নয় সূচকটি অনন্য হলে বিশেষত খুব ছোট।

থাম্বের নিয়ম হিসাবে মনে রাখবেন যে পরিকল্পনাকারী সম্ভবত ছোট ডেটাসেটের জন্য একটি সূচক স্ক্যানের উপরে টেবিল স্ক্যানের পক্ষে যাবে (টেবিলের পরিসংখ্যান দেখে ডেটাসেটের আকারগুলি অনুমান করা হয়)।


বিষয়টি আমার কাছে আরও স্পষ্ট করে তোলে। আমি এটা চেষ্টা করব. সুতরাং আমি যদি যেখানে এস-কন্টেইনস () কোয়েরিটি WHERE ধারাটিতে রেখেছি, তবে স্থানিক সূচকটি আসলে সহায়ক হবে? আমি মনে করি যেখানে আমার ক্লাসটি যেখানে আমার পরিচ্ছেদের মধ্যে ST_Contains কল করতে পুনর্গঠন করতে হবে। এই মুহুর্তে আমি সমস্ত বহুভুজ দিয়ে পুনরাবৃত্তি করছি এবং সর্বদা সেগুলির দুটি পৃথক করে পরীক্ষা করছি।
মিচিমিচবেক

?? আপনি সিনিং করছেন যে একটি স্থানিক সূচক জিনিসগুলি ধীর করে দেয়? এটি আমার জন্য নতুন কারণ কারণ আমি যেখানে কাজ করি সেখানে প্রতিটি টেবিলের জন্য আমাদের স্থানিক সূচী রয়েছে এবং আমি ভাবছি এটি খারাপ অভ্যাস
কিনা

13

ইউনিকোলেটি যেমন বলেছিলেন, জ্যামিতি কলামের গিস্ট সূচকটি কেবল তখনই কাজ করবে যদি আপনি WHERE এক্সপ্রেশনটিতে ST_Contains () ব্যবহার করেন।

উদাহরণস্বরূপ, আপনি যদি একে অপরের সমন্বিত সমস্ত বহুভুজগুলি জানতে চান তবে আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

SELECT a.gid, b.gid
FROM table AS a, table as b
WHERE a.gid != b.gid and ST_Contains(a.way, b.way)

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


হ্যাঁ আমি দেখতে পাচ্ছি, সূচি সীমানা পরীক্ষা জড়িত করার জন্য আমার এই প্রশ্নের প্রয়োজন। থেক্স এক্স আলেকজান্দ্রে। (আমি ইউনিকোলেটিকে সমাধান হিসাবে চিহ্নিত করব, কারণ তিনি দ্রুত ছিলেন এবং বিষয়টি আমার কাছে পরিষ্কার করেছেন)
মিচিমিচব্যাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.