ফাংশন পারফরম্যান্স


46

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

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


আপনি কি বোঝাতে চেয়েছেন যে আপনি কোনও কাজের সাথে সম্পর্কিত নয় এমন কিছু উল্লেখ করার জন্য উত্তর চান না ?
জ্যাক ডগলাস

ক্রিস ট্র্যাভার্স সঞ্চিত পদ্ধতি ব্যবহারের সুবিধাগুলি সম্পর্কে প্রচুর ব্লগ করে, যেমন এখানে: ledgersmbdev.blogspot.de/2012/07/… এবং এখানে: ledgersmbdev.blogspot.de/2012/07/… কেবল তার ব্লগের মাধ্যমে স্কিম, সেখানে একটি রয়েছে এই বিষয়ে আকর্ষণীয় নিবন্ধ অনেক।
a_horse_with_no_name

উত্তর:


51

কঠোরভাবে বলতে গেলে, শব্দটি "সঞ্চিত পদ্ধতি" পোস্টগ্রিস ১১-এর সাথে প্রবর্তিত পোস্টগ্র্রেসে এসকিউএল পদ্ধতিগুলিকে নির্দেশ করে । সম্পর্কিত:

এছাড়াও রয়েছে ফাংশন , প্রায় কিন্তু পুরোপুরি একই করছেন না, এবং যারা প্রথম থেকেই সেখানে হয়েছে।

কার্যাবলী সঙ্গে LANGUAGE sqlমূলত একটি ফাংশন মোড়কের মধ্যে প্লেইন এসকিউএল কমান্ড (এবং পারমাণবিক, সবসময় একটি ভিতরে চালানোর সঙ্গে মাত্র ব্যাচ ফাইল একক লেনদেনের) গ্রহণ প্যারামিটার। এসকিউএল ফাংশনে সমস্ত বিবৃতি একবারে পরিকল্পনা করা হয় , যা অন্যের পরে একটি বিবৃতি কার্যকর করার চেয়ে সম্পূর্ণ আলাদা এবং লকগুলি যে ক্রমে নেওয়া হয় সেটিকে প্রভাবিত করতে পারে।

আরও কিছুর জন্য, সবচেয়ে পরিপক্ক ভাষা হ'ল পিএল / পিজিএসকিউএল ( LANGUAGE plpgsql)। এটি ভাল কাজ করে এবং গত দশকে প্রতিটি প্রকাশের সাথে উন্নত হয়েছে, তবে এটি এসকিউএল কমান্ডগুলির জন্য আঠালো হিসাবে সেরা কাজ করে best এটি ভারী গণনার জন্য নয় (এসকিউএল কমান্ড ব্যতীত)।

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

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

যেহেতু পোস্টগ্রিস 9.2 জেনেরিক এক্সিকিউশন প্ল্যানগুলি এখনও অধিবেশনটির জন্য ক্যাশে করা হয়েছে তবে ম্যানুয়ালটি উদ্ধৃত করে :

এটি কোনও পরামিতি ছাড়াই প্রস্তুত বিবৃতিগুলির জন্য অবিলম্বে ঘটে; অন্যথায় এটি কেবল পাঁচ বা ততোধিক মৃত্যুদণ্ড কার্যকর করার পরিকল্পনার পরে দেখা যায় যার আনুমানিক ব্যয় গড় (ব্যয় ওভারহেড পরিকল্পনা সহ) জেনেরিক পরিকল্পনার ব্যয় প্রাক্কলনের চেয়ে ব্যয়বহুল।

আমরা উভয় বোথ ওয়ার্ল্ডস শ্রেষ্ঠ পেতে সবচেয়ে সময় ছাড়া (কম কিছু উপরি যোগ করা হয়েছে) (AB) ব্যবহার করে EXECUTEপোস্টগ্রাইএসকিউএল উইকির পোস্টগ্রিজ এসকিউএল 9.2 -এ নতুন কী রয়েছে তার বিশদ ।

পোস্টগ্রিজ 12 জেনেরিক বা কাস্টম পরিকল্পনা জোর করতে অতিরিক্ত সার্ভার ভেরিয়েবলেরplan_cache_mode সাথে পরিচয় করিয়ে দেয়। বিশেষ ক্ষেত্রে যত্ন সহকারে ব্যবহার করুন।

আপনি সার্ভার সাইড ফাংশনগুলির সাহায্যে বড় জয় করতে পারেন যা আপনার অ্যাপ্লিকেশন থেকে ডেটাবেস সার্ভারে অতিরিক্ত রাউন্ড-ট্রিপগুলি প্রতিরোধ করে। সার্ভারটিকে একবারে যথাসম্ভব কার্যকর করতে এবং কেবলমাত্র একটি ভাল সংজ্ঞায়িত ফলাফল প্রদান করতে হবে।

