newid () / অর্ডার বাই কাজ করবে তবে বড় রেজাল্ট সেটের জন্য খুব ব্যয়বহুল হবে কারণ এটি প্রতিটি সারির জন্য একটি আইডি উত্পন্ন করতে হবে এবং তারপরে সেগুলি বাছাই করতে হবে।
টেবিলস্যাম্পল () পারফরম্যান্সের দিক থেকে ভাল তবে আপনি ফলাফলের ক্লাম্পিং পাবেন (একটি পৃষ্ঠায় সমস্ত সারি ফিরে আসবে)।
সত্যিকারের এলোমেলো নমুনার আরও ভাল পারফরম্যান্সের জন্য, এলোমেলোভাবে সারিগুলি ফিল্টার করা সবচেয়ে ভাল উপায়। আমি এসকিউএল সার্ভার বই অনলাইন নিবন্ধে সারণি নমুনা ব্যবহার করে ফলাফলের সীমাবদ্ধকরণগুলিতে নিম্নলিখিত কোডের নমুনা পেয়েছি :
আপনি যদি সত্যিই পৃথক সারিগুলির একটি এলোমেলো নমুনা চান তবে সারণীটি স্যাম্বল ব্যবহার না করে এলোমেলোভাবে সারিগুলি ফিল্টার করার জন্য আপনার ক্যোয়ারীটি পরিবর্তন করুন। উদাহরণস্বরূপ, নিম্নলিখিত কোয়েরি বিক্রয়ের সারিগুলির প্রায় এক শতাংশ ফেরত দিতে NEWID ফাংশনটি ব্যবহার করে a সেলস অর্ডারডেটেল টেবিল:
SELECT * FROM Sales.SalesOrderDetail
WHERE 0.01 >= CAST(CHECKSUM(NEWID(),SalesOrderID) & 0x7fffffff AS float)
/ CAST (0x7fffffff AS int)
সেলসঅর্ডারআইডি কলামটি চেকসুম এক্সপ্রেশনটিতে অন্তর্ভুক্ত করা হয়েছে যাতে NEWID () প্রতি সারি ভিত্তিতে নমুনা অর্জনের জন্য প্রতি সারিতে একবার মূল্যায়ন করে। CAST (CHECKSUM (NEWID (), SalesOrderID) & 0x7fffffff as float / CAST (0x7fffffff AS int) এক্সপ্রেশনটি 0 এবং 1 এর মধ্যে একটি এলোমেলো ফ্লোট মানকে মূল্যায়ন করে।
যখন 1,000,000 সারি দিয়ে কোনও টেবিলের বিরুদ্ধে চালানো হয়, তখন আমার ফলাফলগুলি এখানে রয়েছে:
SET STATISTICS TIME ON
SET STATISTICS IO ON
/* newid()
rows returned: 10000
logical reads: 3359
CPU time: 3312 ms
elapsed time = 3359 ms
*/
SELECT TOP 1 PERCENT Number
FROM Numbers
ORDER BY newid()
/* TABLESAMPLE
rows returned: 9269 (varies)
logical reads: 32
CPU time: 0 ms
elapsed time: 5 ms
*/
SELECT Number
FROM Numbers
TABLESAMPLE (1 PERCENT)
/* Filter
rows returned: 9994 (varies)
logical reads: 3359
CPU time: 641 ms
elapsed time: 627 ms
*/
SELECT Number
FROM Numbers
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), Number) & 0x7fffffff AS float)
/ CAST (0x7fffffff AS int)
SET STATISTICS IO OFF
SET STATISTICS TIME OFF
আপনি যদি টেবিলস্যাম্পল ব্যবহার করে পালাতে পারেন তবে এটি আপনাকে সেরা পারফরম্যান্স দেবে। অন্যথায় newid () / ফিল্টার পদ্ধতিটি ব্যবহার করুন। newid () / অর্ডার দ্বারা সর্বশেষ অবলম্বন হওয়া উচিত যদি আপনার একটি বড় ফলাফল সেট থাকে।