कुंजी यहां NEWID फ़ंक्शन है, जो प्रत्येक पंक्ति के लिए स्मृति में एक वैश्विक रूप से अद्वितीय पहचानकर्ता (GUID) उत्पन्न करता है। परिभाषा के अनुसार, GUID अद्वितीय और काफी यादृच्छिक है; इसलिए, जब आप ऑर्डर द्वारा ORDER के साथ उस GUID द्वारा सॉर्ट करते हैं, तो आपको तालिका में पंक्तियों का यादृच्छिक क्रम मिलता है। शीर्ष 10 प्रतिशत (या जो भी प्रतिशत आप चाहते हैं) लेना आपको तालिका में पंक्तियों का एक यादृच्छिक नमूना देगा।
NEWID क्वेरी का प्रस्ताव है; यह सरल है और छोटे टेबल के लिए बहुत अच्छी तरह से काम करता है। हालांकि, जब आप बड़ी टेबल के लिए इसका उपयोग करते हैं तो NEWID क्वेरी में बड़ी कमी होती है। खंड द्वारा ऑर्डर तालिका में सभी पंक्तियों को tempdb डेटाबेस में कॉपी करने का कारण बनता है, जहां उन्हें सॉर्ट किया जाता है। इससे दो समस्याएं आती हैं: सॉर्टिंग ऑपरेशन आमतौर पर इसके साथ जुड़ी एक उच्च लागत होती है। छंटनी बहुत सारी डिस्क I/O का उपयोग कर सकती है और लंबे समय तक चल सकती है। सबसे खराब स्थिति परिदृश्य में, tempdb अंतरिक्ष से बाहर चला सकता है। सबसे अच्छे मामले परिदृश्य में, tempdb डिस्क स्थान की एक बड़ी मात्रा ले सकता है जिसे बिना किसी मैन्युअल सिकंक कमांड के पुनः प्राप्त किया जाएगा। आपको जो पंक्तियों की आवश्यकता है वह यादृच्छिक रूप से पंक्तियों का चयन करने का एक तरीका है जो tempdb का उपयोग नहीं करेगा और तालिका जितनी बड़ी हो जाएगी उतनी धीमी नहीं होगी।
SELECT * FROM master..spt_values
WHERE (ABS(CAST(
(BINARY_CHECKSUM(*) *
RAND()) as int)) % 100) < 10
इस क्वेरी के पीछे मूल विचार यह है कि हम तालिका में प्रत्येक पंक्ति के लिए 0 से 99 के बीच एक यादृच्छिक संख्या उत्पन्न करने के लिए चाहते हैं और फिर उन सभी चुनें: यहां बताया गया है कि ऐसा करने के लिए पर एक नया विचार है पंक्तियां जिनकी यादृच्छिक संख्या निर्दिष्ट प्रतिशत के मूल्य से कम है। इस उदाहरण में, हम पंक्तियों में से लगभग 10 प्रतिशत यादृच्छिक रूप से चुने गए हैं; इसलिए, हम पंक्तियों जिसका यादृच्छिक संख्या के सभी है चुनें कम से कम 10
स्रोत
2014-05-07 09:11:44
ध्यान दें कि यह एक धीमी गति से जिस तरह से जब तक डाटाबेस सर्वर पहचानता 100 यादृच्छिक प्रविष्टियां प्राप्त करने के लिए है इसे अनुकूलित करने के लिए एक ज्ञात पैटर्न के रूप में। – CodesInChaos
यह केवल छद्म-यादृच्छिक है। अगर आपको सुरक्षा के लिए सही यादृच्छिकता की आवश्यकता है, तो इस विधि का कभी भी उपयोग न करें। –
आपके 'ORDER BY' खंड में कॉलम को SQL सर्वर में आपके' SELECT' खंड में दिखाई देने की आवश्यकता नहीं है। – Gabe