SQL Server, ideas y experiencias

Los índices y las condiciones de búsqueda

por Jose Mariano Alvarez 24. febrero 2009

Para poder entender lo que hace de SQL Server antes de aplicar cualquier tipo de índice en una consulta tenemos que entender que el SQL Server tiene que determinar si un determinado índice es útil o no. Este articulo trata de mostrar como un predicado mal escrito impide el uso de accesos puntuales mediante INDEX SEEK.

Para entender esto vamos a simplificar las cosas y comenzar con una consulta trivial.

SELECT <Columnas devueltas>
FROM   <Tabla>
WHERE  <Condición>

Está simple consulta, que utiliza una sola tabla, precisa de las “columnas devueltas” y de las columnas utilizadas en la condición para verificar si la cumplen. Por el momento consideraremos condiciones simples sin subconsultas.

El punto crítico aquí es la condición, ya que es esta la que limita la cantidad de filas devueltas y por lo tanto la posibilidad de hacer un acceso puntual (SEEK) mediante índices o una exploración (SCAN) ya sea de índices o de tabla dependiendo de las columnas involucradas. El problema radica en que el SQL Server debe determinar conociendo información estadística de los datos de las columnas involucradas en la condición, la estructura de los índices disponibles y la forma en que está escrita la condición si el uso de un índice mediante acceso puntual (SEEK) es adecuado o es preferible una exploración (SCAN).

Vamos a ignorar por el momento las columnas devueltas y el tipo de índice (que dejaremos para otros artículos ) a efectos de simplificar el análisis y entender la idea de los argumentos de búsqueda,. Simplemente nos vamos a concentrar en como un predicado de búsqueda mal expresado puede impedir el uso de los índices mediante un SEEK.

Veamos un ejemplo usando AdventureWorks:

USE AdventureWorks
GO

SELECT * 
FROM Sales.SalesOrderHeader 
WHERE customerid = 117

 

IndexSeek

Aquí vemos como el predicado de búsqueda permite determinar facilmente que el acceso puntual por índice es útil. Puede verse el Index Seek. Esto ocurre porque el predicado customerid = 117 es un buen argumento de búsqueda y por lo tanto dado que tiene información estadística puede determinar que le conviene usar el índice porque determina que devuelve un porcentaje muy bajo de filas en proporción a las que tiene la tabla.

Qué ocurre si cambiamos el argumento de búsqueda:

SELECT * 
FROM Sales.SalesOrderHeader 
WHERE customerid + 1 = 118

 

IndexScan

En este caso el resultado es el mismo, en cuanto a filas devueltas, ya que ambos predicados son equivalentes, pero la condición customerid + 1 = 118 no permite el acceso puntual mediante SEEK y debe hacer un INDEX SCAN.

Si analizamos un poco ambas condiciones vemos que la segunda condición por igualdad esta aplicada al resultado de una operación suma y no a una columna por lo que no le es posible al motor del SQL Server hacer una búsqueda puntual porque lo que está en el índice no es el resultado de la suma sino el customerid. Por lo tanto no le queda más remedio que revisar fila por fila para determinar si se cumple la condición de igualdad.

Para verlo más claramente es muy parecido a si buscamos a todas las Daniela de la guía telefónica. Dado que esta ordenada por apellido y luego por nombre no es posible hacer un acceso puntual a las páginas donde se encuentran y es necesario revisar todas las páginas de la guía verificando abonado telefónico por abonado telefónico si se cumple la condición. Esto mismo ocurriría aunque hubiera solo 10 personas con nombre Daniela.

Conclusión

Si no escribimos las condiciones de nuestras consultas de manera adecuada nunca podrá usar los índices para realizar accesos puntuales (INDEX SEEK). En líneas generales las condiciones requieren de un predicado del tipo columna <operador> <expresión>, donde no todos los operadores cumplen con esta condición.

Tags: , ,

Artículos

Se viene el WINDOWS DAY (3 de marzo del 2009)

por Jose Mariano Alvarez 20. febrero 2009

Microsoft Latinoamérica y España anuncian la realización, el próximo 03 de marzo, del Windows Day. Será un evento ONLINE con charlas y demostraciones técnicas de alto nivel, y sesiones de chat en vivo con especialistas.

image

