none
Que es mejor hacer en esta consulta RRS feed

  • Pregunta

  • Quisiera saber que es mejor y por que, es algo que he batallado en comprender.

    Por un lado:

    select ta.tipo_atencion as 'tipo_atencion'
    from tipo_atencion ta
    where ta.id_atenciion = (select app.id_atencion from Appointments app where app.id_cita = @id_cita)

    o es mejor esta opcion?

    select distinct ta.tipo_atencion as 'tipo_atencion'
    from tipo_atencion ta, Appointments app
    where app.id_cita = @id_cita

    and ta.id_atenciion = app.id_atencion

    cuando seria mejor usar una subconsulta?


    Si mi respuesta fue útil ayudame marcándola como correcta.

    miércoles, 5 de agosto de 2015 17:15

Respuestas

  • La opción depende de varias cosas indices, estadísticas, relaciones entre las tablas, orden de los parámetros de búsqueda (que coincidan con un indice).

    Lo mejor es siempre revisar el plan de ejecución, esto te ayuda a optimizar las consultas por que ves lo que realmente SQL esta haciendo (que indices toma, como divide las subconsultas, quien se tarda, etc).

    Y es mas el mismo plan de ejecución te hace recomendaciones para mejorar el desempeño de la consulta (me falta x indice o x estadística), claro ten en mente tu modelo para hacer caso a esto y evitar crear objetos no necesarios


    Ing. Carlos Monroy MCP, MCAD, MCSD, MCTS

    miércoles, 5 de agosto de 2015 17:38

Todas las respuestas

  • Mas allá de cual es mejor opción para hacer una consulta valida siempre el plan de ejecución de la misma, redgate tiene un libro muy interesante para validar planes de ejecución download.red-gate.com/ebooks/SQL/sql-server-execution-plans.pdf

    ahora la que es mejor opcion para mi es

    select ta.tipo_atencion from tipo_atencion

    inner join Appointments on (tipo_atencion.id_atencion = Appointmen.id_atencion)

    where app.id_cita = @id_cita

    esto por que la lógica negada (diferente de... not in) son siempre operaciones mas costosas

    Saludos


    Ing. Carlos Monroy MCP, MCAD, MCSD, MCTS

    miércoles, 5 de agosto de 2015 17:28
  • hola

    una subconlta simpre es mas costosa de ejecutar, es mas puedes validarlo si desde el managemetn studio del sql server habilitas el plan de ejecucion

    la segunda opcion tampoco es recomendada, aunque es mejor que una subconsulta

    yo diria que uses el INNER JOIN

    select distinct ta.tipo_atencion as 'tipo_atencion'
    from tipo_atencion ta INNER JOIN Appointments app ON ta.id_atenciion = app.id_atencion
    where app.id_cita = @id_cita


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 5 de agosto de 2015 17:32
  • No existe entonces una opcion que de mejor performance?

    Si mi respuesta fue útil ayudame marcándola como correcta.

    miércoles, 5 de agosto de 2015 17:32
  • Cual seria la diferencia de usar where, inner join o una subconsulta mi estimado Leandro, echame la mano.

    Si mi respuesta fue útil ayudame marcándola como correcta.

    miércoles, 5 de agosto de 2015 17:36
  • La opción depende de varias cosas indices, estadísticas, relaciones entre las tablas, orden de los parámetros de búsqueda (que coincidan con un indice).

    Lo mejor es siempre revisar el plan de ejecución, esto te ayuda a optimizar las consultas por que ves lo que realmente SQL esta haciendo (que indices toma, como divide las subconsultas, quien se tarda, etc).

    Y es mas el mismo plan de ejecución te hace recomendaciones para mejorar el desempeño de la consulta (me falta x indice o x estadística), claro ten en mente tu modelo para hacer caso a esto y evitar crear objetos no necesarios


    Ing. Carlos Monroy MCP, MCAD, MCSD, MCTS

    miércoles, 5 de agosto de 2015 17:38