Как разработчик SQL, вы часто можете столкнуться с задачей тестирования баз данных большого масштаба с миллионами строк. В то время как существуют коммерческие инструменты для генерации тестовых данных, они могут быть дорогими и не всегда подходят для каждой компании. В этой статье мы рассмотрим несколько трюков для генерации и заполнения тестовых данных в SQL Server без использования дорогостоящих инструментов.
Числовые данные
Когда речь идет о генерации числовых данных, использование функции RAND() может показаться очевидным выбором. Однако имейте в виду, что RAND() вызывается один раз для каждого запроса, а не для каждой строки. Это означает, что он будет возвращать одно и то же значение на протяжении всего запроса, что не является идеальным для генерации большого объема данных.
Более правильным подходом является использование функции NEWID() для генерации случайного значения, а затем вычисление контрольной суммы. Это даст вам действительно случайное значение для каждой строки. Например, чтобы установить поле INTVALUE1 в случайное целочисленное значение, вы можете использовать следующее выражение:
UPDATE TESTTABLE SET INTVALUE1 = CHECKSUM(NEWID())Если вам нужно сгенерировать десятичные значения, вы можете изменить выражение, разделив контрольную сумму на определенное число. Чтобы исключить отрицательные числа, вы можете использовать функцию ABS(). Вот пример:
UPDATE TESTTABLE SET DECVALUE1 = ABS(CHECKSUM(NEWID())) / 100.0Наборы данных с фиксированным диапазоном
Для генерации значений в пределах фиксированного диапазона данных вы можете использовать тот же метод, упомянутый выше, с некоторыми изменениями. Допустим, вам нужно сгенерировать логическое значение (0 или 1). Вы можете использовать четность случайного целого числа, сгенерированного контрольной суммой, чтобы преобразовать его в логические данные. Вот пример:
-- Сгенерировать случайное значение 0 или 1 для каждой строки
UPDATE TESTTABLE SET BOOLVALUE1 = ABS(CHECKSUM(NEWID())) % 2
-- Преобразовать значения в Yes или No
UPDATE TESTTABLE SET BOOLVALUE1 = 'N' WHERE BOOLVALUE1 = '0'
UPDATE TESTTABLE SET BOOLVALUE1 = 'Y' WHERE BOOLVALUE1 = '1'Текстовые данные
Генерация осмысленных текстовых данных требует дополнительного внимания. Один из распространенных подходов – создание начального словаря, а затем использование его для генерации большего количества строк. Например, если вы хотите использовать имена в различных полях базы данных, вы можете создать таблицу с списком имен, а затем выполнить кросс-джойн для генерации большего количества комбинаций.
-- Создать таблицу для имен
CREATE TABLE [NAMES1] (FIRST_NAME [varchar](20))
-- Создать таблицу для фамилий
CREATE TABLE [NAMES2] (FAMILY_NAME [varchar](20))
-- Заполнить имена
INSERT INTO NAMES1 VALUES ('John')
INSERT INTO NAMES1 VALUES ('Jack')
INSERT INTO NAMES1 VALUES ('Jill')
INSERT INTO NAMES1 VALUES ('Bill')
INSERT INTO NAMES1 VALUES ('Mary')
INSERT INTO NAMES1 VALUES ('Kate')
INSERT INTO NAMES1 VALUES ('Kevin')
INSERT INTO NAMES1 VALUES ('Matt')
INSERT INTO NAMES1 VALUES ('Rachel')
INSERT INTO NAMES1 VALUES ('Tom')
-- Заполнить фамилии
INSERT INTO NAMES2 VALUES ('Smith')
INSERT INTO NAMES2 VALUES ('Morgan')
INSERT INTO NAMES2 VALUES ('Simpson')
INSERT INTO NAMES2 VALUES ('Walker')
INSERT INTO NAMES2 VALUES ('Bauer')
INSERT INTO NAMES2 VALUES ('Taylor')
INSERT INTO NAMES2 VALUES ('Morris')
INSERT INTO NAMES2 VALUES ('Elliott')
INSERT INTO NAMES2 VALUES ('Clark')
INSERT INTO NAMES2 VALUES ('Rock')
-- Сгенерировать 10x10=100 разных имен
SELECT * INTO TESTTABLE FROM NAMES1 CROSS JOIN NAMES2Используя кросс-джойны и самоджойны, вы можете быстро сгенерировать большой набор данных из нескольких образцовых строк. Однако будьте осторожны при использовании очень больших таблиц, так как кросс-джойн двух таблиц с тысячей записей может сгенерировать набор результатов из миллиона записей.
С помощью этих трюков вы можете генерировать и заполнять тестовые данные в вашей базе данных SQL Server, не полагаясь на дорогостоящие коммерческие инструменты. Это позволит вам эффективно выполнять тестирование производительности и функциональности баз данных большого масштаба.