none
Ayuda con analisis de Plan de ejecucion RRS feed

  • Pregunta

  • Holas, que hay…

    Tengo una tabla como 500mil registros “ejemplo”, en esta tabla hay unos foreign key UsuarioId, Categoria1Id, Categoria2Id, TipoId. Yo hago una consulta… SELECT * FROM miTabla WHERE UsuarioId = @usuarioId AND Categoria1Id = @ Categoria1Id AND Categoria2Id = @ Categoria2Id TipoId = @ TipoId Logicamente lo ideal es que primero se obtenga el registro del usuario y luego se analicen las coincidencias de las categorias “cuando hablo de logicamente, me refiero a lo que haria una persona sin pc ni sistema ni nada”. De estar yo en lo cierto, el plan de ejecución que crea Sql Server hace esto, hace algo mejor o como haría? En tal caso que no haga algo mejor tengo entendido que yo podría indicarle como hacer la búsqueda. Me pueden medio orientar aquí en esto… No pretendo ser un experto aun pero al menos la idea básica.

    Gracias.

    lunes, 14 de marzo de 2011 19:35

Respuestas

  • Hola.

    ¿Y qué plan de ejecución se usa?

    El plan que se elabora depende de muchos factores, como las estadísticas, los índices existentes, la cardinalidad de los mismos, si existe algún plan ya cacheado, etc. Con todo esto, en ocasiones no se usa el plan más adecuado (o el que uno considera más adecuado) y hay que forzar un poco las cosas, pero así de entrada, lo normal es que todo ocurra dentro de lo "lógico", como tú indicas.

    Así, si tienes un índice por el campo UsuarioID y su selectividad es alta, lo normal es que se emplee para la resolución de la consulta. 

    Recordarte también que las foreign key no son índices, salvo que tú expresamente los crees.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    lunes, 14 de marzo de 2011 20:25
    Moderador
  •  Puedes usar una expresión de tabla común (CTE), Una CTE es similar a una tabla temporal en que no se almacena como un objeto y dura sólo el tiempo que dura la consulta. Una CTE está formada por un nombre de expresión que representa la CTE, una lista de columnas opcional y una consulta que define la CTE. Después de definir una CTE, se puede hacer referencia a ella como una tabla o vista en una instrucción SELECT, INSERT, UPDATE o DELETE.

    Te dejo unos link, revisa los ejemplos, para que te den una idea:

    http://technet.microsoft.com/es-es/library/ms175972.aspx

    http://msdn.microsoft.com/en-us/library/ms175972.aspx

     

     Ten presente el comentario de Alberto, sobre los indices.

     


     Norman M. Pardell 

    ||Microsoft Certified IT Professional|| Database Administrator. Database Developer. SQL Server 2008

    lunes, 14 de marzo de 2011 20:38

Todas las respuestas

  • Hola.

    ¿Y qué plan de ejecución se usa?

    El plan que se elabora depende de muchos factores, como las estadísticas, los índices existentes, la cardinalidad de los mismos, si existe algún plan ya cacheado, etc. Con todo esto, en ocasiones no se usa el plan más adecuado (o el que uno considera más adecuado) y hay que forzar un poco las cosas, pero así de entrada, lo normal es que todo ocurra dentro de lo "lógico", como tú indicas.

    Así, si tienes un índice por el campo UsuarioID y su selectividad es alta, lo normal es que se emplee para la resolución de la consulta. 

    Recordarte también que las foreign key no son índices, salvo que tú expresamente los crees.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    lunes, 14 de marzo de 2011 20:25
    Moderador
  •  Puedes usar una expresión de tabla común (CTE), Una CTE es similar a una tabla temporal en que no se almacena como un objeto y dura sólo el tiempo que dura la consulta. Una CTE está formada por un nombre de expresión que representa la CTE, una lista de columnas opcional y una consulta que define la CTE. Después de definir una CTE, se puede hacer referencia a ella como una tabla o vista en una instrucción SELECT, INSERT, UPDATE o DELETE.

    Te dejo unos link, revisa los ejemplos, para que te den una idea:

    http://technet.microsoft.com/es-es/library/ms175972.aspx

    http://msdn.microsoft.com/en-us/library/ms175972.aspx

     

     Ten presente el comentario de Alberto, sobre los indices.

     


     Norman M. Pardell 

    ||Microsoft Certified IT Professional|| Database Administrator. Database Developer. SQL Server 2008

    lunes, 14 de marzo de 2011 20:38