কোডে "অনেক বেশি ডাটাবেস অনুরোধ" কী যোগ্য?


17

এটি নিজেই একটি আলোচনা এবং আমার কয়েকজন সহকর্মী রয়েছেন এবং ভেবেছিলেন যে আমি এখানে এসে উপস্থিত হব এবং তাতে সাধারণ sensক্যমত্য থাকলে সেখানে কী তা দেখতে পাব।

এটি মূলত ডাটাবেস কলগুলির জন্য নিম্নলিখিত 2 মতামত অবলম্বন করে: 1. ডিবি কলের সংখ্যা ডাটাবেস হ্রাস করার জন্য প্রয়োজনীয় সমস্ত কিছু পেতে একটি বৃহত কল করুন ২. আকার কমিয়ে আনার অনুরোধের ভিত্তিতে আরও ছোট পৃথক কল করুন ডিবি কল দেয়

যেখানে এটি বিশেষত প্লে হয়ে আসছে তা প্রচলিত কোড। আমরা কোনও কর্মচারী শ্রেণির উদাহরণটি ব্যবহার করব কারণ এটি মোটামুটি সরাসরি।

ধরা যাক যে আপনার কর্মচারী শ্রেণীর 10 টি মান আছে (প্রথম নাম, পদবি, নাম), এবং তারপরে 2 শ্রেণীর বৈশিষ্ট্য ... 1 বিভাগ বিভাগের দিকে নির্দেশ করে এবং তারপরে 1 সুপারভাইজার যা অন্য কোনও কর্মচারী অবজেক্টের দিকে ফিরে নির্দেশ করে।

মানসিকতা # 1 এ, আপনি এমন একটি কল করতে পারবেন যা কর্মচারীর ডেটা এবং সেই সাথে বিভাগ এবং সুপারভাইজার বৈশিষ্ট্যগুলি গড়ে তোলার জন্য প্রয়োজনীয় ক্ষেত্রগুলি ফেরত দেয় ... বা কমপক্ষে ক্ষেত্রগুলি যা প্রায়শই সেই সাব অবজেক্ট থেকে ব্যবহৃত হয়।

মানসিকতা # 2 তে, আপনি কেবলমাত্র কর্মচারী অবজেক্টটি প্রথমে পপুলেট করবেন এবং তারপরে কেবল বিভাগ এবং সুপারভাইজার অবজেক্টগুলিকে বাস্তবে অনুরোধ করা হলে তা পপুলেট করবেন।

2-র স্ট্যান্ডটি বেশ সোজা-ফরওয়ার্ড ... অনুরোধগুলির আকারটি হ্রাস করুন এবং প্রতিবার সেই অনুরোধগুলির মধ্যে একটি করার সময় কতগুলি ডাটাবেস অবজেক্ট হিট করা প্রয়োজন। # 1 এর অবস্থানটি হ'ল এটি সঠিকভাবে প্রয়োগ করা গেলেও কোডটি একাধিক সংযোগ তৈরি করতে হবে নিছক সত্যটি ওয়েবসভার এবং ডাটাবেসের মধ্যে সংযোগকে আরও হ্রাস করতে পারে কারণ এটি হ্রাস করার বিপরীতে।

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


7
আমার অভিজ্ঞতায় এটির একটি "সঠিক উত্তর" নেই। বিলম্ব এবং থ্রুপুট মধ্যে একটি ভারসাম্য আছে। কম বিলম্বিতা খুব সামান্য অনুরোধ বা এমনকি একটি বড় একটি সহ্য করতে পারে; তবে উচ্চ বিলম্বিত লিঙ্কগুলি একবারে প্রচুর ডেটা সরিয়ে নেওয়া ভাল হয়ে থাকে। তবুও, যদি হাই ল্যাটেনসি কনফিগারেশনের মাধ্যমে থ্রুপুটটি কম থাকে তবে আপনি আরও প্রতিক্রিয়াশীল হওয়ার জন্য ছোট অংশগুলি আনা ভাল।

3
সম্ভবত n + 1 টি সমস্যা এর সাথে সম্পর্কিত stackoverflow.com/questions/97197/...
ভালেরা Kolupaev

@ ভালেরা: সুবিধার্থে এখানে এই প্রশ্নটির লিঙ্কটি পোস্ট করা হয়েছে: রিয়েলসলকো.কো.সাইট
হাইবটিটিপিটপল.পিপি? নেম