Entre las muchas novedades tenemos:

  • Las tecnologías de implementación
  • Administración
  • Desarrollo de aplicaciones en desktops con Windows Vista y con Windows 7:
  • Cómo mejorar el rendimiento,
  • Cuándo virtualizar,
  • Cómo optimizar los escritorios,
  • Incrementar la seguridad,
  • Resolver el acceso a datos
  • Cómo crear las mejores interfaces de usuario.
  • Novedades que llegan con el SP2 de Windows Vista
  • Lo que se viene con Windows 7 y ASP.NET 4.0.

Para registrarse tienen que ir al Sitio del evento

También está el blog del evento, para que todos puedan adelantar consultas que habrán de enriquecer las sesiones de chat en vivo, tanto las dos en español, como la que tendremos en exclusiva –en inglés- con Mark Russinovich.

Ya les voy a ir informando de más novedades.

Tags: ,

Eventos y conferencias

Actualización de los libros en pantalla del SQL Server 2008 (Enero 2009)

por Jose Mariano Alvarez 19. febrero 2009
El 30 de enero Microsoft libero una actualización de los libros en pantalla o BOL (Books On Line).del SQL Server 2008.

La actualización se encuentra en el siguiente enlace.
 
 
 
 

Tags: ,

Actualizaciones

La base de conocimiento cambia de lugar

por Jose Mariano Alvarez 19. febrero 2009

La base de conocimiento de IT pros y desarrolladores que se encuentra en http://support.microsoft.com va a ser migrada a los sitios de TECHNET y MSDN. Pueden ver los detalles en el siguiente enlace:

Knowledge Base articles move to TechNet and MSDN

Aquellos que trabajamos a diario con el SQL Server no sabemos si los artículos van a estar en ambos sitios o van a seleccionar que articulo va a cada uno. Dado que los libros en pantalla ya se encuentran en ambos sitios, creo que veremos la información en los dos.

Tags: ,

Novedades

Nueva versión del script “Who is Active”

por Jose Mariano Alvarez 18. febrero 2009

Es un script basado en las DMV para seguimiento de los procesos activos.

Está diseñado para mostrar de un vistazo qué procesos están activos en su SQL Server y lo que hacen. También tiene un número de características opcionales para que pueda obtener resultados rápidamente, o monitorear detalladamente quién está activo.

Pueden encontrar más información en el sitio del autor y descargar el script.

 Who is Active? v7.30

Tags: , ,

Novedades

SQL Server 2005 Cumulative Update Febrero 2009

por Jose Mariano Alvarez 18. febrero 2009

Microsoft ha publicado el Cumulative Update 2 for SQL Server 2005 Service Pack 3 Build 4211 (CU2SP3) y el Cumulative Update 12 for SQL Server 2005 SP2 Build 3315 (CU12SP2).

Mi recomendación es que si el equipo tiene el SQL Server 2005 Service Pack 3 (SP2) y es necesario instalar la actualización, yo los prefiero instalar el SQL Server 2005 Service Pack 3 (SP3) y luego el CU2SP3 antes que instalar el CU12SP2.

Tags: ,

Actualizaciones

Guía de rendimiento de carga de datos en el SQL Server

por Jose Mariano Alvarez 18. febrero 2009

Se aplica a:

  • SQL Server 2005
  • SQL Server 2008

Recientemente fue publicado en el sitio de Microsoft este artículo técnico que describe las técnicas de carga de grandes conjuntos de datos (BULK LOAD) en el SQL Server. Abarca tanto las técnicas disponibles como las metodologías para mejorar el rendimiento y optimizar el proceso de carga masiva.

Este documento describe la forma en que estos métodos se pueden utilizar para resolver distintos escenarios comunes como por ejemplo el cargar y leer datos en una tabla al mismo tiempo, usar Integration services y otras tecnologías, etcétera. También hay scripts de ejemplo que ilustran estas soluciones usando patrones de diseño comunes y enlaces a más información.

Se puede encontrar en el siguiente enlace:

The Data Loading Performance Guide

Tags: , , , ,

Novedades

Powered by SQL Total Consulting


View Jose Mariano Alvarez's profile on LinkedIn

 Add to Technorati Favorites 

Calendar

<<  diciembre 2014  >>
lumamijuvido
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

View posts in large calendar

Locations of visitors to this page

Widget Twitter not found.

Root element is missing.X


Valid XHTML 1.0 Transitional

Valid CSS!