none
Una consulta sobre Indices Clusterizados RRS feed

  • Pregunta

  • Hola,

    Investigando en la red he leido sobre la aplicación y ventajas de los índices de tipo cluster y me viene la siguiente duda:

    ¿SQL realiza siempre búsquedas y procedimientos secuenciales cuando lleva a cabo procedimientos con un order by "campo indexado con cluster" sobre una tabla? Me ha parecido entender que así era. ¿podeis comentarme algo sobre ello?

    Gracias

    Angel

    lunes, 18 de mayo de 2015 6:31

Respuestas

  • En teoría, el optimizador de consultas puede utilizar cualquier plan que a su juicio resulte óptimo. Aunque la tabla esté almacenada en un índice clustered y hagas un order by ese campo, podría ser que fuera más eficiente el acceder por otro índice si el otro índice es capaz de cubrir la consulta (tiene todos los campos de la select) y ello requiere acceder a menos páginas gracias a que el índice secundario es más compacto que el clustered. También podría ser que el Where de la consulta reduzca significativamente el número de registros, y sea más eficiente buscarlos sobre un índice secundario en lugar del clustered, incluso aunque ello requiera una ordenación posterior y una búsqueda sobre el índice clustered para localizar el resto de los campos, si el índice secundario no cubría la consulta. Así que no está garantizado que siempre se use el índice clustered. Incluso aunque en la práctica te encuentres que sí que ciertas consultas se ejecutan con un barrido del índice clustered, no habría garantías de que con futuras actualizaciones o service packs no vaya a cambiar el plan de ejecución.

    • Marcado como respuesta Angeleci lunes, 18 de mayo de 2015 9:39
    lunes, 18 de mayo de 2015 9:35
  • ¿ no es posible desactivar el optimizador de consultas en SQL para una consulta concreta y forzar de esta forma a que se haga de forma [...]

    Hay dos formas de conseguirlo. La primera consiste en añadir un "query hint" en la consulta:

    https://msdn.microsoft.com/en-us/library/ms187373.aspx

    Por ejemplo:

    SELECT loQueSea FROM miTabla WITH (FORCESEEK, INDEX (elIndice))

    La alternativa es crear y utilizar una guía de plan ("plan guide"):

    https://msdn.microsoft.com/en-us/library/ms190417.aspx

    Normalmente es preferible dejar que el optimizador de consultas haga su trabajo. Los Hints y plan guides deberían reservarse para casos específicos y muy peculiares.

    • Marcado como respuesta Angeleci viernes, 29 de mayo de 2015 9:03
    lunes, 18 de mayo de 2015 13:10

Todas las respuestas

  • En teoría, el optimizador de consultas puede utilizar cualquier plan que a su juicio resulte óptimo. Aunque la tabla esté almacenada en un índice clustered y hagas un order by ese campo, podría ser que fuera más eficiente el acceder por otro índice si el otro índice es capaz de cubrir la consulta (tiene todos los campos de la select) y ello requiere acceder a menos páginas gracias a que el índice secundario es más compacto que el clustered. También podría ser que el Where de la consulta reduzca significativamente el número de registros, y sea más eficiente buscarlos sobre un índice secundario en lugar del clustered, incluso aunque ello requiera una ordenación posterior y una búsqueda sobre el índice clustered para localizar el resto de los campos, si el índice secundario no cubría la consulta. Así que no está garantizado que siempre se use el índice clustered. Incluso aunque en la práctica te encuentres que sí que ciertas consultas se ejecutan con un barrido del índice clustered, no habría garantías de que con futuras actualizaciones o service packs no vaya a cambiar el plan de ejecución.

    • Marcado como respuesta Angeleci lunes, 18 de mayo de 2015 9:39
    lunes, 18 de mayo de 2015 9:35
  • Muchas gracias Alberto.
    lunes, 18 de mayo de 2015 9:39
  • Una pregunta,

    ¿ no es posible desactivar el optimizador de consultas en SQL para una consulta concreta y forzar de esta forma a que se haga de forma correlativa según un campo índice fijado ?

    Gracias

    lunes, 18 de mayo de 2015 11:10
  • ¿ no es posible desactivar el optimizador de consultas en SQL para una consulta concreta y forzar de esta forma a que se haga de forma [...]

    Hay dos formas de conseguirlo. La primera consiste en añadir un "query hint" en la consulta:

    https://msdn.microsoft.com/en-us/library/ms187373.aspx

    Por ejemplo:

    SELECT loQueSea FROM miTabla WITH (FORCESEEK, INDEX (elIndice))

    La alternativa es crear y utilizar una guía de plan ("plan guide"):

    https://msdn.microsoft.com/en-us/library/ms190417.aspx

    Normalmente es preferible dejar que el optimizador de consultas haga su trabajo. Los Hints y plan guides deberían reservarse para casos específicos y muy peculiares.

    • Marcado como respuesta Angeleci viernes, 29 de mayo de 2015 9:03
    lunes, 18 de mayo de 2015 13:10