জটিল ফাংশন, বিশেষত টেবিল ফাংশন ( RETURNING SETOF recordবা TABLE (...)) এর বাসা বাঁধুন । কার্যগুলি হ'ল কালো বাক্সগুলি ক্যোয়ার পরিকল্পনাকারীর জন্য অপ্টিমাইজেশন বাধা হিসাবে উপস্থিত। বাহ্যিক ক্যোয়ারীর প্রসঙ্গে নয়, এগুলি পৃথকভাবে অপ্টিমাইজ করা হয়েছে যা পরিকল্পনাকে সহজ করে তোলে তবে নিখুঁত পরিকল্পনার চেয়ে কম ফলাফল হতে পারে। এছাড়াও, কার্যগুলির ব্যয় এবং ফলাফলের আকার নির্ভরযোগ্যভাবে পূর্বাভাস দেওয়া যায় না।

ব্যতিক্রম এই নিয়মের সহজ এসকিউএল ফাংশন (হয় LANGUAGE sql), যা করা যেতে পারে "inlined" যদি কিছু পূর্বশর্ত পূরণ করা -নীল কনওয়ে (উন্নত স্টাফ) দ্বারা উপস্থাপনাটিতে কীভাবে পরিকল্পনাকারী কাজ করে সে সম্পর্কে আরও পড়ুন ।

PostgreSQL এ একটি ফাংশন সর্বদা স্বয়ংক্রিয়ভাবে একটি একক লেনদেনের মধ্যে চলে । এটির সব কিছুই সফল হয় বা কিছুই না। যদি কোনও ব্যতিক্রম ঘটে থাকে, সমস্ত কিছু আবার ঘূর্ণিত হয়। তবে পরিচালনা করার সময় ত্রুটি রয়েছে ...

এজন্যই ফাংশনগুলি হুবহু "সঞ্চিত পদ্ধতি" হয় না (যদিও সেই শব্দটি কখনও কখনও ব্যবহৃত হয়, বিভ্রান্তিকরভাবে)। কিছু কমান্ড পছন্দ , বা , একটি লেনদেন ব্লক ভিতরে চালানো যাবে না যাতে তারা ফাংশন অনুমোদিত নয়। (এসকিউএল পদ্ধতিতে এখনও নয়, পোস্টগ্রিস ১১ হিসাবে। এটি পরে যুক্ত করা যেতে পারে))VACUUMCREATE INDEX CONCURRENTLYCREATE DATABASE

আমি কয়েক হাজার বছর ধরে plpgsql ফাংশন লিখেছি।


2
@ নাহধঃ: "স্বয়ংক্রিয় লেনদেন" কোনও প্রযুক্তিগত শব্দ নয়। এটি ছিল বলার মতো খুব সুন্দর ভাবেই .. আমার স্পষ্টতার পরে এটি এখন কী বলছে। মোটেই স্বায়ত্তশাসিত লেনদেন নয়। "স্বায়ত্তশাসিত" কেবল একটি অনুরূপ শব্দ হিসাবে ঘটে।
এরউইন ব্র্যান্ডসেটেটার 3

4
আপনার উত্তরগুলি এখান থেকে সংকলিত হয়েছে এবং এসও একটি মহাকাব্য পোস্টগ্রেএসকিউএল সেরা অনুশীলন হ্যান্ডবুক হতে পারে।
দাভোস

10

কিছু ডিও এর:

  • পিজি স্টেটমেন্টগুলিকে ইনলাইন করতে পারে, তাই এসকিউএলকে সম্ভব হলে ফাংশন ভাষা হিসাবে ব্যবহার করুন
  • অপ্রয়োজনীয় বা স্থিতিশীল / স্থিরভাবে সঠিকভাবে ভোলিটাইল ব্যবহার করুন, কারণ পিজি এটি পরিবর্তনযোগ্য বা স্থিতিশীল হলে ফলাফলগুলি ক্যাশে করতে পারে
  • স্ট্রিক্টটি সঠিকভাবে ব্যবহার করুন, কারণ ফিজি চালানোর পরিবর্তে কোনও ইনপুট নাল থাকলে পিজি কেবল নালার দিকে ফিরে আসতে পারে
  • পিএল / ভি 8 বিবেচনা করুন যখন আপনি এসকিউএলটিকে ফাংশন ভাষা হিসাবে ব্যবহার করতে পারবেন না। আমি দৌড়েছি এমন কিছু অবৈজ্ঞানিক পরীক্ষায় এটি PL / pgSQL এর চেয়ে দ্রুত
  • লেনদেনের বাইরে হওয়া প্রক্রিয়াগুলির জন্য তালিকা / বিজ্ঞপ্তি ব্যবহার করুন
  • কী-ভিত্তিক পৃষ্ঠাগুলি LIMIT ভিত্তিক পৃষ্ঠাগুলির চেয়ে দ্রুততর হতে পারে কারণ পৃষ্ঠাগুলি বাস্তবায়নের জন্য ফাংশনগুলি ব্যবহার করার কথা বিবেচনা করুন
  • নিশ্চিত করুন যে আপনি নিজের কার্যগুলি ইউনিট-টেস্ট করেছেন

