বড় ক্যোয়ারিকে একাধিক ছোট ক্যোয়ারিতে আলাদা করা ভাল?


13

পছন্দসই ফলাফলগুলি উত্থাপনের জন্য এমন কয়েকটি পরিস্থিতিতে রয়েছে যা বেশ কয়েকটি টেবিলের সাথে সাব-সিলেক্ট স্টেটমেন্টের সাথে একত্রে জড়িত হওয়ার দরকার রয়েছে big

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

SELECT *
FROM   `users`
WHERE  `user_id` IN (SELECT f2.`friend_user_id`
                     FROM   `friends` AS f1
                            INNER JOIN `friends` AS f2
                              ON f1.`friend_user_id` = f2.`user_id`
                     WHERE  f2.`is_page` = 0
                            AND f1.`user_id` = "%1$d"
                            AND f2.`friend_user_id` != "%1$d"
                            AND f2.`friend_user_id` NOT IN (SELECT `friend_user_id`
                                                            FROM   `friends`
                                                            WHERE  `user_id` = "%1$d"))
       AND `user_id` NOT IN (SELECT `user_id`
                             FROM   `friend_requests`
                             WHERE  `friend_user_id` = "%1$d")
       AND `user_image` IS NOT NULL
ORDER  BY RAND() 
LIMIT %2$d

এটি করার সর্বোত্তম উপায় কী?

উত্তর:


14

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

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

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

স্কেল্যাবিলিটি সম্পর্কে, মনে রাখবেন যে পরিকল্পনাকারীর যত বেশি নমনীয়তা রয়েছে তাও খুব ভাল জিনিস ....

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


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

8

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

আপনার অনুসরণকারীদের জীবনকে আরও সহজ করুন এবং তারা আপনার সম্পর্কে ভাল কথা বলবে। তাদের উপর এটি কঠিন করুন এবং তারা আপনাকে অভিশাপ দেবে।


2
সরল প্রশ্নগুলির একটি স্ট্রিংয়ের অসুবিধা হ'ল এই রাজ্যটি তাদের জুড়ে উল্লেখযোগ্যভাবে পরিবর্তিত হয় এবং অ্যাপ্লিকেশনটির সামগ্রিক ডিবাগিংকে আরও জটিল করে তোলে। অর্থাৎ আপনি প্রায়শই গাছ হিসাবে বড় এসকিউএল কোয়েরিগুলি ডিবাগ করতে পারেন তবে অ্যাপ্লিকেশন কোডটি কীভাবে বিবৃতিতে রাষ্ট্র পরিবর্তন হয় তা পরীক্ষা করে বিবৃতি দিয়ে ডিবাগ স্টেটমেন্ট পায়। আসল ইস্যুগুলি এই বিষয়টির সাথে সম্পর্কিত যে সাবলেট এবং ইনলাইন ভিউগুলিও তাদের নিজস্ব গাছ .....
ক্রিস ট্র্যাভার্স

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

আমি বলছি যেভাবে আমি আমার বড় ব্যাচ প্রক্রিয়া লিখি সেদিকে আপনারা নজর দিতে হবে। সাধারণ প্রশ্নগুলিতে জিনিসগুলি ভাঙ্গা করুন, পড়া খুব সহজ। আমি পক্ষপাতদুষ্ট কারণ যে প্রশ্নগুলি পরিস্কার করার চেষ্টা করি সেগুলি নিয়মিতভাবে 1000 লাইন দীর্ঘ।
ডাটাগোড

5

2 টি কীওয়ার্ড ক্যোয়ারী-কর্মক্ষমতা এবং স্কেলাবিলিটিতে আমার 2 সেন্ট:

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

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


2
আর: "এসকিউএল সার্ভার" রেফারেন্স যদিও ওপি কোনও নির্দিষ্ট আরডিবিএমএস নির্দিষ্ট করে দেয়নি আমার সন্দেহ হয় তারা পিছনের টিকগুলি থেকে মাইএসকিউএলে রয়েছে এবংLIMIT
মার্টিন স্মিথ

@ মার্টিনস্মিথ আপনি সঠিকভাবে সন্দেহ করেছেন। এটি মাইএসকিউএল।
হামেদ মোমেনি

2

কিছু সময়, বড় / জটিল ক্যোয়ারিকে ছোট প্রশ্নগুলিতে বিভক্ত করা ছাড়া কোনও উপায় থাকে না। এটি নির্ধারণের সর্বোত্তম উপায় হ'ল EXPLAINবিবৃতি সহ বিবৃতি ব্যবহার করা SELECT। আপনার ডিবি আপনার ডেটা আনতে যে নম্বর বা স্ক্যান করতে চলেছে তা হ'ল আপনার EXPLAINক্যোয়ারী দ্বারা ফিরে আসা "সারি" মানের মান । আমাদের ক্ষেত্রে, আমাদের 10 টি সারণিতে যোগদানের একটি প্রশ্ন ছিল query নির্দিষ্ট রেকর্ডের জন্য, ট্রেসটির পরিমাণ 409 এম যা আমাদের ডিবিকে ব্লগ করে এবং আমাদের সিবিইউকে আমাদের ডিবি সার্ভারের ব্যবহার 300% এর বেশি ঠেলে দেয়। আমরা কোয়েরিগুলিকে আরও দ্রুত ভাগ করে একই তথ্য পুনরুদ্ধার করতে সক্ষম হয়েছি।

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

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