Blog Maxi Accotto

Blog , cursos, coaching y Consultoria en SQL Server

 

 

 

Como determinar cuales files y DB son las que consumen mas I/O para detectar problemas de performance

En nuestro motor de base de datos contamos con varias database, cada una de ellas o alguno de sus files pueden estar alojadas en 1 o mas discos.

Ahora bien, el consumo de I/O es uno de los problemas mas frecuentes en performance, es un recurso mecánico y mucho mas lento que cualquier otro componente de nuestro equipo (Memoria y CPU).

Los problemas de I/O por lo general se dan por falta de índices o querys mas escritas, si siempre me traiga todos los registros para mostrar unos pocos estaré haciendo un consumo de I/O mucho mas grande de lo que debería.

Para poder medir como se esta comportando mi I/O podemos utilizar los contadores de Windows (por ejemplo el IDLE del disco físico que queremos medir).

Ahora bien, como podemos detectar cual base de datos y/o file de nuestro SQL son los que mas I/O consumen? para ello podemos utilizar una función llamada fn_virtualfilestats la cual se encuentra disponible en la versión 2000 , 2005 y 2008 de SQL Server.

Esta función básicamente nos retornada el listado de files y el consumo de I/O de cada una.

Aquí abajo les dejo un simple query el cual evalúa los I/O y el porcentaje sobre el total para poder detectar cuales files son los que mas consumen mi I/O

DECLARE @TOTAL_IO INT
DECLARE @TOTAL_BYTES INT
DECLARE @TOTAL_STALL INT

SELECT
                        @TOTAL_IO    = SUM(NUMBERREADS + NUMBERWRITES),
                        @TOTAL_BYTES = SUM(BYTESREAD + BYTESWRITTEN),
                        @TOTAL_STALL = SUM(IOSTALLMS) 
FROM   ::FN_VIRTUALFILESTATS(NULL, NULL)
 
SELECT  
                    [DBNAME] = DB_NAME(FN.[DBID]),       
                    [FILENAME],  
                    [NUMBERREADS], 
                    [NUMBERWRITES],  
                    [BYTESREAD], 
                    [BYTESWRITTEN],
                    [IOSTALLMS],            
                    [TOTALIO] = CAST((NUMBERREADS + NUMBERWRITES) AS BIGINT), 
                    [TOTALBYTES] = (BYTESREAD + BYTESWRITTEN), 
                    [AVGSTALLPERIO] = (1.0 * [IOSTALLMS] / ([NUMBERREADS] + [NUMBERWRITES] + 1)), 
                    [AVGBYTESPERIO] = (1.0 * (BYTESREAD + BYTESWRITTEN) / (NUMBERREADS + NUMBERWRITES + 1)), 
                    [%IO] = (100.0 * (NUMBERREADS + NUMBERWRITES) / @TOTAL_IO), 
                    [%BYTES] = (100.0 * (BYTESREAD + BYTESWRITTEN) / @TOTAL_BYTES),  
                    [%STALL] = (100.0 * IOSTALLMS / @TOTAL_STALL) 
             
    FROM ::FN_VIRTUALFILESTATS(NULL, NULL) AS Fn    INNER JOIN SYSALTFILES F 
    ON Fn.FileId  = F.fileid AND Fn.DbId = F.dbid 
    ORDER BY [%IO] DESC 

 

 

Currently rated 5.0 by 3 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Posted by maccotto on Wednesday, March 25, 2009 10:54 PM
Permalink | Comments (11) | Post RSSRSS comment feed

Novedades en SQL 2008: Cambios en TSQL

SQL Server 2008 incorpora bastantes cambios, en esta ocasión veremos algunos referenciados a TSQL.

 

Declaración , inicialización e incremento de variables

Un cambio es el manejo de variables a nivel TSQL, ahora se asemeja cada día mas a lo que los desarrolladores estamos acostumbrados.

 

DECLARE @VAR INT = 4
SELECT @VAR
SET @VAR +=1 -- INCREMENTOS
SELECT @VAR     
 

Modificación de la sentencia INSERT

En versiones anteriores a 2008 si queríamos insertar mas de un registro debíamos usar tantos insert como registros necesitamos o bien insert en conjunto con Select.

