none
IN (Lista) más rápido que IN (SELECT Campo FROM Tabla). RRS feed

  • Pregunta

  • Hola,

        tengo una tabla que tiene 591 filas y una vista, con aproximadamente 2 millones de filas. La vista la debo filtrar por los registros que están en la tabla. He probado con un INNER JOIN, un IN (SELECT Campo FROM Tabla), EXISTS y ninguno de ellos es tan rápido como hacer una lista (copiando los valores) de todos las filas de la tabla y hacer un IN (valor1, valor2, etc.).

        Comparando los planes de ejecución, en el rápido (0 segundos para un resultado de 584 filas) veo que la cantidad de registros que va leyendo se mantiene en 591 hasta aplicar el filtro final, mientras que en los lentos va "leyendo" el total de registros de la vista. 

        Aclaro que la tabla de 591 registros tiene un índice por el campo.

        La pregunta es, hay alguna forma que me estoy dejando en el tintero para obtener la misma performance?

        Muchas gracias desde ya.

    Mauricio

    martes, 11 de julio de 2017 15:29

Respuestas

  • Coincido con AMB, muy difícil darte una respuesta.

    Aún así, me parece normal que tarde menos en evaluar unas constantes, que en obtener esos valores a través de un select. Se me ocurre que lleves esa lista a una variable tipo tabla o a una tabla temporal y que la uses como join, como exist o como in. Si es una variable tipo tabla solo podrás definirle clave primaria, pero me parece que para tu caso es suficiente. 


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Propuesto como respuesta Joyce_ACModerator miércoles, 12 de julio de 2017 14:38
    • Marcado como respuesta Moderador M martes, 25 de julio de 2017 15:47
    miércoles, 12 de julio de 2017 7:20
    Moderador

Todas las respuestas

  • Dificil dar alguna sugerencia sin saber la estructura de las tablas, incluyendo indices y restricciones.  Tambien seria de mucha ayuda tener acceso al los planes de ejecucion (archivo .sqlplan).


    AMB

    Some guidelines for posting questions...

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

    martes, 11 de julio de 2017 19:03
  • Coincido con AMB, muy difícil darte una respuesta.

    Aún así, me parece normal que tarde menos en evaluar unas constantes, que en obtener esos valores a través de un select. Se me ocurre que lleves esa lista a una variable tipo tabla o a una tabla temporal y que la uses como join, como exist o como in. Si es una variable tipo tabla solo podrás definirle clave primaria, pero me parece que para tu caso es suficiente. 


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Propuesto como respuesta Joyce_ACModerator miércoles, 12 de julio de 2017 14:38
    • Marcado como respuesta Moderador M martes, 25 de julio de 2017 15:47
    miércoles, 12 de julio de 2017 7:20
    Moderador
  • La lista está en una tabla temporal y el INNER JOIN con esa también tarda lo mismo. Comparando ambos planes de ejecución, en el veloz hay un Index seek y el flujo de datos es pequeño. En el lento hay un index scan y parece que recién al final del plan, hace el filtro. Probé cambiando el orden del FROM, de la tabla pequeña enlazada a la vista, de la vista enlazada a la tabla, siempre el mismo resultado (al menos en tiempo). He probado con índices clustered, non clustered, con Forceseek, no hay caso.
    jueves, 13 de julio de 2017 15:13