Encontrar los queries que consumen mas recursos

Los DMVs (Dynamic Management Views) son una magnífica forma de encontrar información de performance a partir de SQL Server 2005 en adelante (2008/2008R2/2012)
En este query de Pinal Dave se utilizan DMVs para encontrar los queries que mas consumen en un server SQL Server 2005/2008 (recordar que este script funciona solo en bases compatibilidad 2005/2008)


Query:


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),
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 -- logical reads
-- ORDER BY qs.total_logical_writes DESC -- logical writes
-- ORDER BY qs.total_worker_time DESC -- CPU time

Obviamente se puede cambiar el ordenamiento del script para destacar otro criterio de búsqueda.


Hugo Román Bernachea
SQLServer777@gmail.com
Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea


Read More...

Como reparar usuarios "huérfanos"?

Muchas veces encontramos que el user de una base de datos está "huérfano", lo que significa que ya no existe un login asociado al mismo.
Puede ocurrir que exista un login incluso con el mismo nombre, pero internamente su SID no coincide.







Lo primero que hacemos es verificar cuales usuarios son huérfanos en la base de datos

use [su base de datos]
go
EXEC sp_change_users_login 'Report'
con la opción Report le estamos diciendo que liste los usuarios huérfanos.
Una vez que encontramos los usuarios huérfanos los reparamos con la siguiente sentencia.
EXEC sp_change_users_login 'Auto_Fix', 'user'
Donde user es el nombre del usuario que queremos "reparar".

Ahora bien, si además se quiere crear un nuevo login y password para este usuario, usaremos la siguiente sentencia:

EXEC sp_change_users_login 'Auto_Fix', 'user', 'login', 'password'

Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea


Read More...

SQL Server Best Practices for Developers















SQL Server Best Practices - Hugo Bernachea - Part One
Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...

Máquina virtual para probar las nuevas características de Business Intelligence de SQL Server 2012 (denali)

Microsoft ha puesto a disposición la Base ImageX Server que es una imagen de Máquina virtual para testear las últimas características de Business Intelligence de SQL Server 2012 (denali) - RC0, incluyendo PowerView Reports y PowerPivot Excel Documents.






La máquina la pueden obtener de esta url: http://www.microsoft.com/betaexperience/pd/BIVHD/enus/, para conectarse a la máquina pueden utilizar el usuario CONTOSO\Administrator, con la contraseña pass@word1 (precaución con el idioma de la máquina, está en inglés por lo que es posible que la @ la tengan que introducir con Shift+2).


Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea


Read More...

Configurando una replicación Master a Master usando MySQL

Todos sabemos de la importancia de implementar mecanismos de alta disponibilidad en los servidores que nos toca administrar. En este caso, voy a detallar los pasos para implementar una replicación master to master o bidireccional entre servidores MySQL (una especie de espejado o mirror).

En ambos servers debemos hacer las siguientes tareas:

1. Crear una carpeta Logs, por ejemplo:
c:\program files\mysql\logs\

2. Crear un usuario para la replicación con suficientes permisos.

mysql -u root -pSuPassword (sin espacios el pass y el -p)
GRANT REPLICATION SLAVE ON *.* TO 'usuario'@'%' IDENTIFIED BY 'pepe';
FLUSH PRIVILEGES;

En el master principal

Hay que editar el archivo my.ini (en windows) o my.conf (en linux).
En la sección marcada como
[mysqld] agregar lo siguiente.
log-bin = “D:\MySQL\MySQL Server 5.1\Logs” (cuidado con las comillas)
binlog-do-db=mibase
server-id=1

y agregar al final del archivo lo siguiente:
slave-net-timeout = 30
master-connect-retry = 30

Una vez hecho esto, grabamos y reiniciamos el servicio, ya sea por services o por línea de comandos:
mysqld restart

En el Master secundario:

Lo mismo, cambiar my.ini o my.conf, segun sea Windows o Linux y agregar lo siguiente en la sección: [mysqld]

log-bin = “c:\program files\mysql\logs\” (cuidado con las comillas)
binlog-do-db=winnings
server-id=2 (fijarse que este número es distinto al del master principal)

y al final del archivo agregar:
slave-net-timeout = 30
master-connect-retry = 30

