MS SQL 2008, заметки на полях. Очень много случайных чисел

В решении многих задач необходимо вставить большое количество подобных строк, содержащие заранее заданную информацию, например тестирование слабых мест в приложении. Основной сложностью является ни столько алгоритм создания данных, сколько механизм позволяющий создать такое количество строк.

 Всех кого заинтересовала тема, добро пожаловать под кат...

Задачка: на MS SQL 2008, добавить в таблицу 10000000 (десять миллионов) случайных простых чисел от 1 до 100 000. И хотелось бы сделать это как можно быстрее.
 В простоте задачи, кроется большое поле для творчества.

Решение 1.
 Самый простой способ: организовать цикл и добавлять случайное число в таблицу на каждой итерации.
 Решение не оригинально, простое и … очень долгое, действительно очень долгое…

 
На моей машине (CPU: AMD Phenom II X2 550/RAM: 8Gb/HDD: WD5000AAKS/MS SQL2008R2/Win7x64), когда время выполнения превысило 25 минут запрос пришлось прервать.

Решение 2.
 Самое слабое место в предыдущим решении - количество итераций равно количеству добавляемых строк.

 Немного поразмыслив и полистав google находим интересную таблицу master..spt_values (не иссякаем MS SQL как атом).

 Перепишем запрос.
 Будем вставлять не по одной записи, а по 2000 за раз.
 Решение не сильно отличается от предыдущего, но получаем огромное увеличение производительности.

 
У меня на запрос ушло 48 секунд.
 (Если предположить что наше решение в 2000 раз стало быстрее, но предыдущее выполнялось бы более 26 часов).
 

Решение 3.
 Можно ли еще увеличить производительность?
 Посмотрим на скрипт, WHILE.
 Чтобы от него избавиться, нам нужно таблица содержащая как можно большее количество чисел - в идеале равное 10000000.

 Роем google - "CROSS JOIN" и "WITH".

 Нам понадобиться таблица простых чисел:

 
 
из которой мы создадим таблицу содержащую необходимый набор чисел:
 
 
и наконец добавляем результат 
 
 

Запрос выполнился за менее чем 34 секунды.

Какое решение выбрать?
 Конечно не используем решение в лоб. То есть решение 1, можно спокойно отдать истории "как не надо делать".

 Разница между решением 2 и решением 3 не так очевидна. Простота против скорости. Какое из них использовать - зависит от конкретной ситуации и что будет проще поддерживать и расширять в будущем.

 

Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=27007