4
"আমাদের ওয়েবসারভার এবং ডাটাবেস সার্ভারের মধ্যে ট্র্যাফিকের পরিমাণ নিয়ন্ত্রণের বাইরে চলে যাচ্ছে" " ওটার মানে কি? আসল সমস্যাটি কী তা সম্পর্কে আপনি নির্দিষ্ট থাকতে পারেন ? আপনার কর্মক্ষমতা সমস্যা আছে? আপনি কি প্রোফাইলিং এবং পরিমাপ করেছেন? প্রশ্নের অংশ হিসাবে প্রকৃত পরিমাপ থেকে আসল ফলাফল সরবরাহ করুন। অন্যথায়, আমরা কেবল অনুমান করছি।
এস .লট

উত্তর:


8

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

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


3

আপনি যখন প্রথম কিছু লিখবেন তখন সর্বদা পঠনযোগ্যতা এবং স্পষ্টতার জন্য যান । আপনি যখন প্রয়োজন তখন আপনি রিফ্যাক্টর করতে পারেন। বাধা খুঁজে পেতে লোড টেস্টিং করুন, অনেক ক্ষেত্রে এটি সমস্যার কারণ কলগুলির সংখ্যা নয় তবে খারাপভাবে লিখিত হয়েছে written

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


খারাপভাবে লিখিত ডিবি কলকে কী বলে?
নিউ এভারেস্ট

3

আপনার প্রশ্নটি অনুমানের ভিত্তিতে মনে হয় যে কোনও প্রদত্ত পৃষ্ঠার জন্য আপনার কী ডেটা প্রয়োজন হবে তা অনুমান করতে হবে। বিষয়টি তেমন নয়। এটি নিষ্পাপ পদ্ধতির মতো সহজ নয়, তবে আপনি আপনার কোডটি আর্কিটেক্ট করতে পারেন যাতে আপনি জানতে পারবেন যে কোনও ডাটাবেস কল করার আগে আপনার বিভাগ বা সুপারভাইজার বৈশিষ্ট্য প্রয়োজন কিনা।


3

এই আমি ব্যবহার করা নিয়ম, সম্ভবত সেগুলি আপনার কাজে আসবে।

  1. প্রথম পরিমাপ! আমি এমনকি এমন কোডের দিকেও তাকাব না যা যদি "সত্যই ধীর" হতে পারে তবে আমি সেই সংস্থানটিতে ট্র্যাফিক প্রবাহিত দেখতে পাচ্ছি এবং সেই সংস্থান ধীরে ধীরে সাড়া দিচ্ছে না।
  2. 1 অনুরোধ = কে জিজ্ঞাসা। আমি যে পরিমাণ সংখ্যক ডাটাবেসে কথা বলি তা অনুরোধ করা সংস্থার ধরণের মাধ্যমে সম্পূর্ণ নির্ধারিত হয়; এবং কখনও কখনও সেই উত্সটির অনুরোধ বা রাষ্ট্রের প্রকৃতির দ্বারা নয়; আপনার উদাহরণে, এটি সম্ভবত সর্বাধিক 3 টি প্রশ্নের মধ্যে রয়েছে: কর্মচারীদের জন্য 1, বিভাগের জন্য 1 এবং সুপারভাইজারের জন্য 1; সেখানে প্রত্যেকের মধ্যে কতগুলি ঘটে তা বিবেচ্য নয়।
  3. আপনি কী ব্যবহার করবেন না তা জিজ্ঞাসা করবেন না । এটি যদি এইচটিটিপি হয় আমরা যার বিষয়ে কথা বলছি তবে পরবর্তীকালে ডেটা জিজ্ঞাসা করার কোনও ধারণা নেই; পরে আর নেই; প্রতিটি অনুরোধ একটি পরিষ্কার স্লেট থেকে শুরু হয়। কখনও কখনও আমার একটি টেবিল থেকে বেশিরভাগ কলাম প্রয়োজন , তবে উপলক্ষে আমার কেবল একটি বা দুটি প্রয়োজন; যখন আমি ঠিক আমার প্রয়োজনীয় ক্ষেত্রগুলি জানি, আমি কেবল এটিই চাইব।
  4. সমস্যায় হার্ডওয়্যার নিক্ষেপ করুন। সার্ভারগুলি সস্তা; কখনও কখনও আপনি কেবলমাত্র একটি বিফায়ার বাক্সে ডাটাবেস সরিয়ে পর্যাপ্ত পারফরম্যান্স পেতে পারেন; বা কিছু পাঠ্য কেবল পাঠযোগ্য প্রতিরূপে প্রেরণ।
  5. প্রথমে ক্যাশে অবৈধ করুন, তারপরে ক্যাচিং প্রয়োগ করুন। ক্যাশে ডেটা প্রায়শই ব্যবহৃত বা কঠোরভাবে জিজ্ঞাসা করার তাগিদ শক্তিশালী; তবে সবসময়ই, অব্যবহৃত ডেটা উচ্ছেদ করা বা অতিবাহিত ডেটার মেয়াদ শেষ করা উপেক্ষা করা হয়। আপনি যদি ক্যাশে থেকে কীভাবে ডেটা নেবেন তা জানেন; তাহলে আপনি এটিকে ক্যাশে রেখে নিরাপদে আছেন; যদি কেবল ক্যোয়ারি করার চেয়ে ক্যাশেটি অবৈধ করা এটি আরও ব্যয়বহুল হয়ে থাকে; তাহলে আপনার ক্যাশে লাগবে না।

