Test Cursor vs While en SQL Server

Para el siguiente test entre un cursor vs while loop utilizaremos una tabla con la siguiente estructura:

CREATE TABLE AprendeDB

(

ID int IDENTITY(1,1) PRIMARY KEY CLUSTERED,

Name nvarchar(50)

)

Aplicaremos el siguiente fix data ejecutándolo para obtener 1000 registros

DECLARE @max int=1000, @count int=1

WHILE @max>=@count

BEGIN

BEGIN TRAN

INSERT INTO AprendeDB VALUES(‘www.aprendedb.com’)

 

COMMIT

SET @count=@count+1

END

Definición del Cursor:

SET NOCOUNT ON

DECLARE my_cursor CURSOR FOR SELECT ID,Name FROM AprendeDB

DECLARE @id INT

DECLARE @name NVARCHAR(50)

OPEN my_cursor

FETCH NEXT FROM my_cursor INTO @id,@name

WHILE @@FETCH_STATUS = 0

BEGIN

PRINT  (CAST(@id AS VARCHAR(5)) + ‘.)’ + @name)

FETCH NEXT FROM my_cursor

END

CLOSE my_cursor

DEALLOCATE my_cursor

Definición del While:

DECLARE @Rows INT, @id1 INT

DECLARE @name1 NVARCHAR(50)

SET @Rows = 1

SET @id1 = 0

WHILE @Rows > 0

BEGIN

SELECT TOP 1 @id1 = ID, @name1 = Name FROM AprendeDB WHERE ID >= @id1

SET @Rows = @@ROWCOUNT

PRINT  (CAST(@id1 AS VARCHAR(5)) + ‘.)’ + @name1)

SET @id1 += 1

END

Utilizaremos SQL Server Profiler para medir las estadísticas utilizadas en cada una de las ejecuciones:

profiler

Estadísticas del cursor:

Duration:  70892              CPU: 46                               Reads: 4113

Estadísticas de While:

Duration: 387                    CPU: 16                               Reads: 2054

Conclusión:

Se logra evidenciar que utilizando un constructor While se obtiene mayor rendimiento a nivel de tiempo y menor número de lecturas que un cursor para este escenario.

 

Visita http://www.aprendedb.com

 

Anuncios

Protegiendo nuestros datos en las Organizaciones con SQL Server 2016

Nuestras organizaciones poseen como uno de los principales activos “la información” que se encuentra alojada en sus almacenes de datos, es de vital importancia que las herramientas que utilizamos para poder alojarlos nos brinden la mayor seguridad de manera sencilla.

Microsoft SQL Server 2016 reafirma su mejora continua en ofrecer a nuestras organizaciones soluciones para poder proteger nuestros datos tanto dentro y fuera de nuestras organizaciones, para ello ha implementado nuevas características de seguridad, entre ellas: Transparent Data Encryption, Dynamic Data Masking, Row Level Security y Always Encrypted.

Always Encrypted es una característica que nos permite proteger datos de manera confidencial, como números de tarjetas de créditos, seguro social, identificadores personales, etc; independizando aquellos que poseen los datos (y pueden verlos) de aquellos que lo administran, pero no deberían tener acceso a este tipo de información sensible.

En Always Encrypted el trabajo de cifrado/descrifrado se realiza en la aplicación cliente a nivel del driver de ADO.Net activando la propiedad Column Encription Setting en la cadena de conexión, esta funcionalidad se encuentra tanto en el Servicio de Database Engine de SQL Server 2016 y en Azure SQL Database, logrando implementar no solo la encriptación de nuestra información almacenada, sino que a su vez encripta los datos al viajar por la red.

Descubre mucho más sobre el nuevo SQL Server 2016 revisando los siguientes enlaces:

Evalúa SQL Server 2016
Documentación Técnica de SQL Server 2016
Introducción a SQL Server 2016 (eBook)

Publicado en: TechNet-Flash-Julio-2016

Instalación SQL Server 2017 CTP 2.0 en Ubuntu Server

En este videoblog muestro como podemos instalar SQL Server 2017 CTP 2.0 en Ubuntu Server, a continuación la secuencia de comandos para la instalación:

