একটি আক্ষরিক উন্মাদ উত্তর, তবে যদি আপনার কাছে কোনও ধরণের প্রতিলিপি ব্যবস্থা স্থাপন করা হয় (এক বিলিয়ন সারিযুক্ত একটি সিস্টেমের জন্য, আমি আশা করি আপনি এটি করেন) তবে আপনি মোটামুটি অনুমানকারী (যেমন MAX(pk)
) ব্যবহার করতে পারেন , দাসের সংখ্যার মাধ্যমে সেই মানটি ভাগ করতে পারেন আপনার কাছে সমান্তরালভাবে বেশ কয়েকটি ক্যোয়ারী চালান।
বেশিরভাগ ক্ষেত্রে, আপনি সর্বাধিক কী (অথবা আমার অনুমিত প্রাথমিক কী) এর উপর ভিত্তি করে দাসগুলিতে ক্যোয়ারীগুলি বিভাজন করতে পারেন (আমরা আমাদের সারি / দাস হিসাবে 250000000 ব্যবহার করব):
-- First slave
SELECT COUNT(pk) FROM t WHERE pk < 250000000
-- Ith slave where 2 <= I <= N - 1
SELECT COUNT(pk) FROM t WHERE pk >= I*250000000 and pk < (I+1)*250000000
-- Last slave
SELECT COUNT(pk) FROM t WHERE pk > (N-1)*250000000
তবে আপনার কেবল এসকিউএল প্রয়োজন। কি বক্ষ! ঠিক আছে, সুতরাং যাক আপনি একটি সাদোমাচোস্ট। মাস্টার (বা নিকটতম দাস) এ আপনি সম্ভবত এর জন্য একটি সারণী তৈরি করতে হবে:
CREATE TABLE counter_table (minpk integer, maxpk integer, cnt integer, slaveid integer)
সুতরাং আপনার দাসদের মধ্যে কেবল বাছাইকারীদের চালনার পরিবর্তে, আপনাকে এর সাদৃশ্য একটি সন্নিবেশ করতে হবে:
INSERT INTO counter_table VALUES (I*25000000, (I+1)*250000000, (SELECT COUNT(pk) FROM ... ), @@SLAVE_ID)
আপনি দাসদের মাস্টারে একটি টেবিলে লেখার বিষয়ে সমস্যা নিয়ে যেতে পারেন। আপনার আরও বেশি সাদিসের দরকার হতে পারে- মানে সৃজনশীল:
-- A table per slave!
INSERT INTO counter_table_slave_I VALUES (...)
প্রথম দাসের তুলনায় আপনার প্রতিদ্বন্দ্বী গ্রাফ দ্বারা অনুসরণ করা পথে শেষ অবধি একটি দাস থাকা উচিত। এই দাসের এখন অন্যান্য সমস্ত পাল্টা মান থাকতে হবে এবং এর নিজস্ব মান থাকতে হবে। তবে আপনি শেষ করার পরে, সম্ভবত সারিগুলি যুক্ত হবে, সুতরাং আপনার কাউন্টার_সামগ্রী এবং বর্তমান সর্বাধিক পিকেটে রেকর্ডকৃত সর্বাধিক পিকে ক্ষতিপূরণ দেওয়ার জন্য আপনাকে আর একটি প্রবেশ করানো উচিত।
এই মুহুর্তে, মোট সারিগুলি কী তা নির্ধারণ করার জন্য আপনাকে একটি সামগ্রিক ফাংশন করতে হবে, তবে এটি সহজ যেহেতু আপনি সর্বাধিক "আপনার যে দাসের সংখ্যা এবং সারি পরিবর্তন" সারিটি চালিয়ে যাচ্ছেন।
আপনি যদি দাসদের মধ্যে পৃথক সারণী থাকে এমন পরিস্থিতিতে থাকেন তবে UNION
আপনার প্রয়োজনীয় সমস্ত সারি পেতে পারেন ।
SELECT SUM(cnt) FROM (
SELECT * FROM counter_table_slave_1
UNION
SELECT * FROM counter_table_slave_2
UNION
...
)
অথবা আপনি জানেন, কিছুটা কম উন্মাদ হয়ে আপনার বিতরণকারী প্রক্রিয়াকরণ সিস্টেমে ডেটা মাইগ্রেট করুন বা সম্ভবত ডেটা গুদামজাতকরণ সমাধান ব্যবহার করুন (যা আপনাকে ভবিষ্যতেও দুর্দান্ত ডেটা ক্রাঞ্চিং দেবে)।
মনে রাখবেন, এটি আপনার প্রতিলিপিটি কতটা ভাল সেট আপ করা হয়েছে তার উপর নির্ভর করে। যেহেতু প্রাথমিক বাধা হ'ল সম্ভবত ধ্রুবক স্টোরেজ হবে, যদি আপনার ভারী প্রতিবেশী শব্দে ক্রুডি স্টোরেজ বা দুর্বলভাবে পৃথক পৃথক ডেটা স্টোর থাকে, তবে এটি সম্ভবত একটি মাত্র অপেক্ষা করার চেয়ে ধীর গতিতে চলবে runSELECT COUNT(*) ...
তবে আপনার যদি ভাল প্রতিলিপি থাকে, তবে আপনার গতির লাভগুলি সরাসরি সংখ্যার বা দাসদের সাথে সম্পর্কিত হওয়া উচিত। প্রকৃতপক্ষে, যদি একা গণনা ক্যোয়ারী চালাতে 10 মিনিট সময় লাগে এবং আপনার 8 জন ক্রীতদাস থাকে তবে আপনি আপনার সময়টি কয়েক মিনিটেরও কম কমাতে চাইবেন। সম্ভবত এই সমাধানটির বিশদটি প্রকাশ করতে এক ঘন্টা।
অবশ্যই, আপনি কখনই সত্যিই আশ্চর্যজনক সঠিক উত্তর পাবেন না কেননা এই বিতরণ সমাধানটি বেশিরভাগ সময় সীমাবদ্ধ করে যেখানে সারিগুলি মোছা এবং সন্নিবেশ করা যায়, তবে আপনি একই পরিস্থিতিতে সারিগুলির বিতরণ লক পেতে চেষ্টা করতে পারেন এবং একটি নির্দিষ্ট গণনা পেতে পারেন একটি নির্দিষ্ট মুহুর্তের জন্য টেবিলে সারিগুলির।
আসলে এটি অসম্ভব বলে মনে হচ্ছে, যেহেতু আপনি মূলত একটি এসকিউএল-কেবল সমাধান নিয়েই আটকে আছেন এবং আমি মনে করি না যে আপনি তাত্ক্ষণিকভাবে একাধিক ক্রীতদাস জুড়ে শার্পড এবং লক করা কোয়েরি চালানোর জন্য একটি ব্যবস্থা সরবরাহ করেছেন। সম্ভবত যদি আপনি রেপ্লিকেশন লগ ফাইলের নিয়ন্ত্রণ রাখেন ... যার অর্থ আপনি এই উদ্দেশ্যে আক্ষরিক অর্থেই ক্রীতদাসদের সজ্জিত করতেন, এটি কোনও সন্দেহ নেই যে কোনওভাবেই কেবল একটি একক মেশিনে গণনা কোয়েরি চালানোর চেয়ে ধীর।
সুতরাং আমার দুটি 2013 পেনিস আছে।