2

এখানে কৌশল দুটিই পুরোপুরি বৈধ। প্রত্যেকের জন্য সুবিধা এবং অসুবিধা রয়েছে:

সমস্ত 3 অবজেক্টের জন্য একটি কল:

  • দ্রুত সঞ্চালন করবে
  • আপনার যেখানে প্রয়োজন সেখানে ঠিক আপনার যা প্রয়োজন তা তা পাবেন
  • সম্ভবত কেবলমাত্র একটি ক্ষেত্রে ব্যবহারযোগ্য হবে (যদিও এটি খুব সাধারণ ক্ষেত্রে হতে পারে)
  • বজায় রাখা আরও কঠিন হবে
  • আরও প্রায়শই রক্ষণাবেক্ষণ করতে হবে (এটি পরিবর্তিত হবে 3 টির কোনও স্কিমার বা ডেটা পরিবর্তনের প্রয়োজন হলে)

প্রতি বস্তুর জন্য একটি কল (মোট 3 টি কল)

  • প্রতিটি বস্তুর ধরণের একক দৃষ্টান্ত স্থাপনের জন্য আপনাকে একটি সাধারণ-উদ্দেশ্য কল দেয়; সেগুলি তখন স্বতন্ত্রভাবে ব্যবহার করা যায়
  • আরও রক্ষণাবেক্ষণযোগ্য হবে কারণ ক্যোয়ারীর কাঠামো সহজ হবে।
  • ধীর হবে (অগত্যা 3 বার ধীর হিসাবে নয়, তবে একই তথ্যের জন্য ওভারহেড বৃদ্ধি করা হবে)
  • অপ্রয়োজনীয় ডেটা পুনরুদ্ধার নিয়ে সমস্যা সৃষ্টি করতে পারে (আপনার যখন একটি ক্ষেত্রের প্রয়োজন হয় তখন পুরো রেকর্ডটি অপ্রয়োজনীয়)
  • যখন একক-রেকর্ড ক্যোয়ারী এন বার পাঠানো হয়, সংগ্রহে প্রতি রেকর্ডে একটি করে যখন একাধিক টু-ওয়ান সম্পর্ক বিদ্যমান তখন এন + 1 টি সমস্যার কারণ হতে পারে।

