Saltear al contenido principal

Millones de datos Aleatorios en SQL Server

Cuando vas a realizar pruebas de tu código TSQL es muy importante verificar que lo que has programado no solo funcione en condiciones mínimas sino también en concurrencia, en tablas crecidas y cualquier condición de estrés. Entonces ¿dónde probar estos escenarios si no tenemos estructuras que nos apoyen? Veremos en este artículo cómo generar millones de datos aleatorios en SQL Server que puedan ayudarte en tus pruebas.


Iniciando el diseño

Para generar valores aleatorios, primero debes identificar qué es lo que necesitas probar. A veces serán cálculos, funciones, índices u otros. Con esta información podrás determinar cómo direccionar el diseño de tus datos. En esta publicación iremos por un camino estándar para que puedas adecuarlo.


¿Necesitas nombres y descripciones?

Puedes ver en nuestro repositorio de Github que tenemos una lista de nombres propios que puedes usar para llenar tablas con datos de prueba. También utilizaremos los textos lorem que seguro los has visto en páginas de prueba. En este sitio puedes crear texto de prueba de acuerdo a la cantidad de palabras o caracteres que necesites. Yo generé 500 caracteres para usarlos en una variable varchar y llenar una tabla con cantidad aleatoria de caracteres.


Números aleatorios

Para generar números aleatorios no basta con usar una función RAND pues podrías repetir el mismo número en todas las filas de tu tabla. Te explico de forma completa el cómo generar números aleatorios en SQL Server en el enlace anterior.


Ahora vamos a crear la tabla

Ahora bien, es evidente que la cantidad de campos, tamaños, tipos de datos, etc dependen de la necesidad de cada uno. Yo crearé una tabla estándar con una llave primaria que claro, puedes adecuarla como mejor te parezca.

USE master
GO

-- Debemos tener la tabla #Names que está en el Git referenciado al principio. El enlace:
-- https://github.com/datoptim/BuildData/blob/9131addd0a3d16a128b4364b8fde4eae465c2235/PeopleNames.sql
 

/*
	1. Creamos una temporal para generar dos nombres aleatorios
	Generamos los códigos de nombre para usar con la tabla #Names
*/

SELECT TOP 1000000
	CAST(4949 * RAND(CHECKSUM(NEWID()))+1 AS INT) AS Name1,
	CAST(4949 * RAND(CHECKSUM(NEWID()))+1 AS INT) AS Name2
INTO #TempNames
FROM sys.all_objects a​
CROSS JOIN sys.all_objects b



/*
	2. Preparamos la tabla final para nuestros datos aleatorios
*/

CREATE TABLE FakeTable (​
	RowId INT IDENTITY(1,1) PRIMARY KEY,​
	Name VARCHAR(16),​
	MiddleName VARCHAR(16),​
	Office INT,
	Gender SMALLINT,
	DayOfBirth DATE,
	DescriptionText VARCHAR(500)
	)


	
/*
	3. Preparamos una variable para generar textos aleatorios
*/

DECLARE @lorem varchar(1000)
SET @lorem = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius arcu purus, nec tristique elit pharetra ut. Vestibulum lobortis sagittis bibendum. Duis a libero interdum, faucibus dolor id, elementum purus. Fusce euismod fringilla libero. Suspendisse ac consectetur nisi, non scelerisque diam. Pellentesque ultrices dapibus accumsan. Phasellus cursus pulvinar mauris, eu elementum felis tempor vel. Praesent tellus eros, rutrum ac facilisis quis, tincidunt nec ipsum. Duis arcu arcu, aliquet in dapibus sed, iaculis ut metus. Etiam non dolor id augue condimentum consectetur vel et nisi. Integer quis eleifend lectus. Nunc vitae venenatis urna. Nulla imperdiet vel nunc quis mollis. Donec tincidunt maximus cursus. Aenean feugiat ante nec nulla convallis lacinia. Curabitur turpis lorem, maximus congue luctus mattis, ullamcorper id erat. ​
​
Integer ullamcorper maximus eros id fermentum. Maecenas in dui rutrum, ullamcorper dolor in, tristique mauris. Morbi auctor ornare leo, vitae posuere. '​




/*
	4. Insertamos todos los datos aleatorios en la tabla FakeTable
*/

INSERT INTO FakeTable  (Name, MiddleName, Office, Gender, DayOfBirth, DescriptionText) 
SELECT 
	b.name AS Name, 
	c.name AS MiddleName, 
	CAST(200 * RAND(CHECKSUM(NEWID()))+100 AS INT) AS Office,
	CAST(5 * RAND(CHECKSUM(NEWID()))+1 AS INT) AS Gender,
	DATEADD(day,CAST(18000 * RAND(CHECKSUM(NEWID()))+1 AS INT),'1960-09-11') AS DayOfBirth,
	SUBSTRING(@lorem,1,CAST(500 * RAND(CHECKSUM(NEWID())) AS INT)) AS DescriptionText
FROM #TempNames a
LEFT JOIN #Names b
	ON a.Name1 = b.id
LEFT JOIN #Names c
	ON a.Name2 = c.id

Consideraciones finales para los millones de datos aleatorios

La cantidad de datos de tu tabla final estará definida en función al TOP que se ve en la creación de la tabla #TempNames. Si necesitas más registros de los que el CROSS JOIN se proporciona, puedes adicionar un nuevo CROSS JOIN como se ve a continuación.

/* SELECT TOP 10000000
	CAST(4949 * RAND(CHECKSUM(NEWID()))+1 AS INT) AS Name1,
	CAST(4949 * RAND(CHECKSUM(NEWID()))+1 AS INT) AS Name2
INTO #TempNames
FROM [sys].[all_objects] a​
CROSS JOIN [sys].[all_objects] b
CROSS JOIN [sys].[all_objects] c
*/

Con toda la información ya puedes crear índices y hacer más pruebas. No te olvides que es importante que consideres que entre ambientes también puedes tener diferentes resultados, por eso te invito a que leas el artículo Desarrollo vs Producción.

Maneras de realizar más validaciones puede haber muchas, puedes ver también los detalles de Cómo hacer Testing en SQL Server.

El objetivo siempre será darle velocidad a tus programas. No olvides que la meta siempre es la misma y puedes ver más información en la publicación Cómo hacer Consultas más Rapidas.


Resumen de la generación de millones de datos aleatorios

Todo esta descripción del artículo la revisamos en una sesión en vivo que puedes ver aquí.

Pablo Javier Fernández

www.datoptim.com
I love working on SQL Server Performance Tuning and finding the origin of the problems. Music and SQL Server passionate.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Close search

Carrito

Volver arriba