Thursday, December 04, 2014

Diagnosticar el desempeño en SQL Azure Database


Cuando se tiene un base de datos en Azure, muchas veces es necesario tomar algunas estadisticas del uso de la base de datos para determinar si tenemos que aumentar el nivel de servicio de Azure, o sea aumentar los DTU asignados a nuestra base de datos, a continuación les muestro algunas consultas importantes para ver cual es el desempeño actual y determinar si tenemos que hacer cambios. Los consultas son una adaptación de los artículos de desempeño del MSDN.

-- SQL MAS INTENSIVOS
SELECT highest_cpu_queries.plan_handle, highest_cpu_queries.total_worker_time, q.dbid,
q.objectid, q.number, q.encrypted, q.[text]
FROM
(SELECT TOP 10 qs.plan_handle, qs.total_worker_time
FROM sys.dm_exec_query_stats qs
ORDER BY qs.total_worker_time desc) AS highest_cpu_queries
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS q
ORDER BY highest_cpu_queries.total_worker_time desc

--USO DE CPU

SELECT TOP 10 query_stats.query_hash AS 'QueryHash',
SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS 'AvgCPUTime',
MIN(query_stats.statement_text) AS 'StatementText'
FROM
(SELECT QS.*,
SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE QS.statement_end_offset END
- QS.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS QS
CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats
GROUP BY query_stats.query_hash
ORDER BY 2 DESC

-- TIEMPO EJECUCION CONSULTAS

SELECT TOP 10 r.session_id, r.plan_handle, r.sql_handle, r.request_id, r.start_time, r.status,
r.command, r.database_id, r.user_id, r.wait_type, r.wait_time, r.last_wait_type,
r.wait_resource, r.total_elapsed_time, r.cpu_time, r.transaction_isolation_level, r.row_count, st.text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) as st
WHERE r.blocking_session_id = 0
and r.session_id in
(SELECT distinct(blocking_session_id) FROM sys.dm_exec_requests)
GROUP BY r.session_id, r.plan_handle, r.sql_handle, r.request_id, r.start_time, r.status,
r.command, r.database_id, r.user_id, r.wait_type, r.wait_time, r.last_wait_type,
r.wait_resource, r.total_elapsed_time, r.cpu_time, r.transaction_isolation_level,r.row_count, st.text
ORDER BY r.total_elapsed_time desc


-- ESCRITURAS LOGICAS

SELECT TOP 10 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.TEXT)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1) SQLStatement,
qs.execution_count,
qs.total_logical_reads, qs.last_logical_reads,
qs.total_logical_writes, qs.last_logical_writes,
qs.total_worker_time,
qs.last_worker_time,
qs.total_elapsed_time/1000000 total_elapsed_time_in_S,
qs.last_elapsed_time/1000000 last_elapsed_time_in_S,
qs.last_execution_time,
qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_logical_writes DESC

-- LECTURAS

SELECT TOP 10 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.TEXT)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1) SQLStatement,
qs.execution_count,
qs.total_logical_reads, qs.last_logical_reads,
qs.total_logical_writes, qs.last_logical_writes,
qs.total_worker_time,
qs.last_worker_time,
qs.total_elapsed_time/1000000 total_elapsed_time_in_S,
qs.last_elapsed_time/1000000 last_elapsed_time_in_S,
qs.last_execution_time,
qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_logical_reads DESC

-- TIEMPO EJECUCION

SELECT TOP 10
qs.total_elapsed_time / qs.execution_count / 1000000.0 AS average_seconds,
qs.total_elapsed_time / 1000000.0 AS total_seconds,
qs.execution_count,
SUBSTRING (qt.text,qs.statement_start_offset/2,
(CASE WHEN qs.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
ELSE
qs.statement_end_offset
END
- qs.statement_start_offset)/2) AS individual_query,
o.name AS object_name,
DB_NAME(qt.dbid) AS database_name
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
LEFT OUTER JOIN sys.objects o ON qt.objectid = o.object_id
where qt.dbid = DB_ID()
ORDER BY average_seconds DESC;

-- MAS I/O

