আমি কীভাবে এসকিউএল এ দক্ষ একটি সহজ এলোমেলো নমুনা গ্রহণ করব? প্রশ্নে থাকা ডাটাবেসগুলি মাইএসকিউএল চলছে; আমার টেবিলটি কমপক্ষে 200,000 সারি এবং আমি প্রায় 10,000 এর একটি সাধারণ এলোমেলো নমুনা চাই।
"সুস্পষ্ট" উত্তরটি হ'ল:
SELECT * FROM table ORDER BY RAND() LIMIT 10000
বড় টেবিলগুলির জন্য, এটি খুব ধীর: এটি RAND()
প্রতিটি সারিটির জন্য কল করে (এটি ইতিমধ্যে এটি ও (এন) এ রাখে), এবং এগুলি সাজায়, এটিকে সর্বোত্তমভাবে ও (এন এলজি এন) তৈরি করে। এটি ও (এন) এর চেয়ে দ্রুত করার কোনও উপায় আছে?
দ্রষ্টব্য : অ্যান্ড্রু মাও মন্তব্যগুলিতে যেমন উল্লেখ করেছেন, আপনি যদি এসকিউএল সার্ভারে এই পদ্ধতির ব্যবহার করেন তবে আপনার টি-এসকিউএল ফাংশনটি ব্যবহার করা উচিত NEWID()
, কারণ র্যান্ড () সমস্ত সারিগুলির জন্য একই মান ফিরে আসতে পারে ।
সম্পাদনা: 5 বছর পিছনে
আমি আবার একটি বড় টেবিল নিয়ে এই সমস্যায় পড়েছি এবং @ অজ্ঞদের সমাধানের একটি সংস্করণ ব্যবহার করে শেষ করেছি, দুটি টুইট সহ:
- সুলভ সস্তায়, আমার কাঙ্ক্ষিত নমুনার আকারটি 2-5x সারিগুলিতে নমুনা করুন
ORDER BY RAND()
RAND()
প্রতিটি সন্নিবেশ / আপডেটে একটি সূচিযুক্ত কলামে ফলাফল সংরক্ষণ করুন । (যদি আপনার ডেটা সেটটি খুব আপডেট-ভারী না হয় তবে এই কলামটি সতেজ রাখার জন্য আপনাকে অন্য কোনও উপায় খুঁজে নিতে হতে পারে))
কোনও টেবিলের 1000-আইটেমের নমুনা নিতে, আমি সারিগুলি গণনা করি এবং ফলাফলটি হিমায়িত_র্যান্ড কলামের সাথে গড়ে 10,000 টি সারি নিচে নামিয়ে রাখি:
SELECT COUNT(*) FROM table; -- Use this to determine rand_low and rand_high
SELECT *
FROM table
WHERE frozen_rand BETWEEN %(rand_low)s AND %(rand_high)s
ORDER BY RAND() LIMIT 1000
(আমার আসল বাস্তবায়নে আমি নিচে নমুনা নিচ্ছি না তা নিশ্চিত করার জন্য এবং র্যান্ড_এইচটি হাতের কাছে ম্যানুয়ালি মোড়ানোর জন্য আরও কাজ জড়িত, তবে প্রাথমিক ধারণাটি "এলোমেলোভাবে আপনার এন কে কয়েক হাজারে কেটে ফেলুন।")
এটি কিছু ত্যাগ স্বীকার করার সময়ে, এটি আমাকে ORDER BY RAND()
আবার সূচি স্ক্যান ব্যবহার করে ডেটাবেসকে নমুনা করতে দেয়, যতক্ষণ না এটি আবার যথেষ্ট পরিমাণে ছোট হয়।
RAND()
পরবর্তী প্রতিটি কল একই মান দেয়।