আমি প্রথমবারের মতো এই দাবিটি দেখতে পাচ্ছি যে পিএল / ভি 8 পিএল / পিজিএসকিউএল এর চেয়ে দ্রুত। এটি সমর্থন করার জন্য আপনার কাছে কোনও (প্রকাশিত) চিত্র রয়েছে?
a_horse_with_no_name

@ এ_হর্স_বিহীন_নো নাম নেই, আমি করি না। যেমনটি আমি বলেছিলাম, আমি কয়েকটি অবৈজ্ঞানিক পরীক্ষা করেছি। এগুলি বেশিরভাগ যুক্তিযুক্ত ছিল, ডেটা অ্যাক্সেস নয়। আমি ক্রিসমাসের উপর কিছু পুনরাবৃত্তিযোগ্য পরীক্ষা করার চেষ্টা করব এবং এখানে পুনরায় পোস্ট করব।
নিল ম্যাকগুইগান

@a_horse_with_no_name এখানে FizzBuzz plv8 বনাম plpgsql- এর জন্য একটি দ্রুত-নোংরা উদাহরণ রয়েছে: blog.datediapatterns.com/2014/08/plv8-vs-plpgsql.html
নিল ম্যাকগুইগান

8

সাধারণত ডাটাবেসে চলমান অ্যাপ্লিকেশন যুক্তি বলার অর্থ এটি দ্রুততর হবে - সর্বোপরি এটি ডেটার কাছাকাছি চলেছে।

আমি বিশ্বাস করি (তবে 100% নিশ্চিত নই) যে এসকিউএল ভাষার ফাংশনগুলি অন্য যে কোনও ভাষা ব্যবহার করে তাদের তুলনায় দ্রুত হয় কারণ তাদের প্রসঙ্গ পরিবর্তনের প্রয়োজন হয় না। খারাপ দিকটি হ'ল কোনও প্রক্রিয়াজাতীয় যুক্তি অনুমোদিত নয় allowed

পিএল / পিজিএসকিউএল হ'ল ভাষাগুলির মধ্যে নির্মিতগুলির মধ্যে সবচেয়ে পরিপক্ক এবং বৈশিষ্ট্য-সম্পূর্ণ - তবে কার্য সম্পাদনের জন্য সি ব্যবহার করা যেতে পারে (যদিও এটি কেবল গণনামূলকভাবে নিবিড় ফাংশনগুলিতেই উপকৃত হবে)


7

আপনি পোস্টগ্রেস্কল-এ ব্যবহারকারী সংজ্ঞায়িত ফাংশন (ইউডিএফ) ব্যবহার করে খুব আকর্ষণীয় কিছু করতে পারেন। উদাহরণস্বরূপ, আপনি ব্যবহার করতে পারেন এমন কয়েকটি ডজন ভাষা রয়েছে। Pl / sql এবং pl / pgsql এ অন্তর্নির্মিত উভয়ই সক্ষম এবং নির্ভরযোগ্য এবং ব্যবহারকারীরা খুব মারাত্মক বিপদজনক কিছু থেকে বিরত রাখতে স্যান্ডবক্স পদ্ধতি ব্যবহার করে। সি-তে লিখিত ইউডিএফগুলি আপনাকে শক্তি এবং কার্য সম্পাদনের ক্ষেত্রে চূড়ান্ত দেয়, যেহেতু তারা ডাটাবেস হিসাবে একই প্রসঙ্গে চলে। যাইহোক, এটি আগুনের সাথে খেলার মতো, কারণ এমনকি ছোট্ট ভুলগুলি ব্যাকেন্ডগুলি ক্র্যাশ বা ডেটা নষ্ট হওয়ার সাথে সাথে বিশাল সমস্যা তৈরি করতে পারে। প্লিজ / আর, পিএল / রুবি, পিএল / পার্ল ইত্যাদির মতো ভিজিট প্লাঙ্কের ভাষা আপনাকে একই ভাষাতে ডাটাবেস এবং অ্যাপ্লিকেশন স্তর উভয়ই লেখার ক্ষমতা সরবরাহ করে। এটি সুবিধাজনক হতে পারে, যেহেতু এর অর্থ হ'ল আপনাকে ইউডিএফ লেখার জন্য পার্ল প্রোগ্রামার জাভা বা pl / pgsql ইত্যাদি শেখাতে হবে না teach

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

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

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