Importar las claves GPG públicas
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add –

Registrar el repositorio de Ubuntu de Microsoft SQL Server
curl https://packages.microsoft.com/config/ubuntu/16.04/mssql-server.list | sudo tee /etc/apt/sources.list.d/mssql-server.list

Ejecute los siguientes comandos para instalar SQL Server:
sudo apt-get update
sudo apt-get install -y mssql-server

Configuración inicial de SQL Server
sudo /opt/mssql/bin/mssql-conf setup

Una vez realizada la configuración, compruebe que el servicio se está ejecutando:
systemctl status mssql-server

Referencia: https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup-ubuntu

Monitoreando la Desfragmentación de Indices en MS SQL Server

Como parte de nuestras actividades dentro de la administración de una Base de Datos en MS SQL Server, debemos implementar índices en nuestras Tablas a fin de mejorar el rendimiento de nuestros procesos ya sean Select’s, Exec’s, etc; pero que ocurre luego de que hemos implementado estos objetos, pues debemos tener un control y monitoreo de la desfragmentación que poseen (La fragmentación ocurre cuando los índices tienen páginas en las que la ordenación lógica, basada en el valor de clave, no coincide con la ordenación física dentro del archivo de datos. Los índices muy fragmentados pueden reducir el rendimiento de la consulta y ralentizar la respuesta de la aplicación https://msdn.microsoft.com/es-es/library/ms189858.aspx ).

Por lo tanto más alla de poder implementar un mantenimiento de indices de forma semanal, debemos monitorear de manera constante a fin de ver si este periodo de mantenimiento es suficiente o debe realizarse de manera más continua, y sobre todo a qué índices debemos aplicar las tareas ya sean de Rebuild o Reorganize (ello lo analizaremos en un siguiente post). Entonces para ello podemos combinar nuestras DMV’s y a través del siguiente query podemos ver a detalle el nivel de DESFRAGMENTACION que poseen nuestros índices y evaluar las tareas específicas a realizar.

Aquí el query:

SELECT DB_NAME(database_id) AS DatabaseName, database_id,
OBJECT_NAME(ips.object_id) AS TableName, ips.object_id,
i.name AS IndexName, i.index_id, p.rows,
ips.partition_number, index_type_desc, alloc_unit_type_desc, index_depth, index_level,
avg_fragmentation_in_percent, fragment_count, avg_fragment_size_in_pages, page_count,
avg_page_space_used_in_percent, record_count, ghost_record_count, version_ghost_record_count, min_record_size_in_bytes,
max_record_size_in_bytes, avg_record_size_in_bytes, forwarded_record_count,GETDATE()DateCreated
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, ‘LIMITED’) ips
INNER JOIN sys.indexes i ON i.object_id = ips.object_id AND i.index_id = ips.index_id
INNER JOIN sys.partitions p ON p.object_id = i.object_id AND p.index_id = i.index_id
WHERE avg_fragmentation_in_percent > 10.0 AND ips.index_id > 0 AND page_count > 1000

Tener en cuenta que esta consulta es por BD y aplica a todas nuestros índices que se encuentran en todas nuestras tablas.

Si tienes una consulta deja tu comentario en el post y visítanos en http://www.aprendedb.com.

Hasta el siguiente post!

Inventario de Tablas por registro y tamaño en Kb

Hola como les va, aquí les dejo un pequeño query que les permitirá ver la cantidad de registros de cada tabla de su Base de Datos su tamaño en Kb y algunos datos adicionales que les será de mucha ayuda:

SET NOCOUNT ON

DECLARE @sizes TABLE
(
[name] NVARCHAR(128),
[rows] CHAR(11),
reserved VARCHAR(18),
data VARCHAR(18),
index_size VARCHAR(18),
unused VARCHAR(18)
)
INSERT @sizes EXEC sp_msForEachTable ‘EXEC sp_spaceused ”?”’
SELECT *
FROM @sizes
ORDER BY [rows] DESC

No olviden de visitar http://www.aprendedb.com

 

Saludos!