newid () / आदेश द्वारा काम करेगा, लेकिन बड़े परिणाम सेटों के लिए बहुत महंगा होगा क्योंकि इसे हर पंक्ति के लिए एक आईडी उत्पन्न करना होगा, और फिर उन्हें क्रमबद्ध करना होगा।
TABLESAMPLE () एक प्रदर्शन के दृष्टिकोण से अच्छा है, लेकिन आपको परिणामों की गड़गड़ाहट मिलेगी (एक पृष्ठ पर सभी पंक्तियों को वापस कर दिया जाएगा)।
एक बेहतर प्रदर्शन करने वाले सच्चे यादृच्छिक नमूने के लिए, सबसे अच्छा तरीका है कि बेतरतीब ढंग से पंक्तियों को फ़िल्टर किया जाए। मुझे निम्न कोड नमूना SQL सर्वर पुस्तकें ऑनलाइन लेख सीमा परिणाम सेट में TABLESAMPLE का उपयोग करके मिला :
यदि आप वास्तव में व्यक्तिगत पंक्तियों का एक यादृच्छिक नमूना चाहते हैं, तो TABLESAMPLE का उपयोग करने के बजाय, पंक्तियों को यादृच्छिक रूप से फ़िल्टर करने के लिए अपनी क्वेरी को संशोधित करें। उदाहरण के लिए, निम्न क्वेरी बिक्री के लगभग एक प्रतिशत पंक्तियों को वापस करने के लिए NEWID फ़ंक्शन का उपयोग करती है। SalesOrderDetail Table:
SELECT * FROM Sales.SalesOrderDetail
WHERE 0.01 >= CAST(CHECKSUM(NEWID(),SalesOrderID) & 0x7fffffff AS float)
/ CAST (0x7fffffff AS int)
SalesOrderID कॉलम CHECKSUM अभिव्यक्ति में शामिल है ताकि NEWID () प्रति पंक्ति के आधार पर नमूना प्राप्त करने के लिए प्रति पंक्ति एक बार मूल्यांकन करे। अभिव्यक्ति CAST (CHECKSUM (NEWID), SalesOrderID) और 0x7fffffff AS फ्लोट / 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
यदि आप TABLESAMPLE के उपयोग से दूर हो सकते हैं, तो यह आपको सर्वश्रेष्ठ प्रदर्शन देगा। अन्यथा न्यूड () / फिल्टर विधि का उपयोग करें। यदि आपके पास एक बड़ा परिणाम है, तो newid () / ऑर्डर अंतिम उपाय होना चाहिए।