Це посилання має цікаве порівняння між Orderby (NEWID ()) та іншими методами для таблиць з 1, 7 та 13 мільйонами рядків.
Часто, коли в групах для обговорення задаються питання про те, як вибрати випадкові рядки, пропонується запит NEWID; це просто і дуже добре працює для невеликих столів.
SELECT TOP 10 PERCENT *
FROM Table1
ORDER BY NEWID()
Однак у запиту NEWID є великий недолік, коли ви використовуєте його для великих таблиць. Становище ORDER BY призводить до того, що всі рядки таблиці копіюються в базу даних tempdb, де вони сортуються. Це спричиняє дві проблеми:
- Операція сортування, як правило, пов'язана з високою вартістю. Для сортування можна використовувати багато вводу-виводу диска і може працювати тривалий час.
- У гіршому випадку, у tempdb може не вистачити місця. У найкращому випадку сценарій tempdb може займати велику кількість дискового простору, який ніколи не буде повернутий без команди ручного зменшення.
Вам потрібен спосіб вибору рядків випадковим чином, які не використовуватимуть tempdb і не стануть набагато повільніше, оскільки таблиця збільшується. Ось нова ідея, як це зробити:
SELECT * FROM Table1
WHERE (ABS(CAST(
(BINARY_CHECKSUM(*) *
RAND()) as int)) % 100) < 10
Основна ідея цього запиту полягає в тому, що ми хочемо генерувати випадкове число від 0 до 99 для кожного рядка таблиці, а потім вибирати всі ті рядки, випадкове число яких менше значення вказаного відсотка. У цьому прикладі ми хочемо приблизно 10 відсотків рядків, вибраних випадковим чином; тому ми обираємо всі рядки, випадкове число яких менше 10.
Прочитайте повну статтю в MSDN .