none
Consulta Sobre Indice RRS feed

  • Pregunta

  • Estimados.

    Tenia una consulta que en su plan de ejecución me daba Hash Match, el plan de ejecución estimado no me daba ningún indice recomendado a crear. Finalmemnte cree un índice y ahora el Hash bajo de 66% a 335 lo bueno que la consulta ahora no demora ni 1 segundo.

    A raiz de esto tengo una consulta:

    Supongamos que tengo la siguiente query

    Select A.Fono,A.IdCiudad,B.Ciudad

    From A Inner Join B

    On A.IdA=b.IdA

    Hago indice de la tabla A por IdA y en B por IdA

    En mi caso ademas tuve que inlcuir indice por A.Fono y por A.IdCiudad y recien ahi me bajo el HASH, porque motivo debo hacer indices por las columnas del Select si el cruce lo hago por IdA, la literatura es medio enredada para explicar.

    Saludos Cordiales.


    DBA SQL Server Santiago/Chile

    lunes, 14 de agosto de 2017 21:42

Respuestas

  • Entiendo que cover index es cuando utilizo el include, pero este no fue el caso.

    Indice que cubre todas las columnas referenciadas en el query (Covering Index) es aquel indice que incluye en su clave y/o nodos hojas la data asociada a todas las columnas referenciadas en el query.

    No se como creastes el indice o indices, pero el beneficio de indice que cubre esta en que casi siempre la tabla (heap o b-tree) suele tener mas columnas por lo que el indice es mas estrecho y por ende cabran mas filas en las paginas. Otro beneficio es que al incorporar todas las columnas referenciadas en el query pues no habra falta de ir al indice clustered o a la tabla (heap) para traer la data de esas otras columnas referenciadas.

    En tu caso, un indice en tabla A por (IdA) que incluya (Fono, IdCiudad) pues beneficiaria la union (JOIN) y ademas cubriria el resto de columnas referenciadas de la tabla A.  Lo mismo si creas uno con clave (IdA, Fono, IdCiudad) pero habria que analizar si de verdad incluyendo las columnas Fono y IdCiudad como parte de la clave seria de algun beneficio.

    Como bien dijo Enrique, sin saber nada de las tablas, indices y los planes de ejecucion pues no tendremos mucho que aportar.

    Ejemplo:

    T(col1, col2, col3)

    Indices cubiertos:

    (col1, col2, col3)
    (col1) include (col2, col3)
    (col1, col2) include (col3)


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Marcado como respuesta Moderador M miércoles, 23 de agosto de 2017 17:36
    martes, 15 de agosto de 2017 12:39

Todas las respuestas

  • Saludos Christian,

    Necesitamos más información el problema es que en ocasiones SQL puede evaluar no usar un índice cuando un hash map es mejor (muy pocos matchs) o tienes muy pocos datos a evaluar, sin conocer más detalles de tu data es un poco dificil decirte porque el comportamiento que estas teniendo.

    lunes, 14 de agosto de 2017 23:21
  • Hola Enrique.

    Te cuento, sin el indice el hash ocupaba e6 66% del costo, y demoraba 2 minutos.

    Luego del indice el hash bajo a unos 33% y ahora demora menos de 1 segundo.

    Pero quería entender un poco lo que traté de exponer, aparte de crear indice por las columnas de JOIN tuve que agregar algunas columnas del SELECT


    DBA SQL Server Santiago/Chile

    lunes, 14 de agosto de 2017 23:43
  • Lo que hiciste se llama cover index pero como te menciono sin saber mas me es dificil poder ayudarte porque no se, necesitaría el plan de ejecución haz intentado usar el play explorer de Sentry One?
    lunes, 14 de agosto de 2017 23:59
  • Entiendo que cover index es cuando utilizo el include, pero este no fue el caso.

    Chequeare el play explorer, se ve muy interesante y es gratuito por lo que vi no ?

    Saludos y Gracias como siempre.


    DBA SQL Server Santiago/Chile

    martes, 15 de agosto de 2017 0:35
  • Entiendo que cover index es cuando utilizo el include, pero este no fue el caso.

    Indice que cubre todas las columnas referenciadas en el query (Covering Index) es aquel indice que incluye en su clave y/o nodos hojas la data asociada a todas las columnas referenciadas en el query.

    No se como creastes el indice o indices, pero el beneficio de indice que cubre esta en que casi siempre la tabla (heap o b-tree) suele tener mas columnas por lo que el indice es mas estrecho y por ende cabran mas filas en las paginas. Otro beneficio es que al incorporar todas las columnas referenciadas en el query pues no habra falta de ir al indice clustered o a la tabla (heap) para traer la data de esas otras columnas referenciadas.

    En tu caso, un indice en tabla A por (IdA) que incluya (Fono, IdCiudad) pues beneficiaria la union (JOIN) y ademas cubriria el resto de columnas referenciadas de la tabla A.  Lo mismo si creas uno con clave (IdA, Fono, IdCiudad) pero habria que analizar si de verdad incluyendo las columnas Fono y IdCiudad como parte de la clave seria de algun beneficio.

    Como bien dijo Enrique, sin saber nada de las tablas, indices y los planes de ejecucion pues no tendremos mucho que aportar.

    Ejemplo:

    T(col1, col2, col3)

    Indices cubiertos:

    (col1, col2, col3)
    (col1) include (col2, col3)
    (col1, col2) include (col3)


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Marcado como respuesta Moderador M miércoles, 23 de agosto de 2017 17:36
    martes, 15 de agosto de 2017 12:39