Ahora además de esto, la sentencia insert nos permite en una sola instrucción insertar mas de un valor como se muestra a continuación

CREATE TABLE #T1 (ID INT)
GO
INSERT INTO #T1 VALUES (1),(2),(3),(4)
GO
SELECT * FROM #T1

 

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Posted by maccotto on Tuesday, March 24, 2009 6:10 AM
Permalink | Comments (12) | Post RSSRSS comment feed

Como traer registros de forma aleatoria

En algunas ocasiones necesitamos traer de forma aleatoria registros, aquí les dejo dos métodos para hacerlo. El primero es compatible desde SQL 2000 a 2008 y el segundo solo con 2005 y 2008 ya que la función TableSample se encuentra en dichas versiones

   1:  USE AdventureWorks 
   2:  GO
   3:   
   4:      SELECT TOP 10 *
   5:      FROM Production.Product  
   6:      ORDER BY NEWID()
   7:      
   8:   
   9:  SELECT  TOP(10) * 
  10:  FROM
  11:  (
  12:   SELECT * FROM Production.Product TABLESAMPLE SYSTEM(25 PERCENT)
  13:   
  14:   ) AS TABLA

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Categories: How To
Posted by maccotto on Tuesday, March 24, 2009 2:47 AM
Permalink | Comments (2) | Post RSSRSS comment feed

Mi sistema realmente funciona en SQL 2005 / 2008

En muchas ocasiones me encuentro en distintas empresas que tienen su SQL Server 2005 o 2008 y me dicen que sus sistemas son compatibles con estas versiones de SQL ya que esta corriendo sus bases sobre el.

Pero en una gran parte de estos casos la cosa no es tan así como indican, que una base este sobre SQL Server 2005 o 2008 no quiere decir que sea compatible y este usando el poder de estos motores.

Como es esto? simple: se puede tener una base de datos con compatibilidad hacia atrás, o sea puedo tener una base de datos en un 2005 con compatibilidad 80 lo cual significa que la base es un 2000 no usando las features de 2005, en otras palabra no es compatible con 2005

Para lo cual es muy importante saber la compatibilidad de nuestras bases de datos, si es menor que 90 nos indica que no es ni 2005 ni 2008 compatible.

En el siguiente listado les muestro los distintos modos de compatibilidad y a que versión corresponden

Compatibilidad Versión de SQL
65 6.5
70 7.0
80 2000
90 2005
100 2008

Ahora bien, como saber en nuestro SQL que bases de datos no están siendo compatibles con la versión por mas que estén sobre ella ya que tienen una compatibilidad inferior.

La opción mas simple es ir al Management Studio o al Enterprise Manager y ver las opciones de cada base de datos en la sección options y la propiedad “Compatibility Level”

image

 

También podemos hacer esto por medio de un simple query donde nos indicara que bases de datos no están en el modo de compatibilidad adecuado, para ello yo utilizo el siguiente código

 

   1:  declare @modo smallint
   2:   
   3:  select @modo =
   4:  convert(smallint,replace(CONVERT(varchar(2),
   5:  SERVERPROPERTY('Productversion')),'.','')) * 10
   6:   
   7:  select name,cmptlevel from master..sysdatabases
   8:  where cmptlevel < @modo
 
 
 

 

 

   
  

Currently rated 5.0 by 2 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Posted by maccotto on Tuesday, March 24, 2009 1:37 AM
Permalink | Comments (5) | Post RSSRSS comment feed

Webcast de BI

En el día de ayer se han publicado una serie de webcast sobre BI en 2008, el material esta en ingles pero les recomiendo una miradita smile_regular

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Categories: Material
Posted by maccotto on Tuesday, March 24, 2009 12:32 AM
Permalink | Comments (8) | Post RSSRSS comment feed

Nuevo Blog

Hola gente, estoy mudándome a este nuevo sitio donde a partir de ahora será el lugar donde expondré los temas relacionados con SQL Server.

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Posted by maccotto on Tuesday, March 24, 2009 12:18 AM
Permalink | Comments (1) | Post RSSRSS comment feed