প্রদীপ আদিগার প্রথম পরামর্শ, ORDER BY NEWID()
ঠিক আছে এবং আমি অতীতে এই কারণে ব্যবহার করেছি।
ব্যবহারের সাথে সতর্কতা অবলম্বন করুন RAND()
- অনেকগুলি প্রসঙ্গে এটি প্রতি বিবৃতিতে একবার কার্যকর ORDER BY RAND()
করা হয় যার ফলে কোনও প্রভাব পড়বে না (যেমন আপনি প্রতিটি সারির জন্য RAND () এর বাইরে একই ফলাফল পাচ্ছেন)।
এই ক্ষেত্রে:
SELECT display_name, RAND() FROM tr_person
আমাদের ব্যক্তির টেবিল থেকে প্রতিটি নাম এবং একটি "এলোমেলো" নম্বর দেয়, যা প্রতিটি সারির জন্য একই। প্রতিবার আপনি ক্যোয়ারি চালানোর সময় সংখ্যাটি পৃথক হয়, তবে প্রতিবারের জন্য প্রতিটি সারির জন্য একই is
RAND()
একটি ORDER BY
ধারাতে ব্যবহৃত একই ক্ষেত্রে এটি দেখাতে , আমি চেষ্টা করি:
SELECT display_name FROM tr_person ORDER BY RAND(), display_name
ফলাফলগুলি এখনও নামের সাথে অর্ডার করা হয় যে ইঙ্গিত করে যে পূর্ববর্তী সাজানো ক্ষেত্রটি (যেটি এলোমেলোভাবে প্রত্যাশিত ছিল) এর কোনও প্রভাব নেই সম্ভবত সম্ভবত সর্বদা একই মান থাকে has
দ্বারা ক্রমানুসার NEWID()
কারন যদি NEWID () করা হয় নি, যদিও কাজ করে সবসময় যখন অনন্য শনাক্তকারী সঙ্গে এক statemnt অনেক নতুন সারি ঢোকাতে reassessed UUID জানা উদ্দেশ্য ভেঙে ফেলা হবে তারা কী, তাই:
SELECT display_name FROM tr_person ORDER BY NEWID()
নেই নাম "এলোমেলোভাবে" অর্ডার।
অন্যান্য ডিবিএমএস
উপরেরটি এমএসএসকিউএল এর জন্য সত্য (কমপক্ষে ২০০ and এবং ২০০৮, এবং আমি যদি সঠিকভাবে 2000 মনে করি তবে)। একটি নতুন UUID উপস্থাপন করা ফাংশন উচিত সব DBMSs NEWID (ইন প্রত্যেক সময় মূল্যায়ন করা) এমএস স্কুয়েল বয়সী কিন্তু এটি ডকুমেন্টেশন এই যাচাই এবং / অথবা আপনার নিজের পরীক্ষার দ্বারা মূল্য। অন্যান্য স্বেচ্ছাসেবী-ফলাফল ফাংশনগুলির মতো, যেমন RAND () এর ব্যবহার DBMS- এর মধ্যে পরিবর্তিত হওয়ার সম্ভাবনা বেশি থাকে, তাই আবার ডকুমেন্টেশন পরীক্ষা করে দেখুন।
এছাড়াও আমি ইউআইডি মানগুলি দ্বারা আদেশগুলি কিছু প্রসঙ্গে উপেক্ষা করা হিসাবে দেখেছি কারণ ডিবি অনুমান করে যে ধরণের কোনও অর্থবোধক ক্রম নেই। যদি আপনি এটি দেখতে পেয়ে থাকেন তবে স্পষ্টভাবে অর্ডারিং ক্লজে ইউআইডিটিকে একটি স্ট্রিং টাইপের জন্য ফেলে দিন বা CHECKSUM()
এসকিউএল সার্ভারের মতো এটির চারপাশে অন্য কোনও ফাংশন মোড়ানো (অর্ডারিংয়ের কাজটি সম্পন্ন হওয়ার সাথে সাথে এর থেকেও একটি ছোট পারফরম্যান্সের পার্থক্য থাকতে পারে) একটি 32-বিট মানগুলি 128-বিট মান নয়, যদিও এর আগে যে CHECKSUM()
মূল্যটি প্রতি মান চালানোর ব্যয়কে ছাড়িয়ে যায় তা আমি আপনাকে পরীক্ষায় ছেড়ে দেব)।
সাইড নোট
আপনি যদি একটি স্বেচ্ছাসেবী কিন্তু কিছুটা পুনরাবৃত্তিযোগ্য অর্ডারিং চান তবে সারিগুলিতে থাকা কিছু অপেক্ষাকৃত অনিয়ন্ত্রিত উপসেটটি অর্ডার করুন। উদাহরণস্বরূপ হয় বা এগুলি একটি স্বেচ্ছাচারিত তবে পুনরাবৃত্তিযোগ্য ক্রমে নামগুলি ফিরিয়ে দেবে:
SELECT display_name FROM tr_person ORDER BY CHECKSUM(display_name), display_name -- order by the checksum of some of the row's data
SELECT display_name FROM tr_person ORDER BY SUBSTRING(display_name, LEN(display_name)/2, 128) -- order by part of the name field, but not in any an obviously recognisable order)
স্বেচ্ছাসেবক তবে পুনরাবৃত্তযোগ্য অর্ডারগুলি অ্যাপ্লিকেশনগুলিতে প্রায়শই কার্যকর হয় না, যদিও আপনি বিভিন্ন আদেশে ফলাফলের জন্য কিছু কোড পরীক্ষা করতে চান তবে পরীক্ষার ক্ষেত্রে কার্যকর হতে পারে তবে প্রতিটি রান একইভাবে কয়েকবার পুনরাবৃত্তি করতে সক্ষম হতে চান (গড় সময় পাওয়ার জন্য বেশ কয়েকটি রানের উপরের ফলাফল, বা আপনি যা কোডটি স্থির করেছেন তা পরীক্ষা করে কোনও নির্দিষ্ট ইনপুট রেজালসেট দ্বারা পূর্বে হাইলাইট করা সমস্যা বা অদক্ষতা দূর করে, বা কেবলমাত্র আপনার কোডটি "স্থিতিশীল" তা পরীক্ষার জন্য প্রতিবার একই ফলাফল ফেরত দেয় যদি কোনও প্রদত্ত ক্রমে একই ডেটা প্রেরণ করা হয়)।
এই কৌশলটি ফাংশনগুলি থেকে আরও স্বেচ্ছাসেবী ফলাফল পেতে ব্যবহার করা যেতে পারে, যা তাদের দেহের মধ্যে NEWID () এর মতো অ-নিরস্ত্রী কলকে মঞ্জুরি দেয় না। আবার, এটি এমন কিছু নয় যা সম্ভবত প্রায়শই বাস্তব বিশ্বে কার্যকর হতে পারে তবে আপনি যদি কোনও ফাংশন এলোমেলো কিছু ফিরিয়ে দিতে চান এবং "র্যান্ডম-ইশ" যথেষ্ট ভাল হয় তবে কার্যকর হতে পারে (তবে নির্ধারিত নিয়মগুলি মনে রাখার জন্য সতর্ক থাকুন যখন ব্যবহারকারী সংজ্ঞায়িত ফাংশনগুলি বিবর্তিত হয়, অর্থাত্ সাধারণত প্রতি সারি প্রতি একবার, বা আপনার ফলাফলগুলি আপনি যা চান / চান তা নাও হতে পারে)।
কর্মক্ষমতা
যেমন ইবারার উল্লেখ করেছে, উপরের যে কোনওটির সাথে পারফরম্যান্সের সমস্যা থাকতে পারে। কয়েকটি সারিটিরও বেশি জন্য আপনি অনুরোধ করা সারিগুলির সঠিক ক্রমে পুনরায় পাঠ করার আগে আউটপুটটি টেম্পডবি করার জন্য প্রায় গ্যারান্টিযুক্ত, যার অর্থ আপনি শীর্ষ 10 খুঁজছেন এমনকি যদি আপনি একটি সম্পূর্ণ সূচক খুঁজে পেতে পারেন স্ক্যান (বা আরও খারাপ, টেবিল স্ক্যান) টেম্পডবিতে রচনার বিশাল ব্লকের সাথে ঘটে। এজন্য এটি উত্পাদনের ক্ষেত্রে এটি ব্যবহারের আগে বাস্তবসম্মত ডেটা সহ বেঞ্চমার্ক করা বেশিরভাগ জিনিসের মতো জোরালোভাবে গুরুত্বপূর্ণ হতে পারে।