SELECT TOP 10
(total_logical_reads + total_logical_writes) / qs.execution_count AS average_IO,
(total_logical_reads + total_logical_writes) AS total_IO,
qs.execution_count AS execution_count,
SUBSTRING (qt.text,qs.statement_start_offset/2,
(CASE WHEN qs.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) AS indivudual_query,
o.name AS object_name,
DB_NAME(qt.dbid) AS database_name
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
LEFT OUTER JOIN sys.objects o ON qt.objectid = o.object_id
where qt.dbid = DB_ID()
ORDER BY average_IO DESC;

Tuesday, April 01, 2014

Opciones de escalabilidad de Analysis Services en SQL Server

Si deseamos tener una configuración de escalabilidad de Analysis Services en SQL Server, tenemos que considerar lo siguiente:

  • Opciones para la distribución de la carga de trabajo
  • Proceso para ajustar la escala de salida de Analysis Services

Para podemos seguir alguna de las siguientes estrategias:

 

  • Utilice un servidor separado para cada base de datos de Analysis Services
  • Utilice un servidor independiente para el almacén de datos relacional
  • Utilice un servidor de ensayo para el procesamiento

 

image

En el caso de alta disponibilidad podemos utilizar un balanceador de carga o un clúster de servidores, tal y como se muestra a continuación:

image

Un diseño de escalablidad lo mostramos en la siguiente figura:

image

 

Saludos,

 

Ing. Eduardo Castro, PhD

Microsoft SQL Server MVP

SQL Server 2012 configuración de opciones AlwaysOn

Cuando tenemos un SQL Server 2012 con AlwaysOn, el uso de copias secundarias activas es de gran ayuda, ya que las copias secundarias activas permite utilizar major el hardware que en el scenario de HA/DR:

  • Liberar trabajo al primario
  • Cargas de trabajo de solo léctura
  • Realización de respaldos

 

Este uso lo podemos observar en las siguientes diagramas:

image

 

 

image

 

Para configurar las copias secundarias como de solo lectura podemos utilizar los siguientes estatutos:

 

 

image

 

image

 

Una vez configurado los clientes se pueden conectar a la copia secundaria sin cambios.

 

Saludos,

 

Ing. Eduardo Castro, PhD

Microsoft SQL Server MVP

SQL Server 2012 Almacenamiento con SMB

En la versión de SQL Server 2012 se permite el soporte de almacenamiento en un servidor de archivos mediante SMB, esto nos provee ciertas ventajas:

  • Red compartido provee acceso a un almacenamiento remoto consolidado
  • Alto desempeño
  • Alta disponibilidad
  • Administración sencilla
  • Se administran archivos compartidos SMB en lugar de LUNs
  • Relocación dinámica de los servidor o servicios
  • Reduce la complejidad de una solución SQL Server

El siguiente esquema muestra de forma general el uso de SMB con SQL Server 2012

 

image

Por qué ahora se puede utilizar SMB? Sencillamente el SMB ha cambiado y se han presentado los siguientes avances:

  • Hardware de Ethernet más confiables
  • En algunos casos la velocidad se aproxima a Fibra Canal
  • Nuevas capacidad de alta disponibilidad de SMB
  • SMB Multichannel – tolerancia a fallas de red
  • SMB Transparent Failover – tolerancia a fallas de servidor
  • Nuevas formas de desempeño de SMB
  • SMB Multichannel – agregación de ancho de banda
  • SMB Direct – soporte para tarjeta RDMA
  • Nuevas opciones de almacenamiento en los servidores de archivos
  • Storage Spaces – virtualización de almacenamiento
  • Cluster-in-a-box – controladores Clustered RAID

En cuanto a las versiones de SQL Server, éstas son las opciones según la opción de SQL Server:

  • SQL Server 2008 R2
    • Brinda soporte inicial para almacenar base de datos de usuarios en SMB
  • SQL Server 2012
    • Soporte para clúster de SQL Server utilizando SMB
    • Soporte para bases de datos del sistema en SMB
    • Soluciona problemas de desempeño (253493)

 

Saludos,

Ing. Eduardo Castro

Microsoft SQL Server MVP

Qué mejoras posee SQL Server 2012 Clúster en Windows 2012

En este artículo enumeramos las mejoras que presenta SQL Server 2012 cuando ejecuta dentro una máquina con Windows Server 2012.

 

Mejoras en la validación del clúster

Mejoras en desempeño de validación del almacenamiento

Incluye pruebas de validación de Clúster de Hyper-V

Provee control granular sobre la validación de LUN específicos

Verificación de los requerimientos de CSV

Replicated hardware aware para multi-site clusters

Mejor escalabilidad

Mejoras de scale out y scale up

4x más escable que Windows Server 2008 R2

Scale out hasta 64-nodes

Scale up hasta 4,000 VMs por clúster

Hasta 1,024 VMs por nodo

Mejor seguridad
Volúmenes de cluster encriptados

Discos del cluster encriptados con BitLocker

Soporta discos de conmutación normales

Soporta for Cluster Shared Volumes

Los volúmenes son desencriptados por cada nodo utilizando Cluster Name Object (CNO)

Permite la seguridad física fuera de centro de datos principales

Encriptación a nivel de volumen para cumplir con normativas de seguridad

Soporte en HyperV
Fibra canal desde la máquina virtual

Clustering de MV

El servicio de clúster ejecuta dentro de la MV

Las aplicaciones y servicios dentro de la MV son administradas por el clúster

Las aplicaciones se mueven dentro del cluster de MV

Antes requería iSCSI

Nuevo “Fibre Channel Adapter”

Se pueden asignar hasta 4 HBA virtuales a cada MV

 

Saludos,

 

Ing. Eduardo Castro

Microsoft SQL Server MVP

Thursday, February 13, 2014

Script de instalación de SQL Server 2012 Core

Para realizar la instalación de SQL Server Core es necesario conocer los comandos de PowerShell, en este artículo les comparto los comandos principales para instalación.

El comando inicial que van  a necesitar es sconfig  con este utilitario van a poder fácilmente cambiar la IP de la máquina, cambiarle el nombre y unirla al dominio si es necesario.

Posteriormente necesitan instalar el .NET Framework para lo cual tiene dos opciones con  PowerShell o con DISM:

//Instalar .NET Core
Install-WindowsFeature NET-Framework-Core –Source D:\Sources\sxs

//Using DISM from the command prompt, specify the source files path parameter:

DISM /Online /Enable-Feature /FeatureName:NetFx3 /Source:d:\sources\sxs

Posteriormente deben configurar el Firewal para permitir la conexión remota al SQL Server, los comandos son los siguientes:

//minimo firewall
netsh advfirewall firewall add rule name="Open SQL Server Port 1433" dir=in action=allow protocol=TCP localport=1433
netsh advfirewall firewall add rule name="SQL Server Analysis Services inbound on TCP 2383" dir=in action=allow protocol=TCP localport=2383 profile=domain

//excepcion de puertos dinamicos
netsh advfirewall firewall add rule name="SQL Server Browser Services inbound on TCP 2382" dir=in action=allow protocol=TCP localport=2382 profile=domain

//adminsitraicon remota

netsh advfirewall firewall set rule group="Windows Management Instrumentation (WMI)" new enable=yes
netsh advfirewall firewall set rule group=“remote event log management” new enable=yes

Deben insertar el disco de SQL Server y si intentan ejecutar el setup.exe se mostrará un mensaje de error, si desean instalar utilizando la interfaz gráfica utilicen el siguiente comando:

 

//utilizar el comando para ver la interfaz grafica

setup.exe /UIMODE=EnableUIonServerCore

 

También está la opción de instalación por línea de comando, recuerden cambiarlos nombres de las cuentas y las contraseñas:

 

//por linea de comandos
Setup.exe /QS /ACTION=Install /FEATURES=SQLENGINE,REPLICATION,CONN,IS /INSTANCENAME=MSSQLSERVER /SQLSVCACCOUNT=AdventureWorks\sqlservicecore /SQLSVCPASSWORD=P@ssw0rd /SQLSYSADMINACCOUNTS=AdventureWorks\Administrator /AGTSVCACCOUNT=AdventureWorks\sqlserviceCore /AGTSVCPASSWORD=P@ssw0rd /TCPENABLED=1 /IACCEPTSQLSERVERLICENSETERMS=1 /UPDATEENABLED=False

Saludos,

Ing. Eduardo Castro

Microsoft SQL Server MVP

SQL Server 2016 Stretch Databases

El SQL Server Stretch Database permite que los datos históricos o de bitácoras puedan ser movidos hacia Azure, específicamente permite mover...