grabar el archivo y reiniciar el servicio mysql

mysqld restart

En el Master principal:

Para evitar problemas vamos a bloquear las tablas hasta que finalicemos la operatoria.

FLUSH TABLES WITH READ LOCK;

En el Master secundario:

Creamos la base a ser replicada:
mysql -u root -pSuPassword

CREATE DATABASE suBase;

mysql -u root -pSuPassword suBase < suBase_backup.sql

En el Master principal:

mysql -u root -pSuPassword

use SuBase
go
SHOW MASTER STATUS;

Esto nos mostrará algo asi
PLAIN TEXT
CODE:
+---------------------+----------+-------------------------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+----------+-------------------------------+------------------+
| mysql-bin.000001 | 21197930 | my_database,my_database | |
+---------------------+----------+----------------------------

Lo que nos interesa a nosotros es el dato del file (mysql-bin.000001) y el número de la posición (21197930) . Con esos datos nos vamos al master secundario.

En el master secundario:
mysql -u root -pSuPassword

stop slave;
CHANGE MASTER TO MASTER_HOST='10.33.0.14', MASTER_USER='usuario', MASTER_PASSWORD='pepe’, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=21197930;
start slave;

Fijense que en los parametros master_log_file y master_log_pos pusimos los datos que guardamos en el paso anterior en el master principal. En master user pusimos el usuario que creamos originalmente para la replicación y en Master_password su correspondiente password.

A continuación ejecutamos lo siguiente para ver como está funcionando la replicación:

Show Slave Status;

A este punto ya tendríamos seteada la replicación desde el master principal al master secundario, pero nos faltaría hacer la inversa, replicación desde el secundario al principal, por lo tanto...
Vamos al Master secundario.
use SuBase
go
SHOW MASTER STATUS;
Lo mismo que antes, tomamos los valores de file y position y los llevamos ahora al master principal.

En el master principal
mysql -u root -pSuPassword

stop slave;
CHANGE MASTER TO MASTER_HOST='10.33.0.13', MASTER_USER='usuarios', MASTER_PASSWORD='pepe’, MASTER_LOG_FILE='Logs.000001', MASTER_LOG_POS=107;
start slave;

Y como habiamos bloqueado las tablas para replicar sin problemas ahora es el momento de desbloquearlas:

unlock tables;

Si se siguieron todos los pasos, en este momento la replicación debería estar funcionando.

Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea















Read More...

Where In usando Variables varchar.


Esta es una cuestión que muchas veces queremos resolver, como hacer un where in contra una variable de tipo varchar.
Obviamente que en reporting services está cuestión se resuelve por si misma, pero el punto es cuando queremos ejecutar sentencias con where in dados por una variable.
Está claro que se puede ejecutar por medio de xml o sql dinámico, pero estas soluciones no están exentas de su complejidad.

La solución propuesta en este caso es la creación de una función que transforma el contenido de una variable de tipo varchar en un resultset de integers.

La función

Create function dbo.SplitToInt(@values varchar(8000), @delimiter varchar(10))
returns @result table (value int)
as
begin
declare @v as varchar(8000);
while charindex(@delimiter,@values) <> 0
begin
set @v = substring(@values,1,charindex(@delimiter,@values)-1);
if isnumeric(@v)=1
insert into @result
values(@v);
set @values = substring(@values,charindex(@delimiter,@values)+1,len(@values))
end
if isnumeric(@values)=1
insert into @result
values(@values);
return;
end

Un ejemplo:

declare @sIds varchar(10)
set @sIds = '1,3,4'
select * from tabla where id in (select * from SplitToInt(@sIds, ','))

Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...

Consejo de Experto, Qing Song Yao recomienda NO usar char o varchar !

Qing Song Yao: Hoy quisiera recomendarles que NO usen los tipos de datos char o varchar para representar strings en su base de datos. Nunca se arrepentirán de haber usado nchar o nvarchar en cualquier implementación.
Por ejemplo, nuestra implementación de Sharepoint usa exclusivamente el tipo de datos nvarchar y nunca hemos tenido problemas relacionados con almacenar caracteres en diferentes lenguajes. Y adicionalmente los tipos unicode (nvarchar y nchar) tienen mejor soporte en .NET, ODBC, JDBC y Windows.