আপনার কয়েকটি উদ্বেগের জবাবে (দ্বিতীয় তালিকায় # 3 এবং 5) ... সুপারভাইজার এবং বিভাগ যদি কেবল 1/3 (বা তার চেয়ে কম) সময় ব্যবহার করা হয় তবে কী হবে? কোড << অবজেক্টটি কোডে কোড করে কোড করার সাথে সাথে সমস্ত বাচ্চাকে প্রথমে রেফারেন্স করার সাথে সাথেই ডিজাইন করা হয়েছিল? ... যে বেশিরভাগ সতর্কতা সহজ হবে?
ব্যবহারকারী 107775

যদি আনুষঙ্গিক বিষয়গুলি কেবলমাত্র খুব কমই প্রয়োজন হয় তবে সাধারণ ক্ষেত্রে এটি দ্রুত সম্পাদন করবে (পুনরুদ্ধারের জন্য কম ডেটা) তবে সবচেয়ে খারাপ অবস্থাটি ধীর হবে (আপনার কম্পিউটার থেকে তিনবার যোগাযোগের ওভারহেড ব্যবহার করে একই ডেটা বা আরও পুনরুদ্ধার করা হবে)। N + 1 সমস্যা হিসাবে, আপনার সম্পর্কের "এক" পাশের বিদেশী কী এর উপর ভিত্তি করে এটি করতে সক্ষম হতে অবজেক্টগুলির একটি তালিকা পুনরুদ্ধার করে এমন কোয়েরিটি স্থির করতে সক্ষম হওয়া দরকার এবং তারপরে একাধিক সারি টানুন need ক্যোয়ারির ফলাফলের বাইরে। আপনি যে ক্যোয়ারির রেকর্ডের প্রাথমিক কী থাকতে হবে তার কোনও সংস্করণ ব্যবহার করতে পারবেন না।
কিথস

1

আমার কাছে, অনেকগুলি ডিবি অনুরোধ আপনার যে কোনও সময় প্রয়োজনীয় ডেটা লোড করার প্রয়োজনের চেয়ে বেশি অনুরোধ করছে।

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

সুতরাং উভয় বিকল্প রয়েছে, এবং প্রতিটি যেখানে পরিস্থিতি এটির জন্য কল করে তা ব্যবহার করুন।

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


আপনি সাধারণ কোডটি লিখছেন এবং আপনার কোডটি কীভাবে ব্যবহার করা হবে সে সম্পর্কে আপনি নিশ্চিত নন এমন ঘটনা সম্পর্কে কী বলা যায়। সম্ভবত আপনি কখনই সুপারভাইজারের প্রয়োজন নেই এমন কাউকে কল্পনা করবেন না তবে এটি প্রমাণিত হয়েছে যে আপনি যে অ্যাপ্লিকেশনটিতে কাজ করছেন তার একমাত্র এটির প্রয়োজন। অবশ্যই, আপনি পৃথক ফাংশন লিখতে পারেন ... একটি এটি অন্তর্ভুক্ত না করার জন্য এবং অন্যটি অন্তর্ভুক্ত করার জন্য তবে আপনার সাধারণ কোডটি কোন পর্যায়ে ব্যবহার করার জন্য খুব বেশি বিস্তৃত জ্ঞানের প্রয়োজন শুরু করে?
ব্যবহারকারী 107775

@ user107775 আমি প্রতিটি ক্ষেত্রে সাধারণত দুটি ফাংশন লিখি; একটি যা কেবল সম্পত্তির মানগুলি ফেরত দেয় এবং এমন একটি যা সম্পর্কিত সমস্ত ক্লাস সহ ক্লাসটি ফেরত দেয়। এটি কারণ বেশিরভাগ সময়, আপনার কেবলমাত্র বৈশিষ্ট্য প্রয়োজন। এইভাবে, আপনার বিশদ জ্ঞানের প্রয়োজন নেই, কেবল একটির বেসিক এবং অন্যান্য জিনিস পান। আমি এটি একটি যুক্তিসঙ্গত ভারসাম্য বলে মনে করি। (তবে কিছু স্বতন্ত্র ক্ষেত্রে আরও অপ্টিমাইজেশনের জন্য আহ্বান জানানো হয়, তবে এটি কেস ভিত্তিতে মামলা হয়)।
এজেসি

1

ডিবিতে সংযোগ করুন, অনুরোধটি প্রেরণ করুন এবং ফলাফলটি পুনরুদ্ধারের তুলনায় সাধারণত এটি পার্স করা গুরুত্বপূর্ণ সময় নেয়, সুতরাং সামগ্রিক প্রবণতাটি একটি অনুরোধে যতটা সম্ভব প্রশ্নকে ক্যানেটেট করা।

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

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

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


1

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

এটি কতটা ডিবি মেমরি বনাম ডিস্ক থেকে আসছে তা জানা আকর্ষণীয় হবে। ঠিকঠাকের তুলনায় বিভাগ কম-বেশি পরিবর্তিত হওয়ার সম্ভাবনা রয়েছে বলে আমার মনে করার মতো কিছু নেই।

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