TSQL: Re-Indexar todas las tablas de una Base de Datos

By Juan Carlos Heredia Mayer 16/06/2015 Base de Datos

Muchas veces nos a pasado que necesitamos re-indexar todas las tablas de una base de datos del SQL Server y no encontramos un comando que lo haga. Bueno, hay una forma de hacerlo, especialmente si la base de datos tiene muchas tablas, creamos un script que obtiene sus nombres del diccionario de datos y ejecuta el comando DBCC REINDEX de SQL Server por cada una de ellas:

DECLARE @TableName varchar(200) 
DECLARE TableCursor CURSOR 
    FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE = 'BASE TABLE' 

OPEN TableCursor 
FETCH NEXT FROM TableCursor INTO @TableName 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    PRINT 'Reindexando ' + @TableName 
    DBCC DBREINDEX (@TableName) 
    FETCH NEXT FROM TableCursor INTO @TableName 
END 
CLOSE TableCursor 
DEALLOCATE TableCursor 

SQL ServerEspero que os sea de utilidad.

Si quieres más trucos de este tipo te invito a echarle un vistazo a este libro de SQL Server 2014 en Español

Comprar en AmazonSQL Server 2014 | Amazon Kindle Comprar en Google PlaySQL Server 2014 | Google Play Books

Generar datos de prueba para SQL Server

By Juan Carlos Heredia Mayer 25/03/2015 Base de Datos

SQL SERVERMuchas veces cuando empezamos a desarrollar un nuevo proyecto o hacemos un determinado mantenimiento a una aplicación de base de datos, necesitamos precisamente eso: datos de prueba para empezar a trabajar. Lo más simple es agregar algunos registros a nuestras tablas y probar, pero seguro que en breve no serán  suficientes y necesitaremos más datos, ya sea para pruebas de velocidad y rendimiento, filtros, paginación, etc.

Existen herramientas de terceros que permiten generar datos aleatorios, pero son productos caros y no siempre es factible adquirirlos. Entonces, ¿cómo podemos generar esos datos de prueba en nuestras propias bases de datos?.

Solución

Os mostraré algunos trucos para generar datos aleatorios a partir de unos cuantos registros y multiplicarlos por miles. Cada tipo de datos necesita un enfoque diferente como se puede ver a continuación.

Datos Numéricos

En primer lugar, sin duda necesitaremos generar algunos datos numéricos. Lo primero que se nos ocurriría a priori es usar la función RAND(). Desafortunadamente esta función se invoca una sola vez por consulta, no una vez por cada fila, por lo tanto, devuelve el mismo valor para cada registro afectado por la consulta. Así que sugiero el uso de otros métodos, a menos que se desea utilizar un valor de inicialización distinto para cada llamada, que puede ser muy trabajoso para la generación de un volumen masivo de datos.

Lo mejor para obtener un valor aleatorio real, es usar la función NEWID () junto con la función CHECKSUM(). La siguiente expresión devuelve un valor entero aleatorio:

SELECT CHECKSUM(NEWID())

Esto devuelve un número entero positivo o negativo, pero podemos hacer una modificación para que devuelva valores positivos y decimales, si es lo que necesitamos.

SELECT ABS(CHECKSUM(NEWID()))/100.0

Por supuesto esta expresión es aplicable para agregar o modificar un registro. Por ejemplo la siguiente sentencia agregaría un nuevo registro y se puede ejecutar cuantas veces sea necesario para generar muchos registros:

INSERT INTO [dbo].[TablaPrueba]
           ([ENTERO],
            [DECIMAL])
     VALUES
           (ABS(CHECKSUM(NEWID())),
            ABS(CHECKSUM(NEWID()))/100.0)

Después de ejecutar la sentencia varias veces podemos consultar los datos:

SELECT [ENTERO], [DECIMAL]
    FROM [dbo].[TablaPrueba]
SQL SELECT

La siguiente instrucción actualiza registros existentes en lote, cada registro tendría valores distintos:

UPDATE [dbo].[TablaPrueba]
   SET [DECIMAL] = ABS(CHECKSUM(NEWID()))/100.0

Datos de Texto

Es posible usar la misma función NEWID(), para generar textos. La siguiente sentencia devolverá un valor aleatorio algo así como: 4F9008A9-BA3D-4077-A17E-724E2AF962AD.

SELECT CONVERT(VARCHAR(MAX),NEWID())


Sin embargo como se puede ver generará textos basados en letras y números que no tendrán un significado especial. Los datos de texto requieren especial atención,  si se desea tener una base de datos con un cierto contenido razonable. Lo primero que se debería hacer es construir un diccionario inicial y luego utilizarlo para generar más filas. Por ejemplo, es común el uso de nombres en varios campos de la base de datos. El siguiente ejemplo muestra cómo crear una tabla que contendrá 100 nombres diferentes en pocos segundos.

-- Crear Tabla para Nombres 
CREATE TABLE [NOMBRES] (NOMBRE [varchar](20))  
-- Crear Tabla para Apellidos 
CREATE TABLE [APELLIDOS] (APELLIDO [varchar](20))  
-- Llenar algunos nombres
INSERT INTO NOMBRES VALUES ('Juan')  
INSERT INTO NOMBRES VALUES ('Carlos')  
INSERT INTO NOMBRES VALUES ('Pablo')  
INSERT INTO NOMBRES VALUES ('María')  
INSERT INTO NOMBRES VALUES ('Enrique')  
INSERT INTO NOMBRES VALUES ('Jorge')  
INSERT INTO NOMBRES VALUES ('Luis')  
INSERT INTO NOMBRES VALUES ('Raúl')  
INSERT INTO NOMBRES VALUES ('Sofia')  
INSERT INTO NOMBRES VALUES ('Jesús')  
-- Llenar algunos apellidos  
INSERT INTO APELLIDOS VALUES ('Arias')  
INSERT INTO APELLIDOS VALUES ('Pérez')  
INSERT INTO APELLIDOS VALUES ('Pinto')  
INSERT INTO APELLIDOS VALUES ('Sánchez')  
INSERT INTO APELLIDOS VALUES ('Herrera')  
INSERT INTO APELLIDOS VALUES ('Rojas')  
INSERT INTO APELLIDOS VALUES ('Poma')  
INSERT INTO APELLIDOS VALUES ('Redondo')  
INSERT INTO APELLIDOS VALUES ('Tapia')  
INSERT INTO APELLIDOS VALUES ('Gil')  
-- Generar 10x10=100 nombres diferentes  
SELECT * INTO TESTTABLE FROM NOMBRES CROSS JOIN APELLIDOS

Con los ejemplos anteriores se pueden generar rápidamente más y más registros diferentes para unas cuantas tablas de una base de datos, para así tener datos de prueba al momento de implementar una aplicación. El uso de  los CROSS JOIN Y SELF JOIN pueden crear fácilmente gran cantidad de datos así que se debería tener cuidado al utilizar tablas muy grandes o con muchos datos.

Si quieres más trucos de este tipo te invito a echarle un vistazo a este Nuevo libro de SQL Server 2014 en Español

Comprar en AmazonSQL Server 2014 | Amazon Kindle Comprar en Google PlaySQL Server 2014 | Google Play Books