En cambio Varchar y Char solo admiten un rango mas limitado de caracteres y el soporte de herramientas no es tan amplio comparado con los tipos unicode (nvarchar o nchar).

Ah, me dirán que nvarchar ocupa el doble de espacio de almacenamiento si la mayor parte de los datos está dada en alfabetos latinos. Pero en SQL Server 2008 R2 existen la opción de Compresión de Datos a nivel de página, que les permite obtener una compresión a hasta la mitad del tamaño sin por eso tener un impacto significativo a nivel de performance.
De modo que recomiendo usar nvarchar junto a la compresión a nivel de página para lograr ambas cosas: menor espacio en disco y mejor soporte a nivel plataforma.
artículo original: Qing Song Yao
traducido por : Hugo Bernachea

Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...

Como hacer una migración de SQL Server

Esta nota es un resumen de los puntos principales de la Charla de Maxi Accotto en el Edificio de Microsoft Argentina el pasado martes 19 de Abril de 2011. Esta charla trató sobre las estrategias correctas para implementar un plan de migración exitoso de una versión a otra de SQL Server.

1. Razones para migrar:
1.a) Por los nuevos features.
1.b) Por las mejoras a nivel rendimiento.
1.c) Las viejas versiones pierden soporte (sql server 7 y 2000 perdieron soporte oficial)

2. Armar un plan de Migración
2.1) El plan de migración contiene los pasos reproducibles para una migración exitosa.
2.2) Relevar todas las bases de datos a ser migradas/actualizada para detectar bases que tienen versiones no migrables (por ejemplo SQL Server 7 no puede ser migrado directamente a SQL Server 2008)
2.3) El Upgrade Advisor se ejecuta sobre el servidor a ser migrado para indicar problemas e issues: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=f5a6c5e9-4cd9-4e42-a21c-7291e7f0f852&displaylang=en
2.4) El upgrade advisor puede tomar trazas del profiler previamente guardadas para dar un análisis mas certero de cambios y eventuales problemas e incompatibilidades.
2.5) Nunca está de mas leer la documentación oficial de Microsoft acerca de las buenas prácticas (best practices) para migrar servidores SQL : http://www.microsoft.com/downloads/en/details.aspx?FamilyID=66d3e6f5-6902-4fdd-af75-9975aea5bea7&displaylang=en

3. Como realizar la migración:
3.1) In place Upgrade (no recomendada por limitar la posibilidad de rollback).
3.2) Punto a punto.

4. Puntos a garantizar en la migración.
4.1) Parte funcional de la base.
4.2) Performance.

5. Analisis de performance previo.
5.1.) RML Tools. Se toman las trazas de profiler de Replay y se aplican en el destino utilizando las herramientas RML. Las rml tools se descargan desde aquí: para X86 y para 64bits
Estas herramientas tienen además otras utilidades para medir performance.

6. Tareas post migración
6.1) Update statistics
6.2) Eventualmente recrear via script todos los índices clustered.
6.3) Transferir los logins por el famoso problema del sid que dejaría huérfanos los users de base de datos en el destino. Existen dos proc que generan el script de migración: Aquí el mismo Microsoft lo explica y dá el código fuente: http://support.microsoft.com/kb/246133. Maxi Accotto modificó este script para que además transfiera los roles y pueden encontrar ese script en el blog de Maxi Accotto aquí: http://blog.maxiaccotto.com/post/2009/10/04/Pasando-Logins-entre-servidores-SQL.aspx
7. Objetos a Migrar y orden de migración
7.1. operadores
7.2. Restauran bases
7.3. Logins.
7.4. Jobs

8. Plan de Rollback por si las cosas no salen bien.

9. Estabilizar la plataforma.
9.1. Darle un tiempo a la plataforma antes de empezar a aplicar los new features de la versión

Esto es solo un resumén de puntos sobre los que pueden trabajar para armar un plan de migración para servidores SQL Server.

Hugo Bernachea (oido en la charla de Max Accotto)
http://www.linkedin.com/in/bernachea


Otras fuentes de referencia:
http://blog.maxiaccotto.com/
http://www.microsoft.com/sql
http://www.sqlservercentral.com/articles/Upgrade/65872/

Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...