none
consulta diferencia vista y procedimiento almacenado RRS feed

  • Pregunta

  • Hola quisiera saber que diferencia tiene si hago esto

    select * from Vista where parametro=valor

    y si tengo lo mismo en procedimiento almacenado

    sp_ObtenerDatos(parametro)

    la vista obtiene todos los datos de la tabla y después filtra por esa condición?? o ya trae los registros filtrados por la condición?

    cual seria mas óptimo?? estuve leyendo varias publicaciones en internet pero no me queda del todo claro

    saludos

    domingo, 25 de agosto de 2019 18:52

Respuestas

  • ¡Entonces si por ejemplo quiero obtener la cuenta corriente de un cliente determinado, a nivel de rendimiento seria lo mismo que lo haga con una vista o con un procedimiento??

    No, esto no tiene nada que ver con lo que comentábamos antes. La explicación anterior se refiere a la comparación entre acceder a una vista (que a su vez accede a una tabla) o acceder directamente a la tabla. En ambos casos, eso se podría meter dentro de un procedimiento (es decir, el procedimiento podría llamar a la vista o llamar a la tabla). En ambos casos, el hecho de que esa llamada esté dentro o fuera de un procedimiento almacenado no afecta a su rendimiento (siempre que no hayan cambiado las estadísticas y el procedimiento no esté usando la optimización antigua).

    Lo que no puedes hacer es llamar al procedimiento y luego aplicarle un where al resultado del procedimiento. Eso sí que sería ineficiente porque primero el procedimiento habría extraído todos los registros y luego nos quedaríamos solo con unos pocos de ellos.

    Resumen: Si usas un procedimiento, el filtro debe estar dentro del procedimiento. Si usas una vista, el filtro puede estar dentro o fuera de la vista sin que ello afecte al rendimiento. Esa llamada a la vista podría estar dentro o fuera de un procedimiento, sin que eso afecte al rendimiento.


    lunes, 26 de agosto de 2019 6:42

Todas las respuestas

  • la vista obtiene todos los datos de la tabla y después filtra por esa condición??

    No. Las consultas sobre las vistas se optimizan internamente, no se obtienen todos los datos.

    El sistema busca la definición interna de la vista y le agrega al Select que tenga dentro el "where parametro=valor" que escribiste en la llamada a la vista. Entonces el optimizador de consultas optimiza la sentencia global en su conjunto.

    El resultado es que solo se extraen de la tabla los datos finalmente requeridos. Es más, el proceso de extracción se optimiza eligiendo la estrategia de acceso (índices) que sea más eficiente para resolver la consulta final teniendo en cuenta simultáneamente todos los filtros aplicados (internos de la vista más externos al consultar la vista).

    domingo, 25 de agosto de 2019 20:43
  • la vista obtiene todos los datos de la tabla y después filtra por esa condición??

    No. Las consultas sobre las vistas se optimizan internamente, no se obtienen todos los datos.

    El sistema busca la definición interna de la vista y le agrega al Select que tenga dentro el "where parametro=valor" que escribiste en la llamada a la vista. Entonces el optimizador de consultas optimiza la sentencia global en su conjunto.

    El resultado es que solo se extraen de la tabla los datos finalmente requeridos. Es más, el proceso de extracción se optimiza eligiendo la estrategia de acceso (índices) que sea más eficiente para resolver la consulta final teniendo en cuenta simultáneamente todos los filtros aplicados (internos de la vista más externos al consultar la vista).

    Entonces si por ejemplo quiero obtener la cuenta corriente de un cliente determinado, a nivel de rendimiento seria lo mismo que lo haga con una vista o con un procedimiento??

    Cuando se puede destacar más uno que otro??

    domingo, 25 de agosto de 2019 23:09
  • ¡Entonces si por ejemplo quiero obtener la cuenta corriente de un cliente determinado, a nivel de rendimiento seria lo mismo que lo haga con una vista o con un procedimiento??

    No, esto no tiene nada que ver con lo que comentábamos antes. La explicación anterior se refiere a la comparación entre acceder a una vista (que a su vez accede a una tabla) o acceder directamente a la tabla. En ambos casos, eso se podría meter dentro de un procedimiento (es decir, el procedimiento podría llamar a la vista o llamar a la tabla). En ambos casos, el hecho de que esa llamada esté dentro o fuera de un procedimiento almacenado no afecta a su rendimiento (siempre que no hayan cambiado las estadísticas y el procedimiento no esté usando la optimización antigua).

    Lo que no puedes hacer es llamar al procedimiento y luego aplicarle un where al resultado del procedimiento. Eso sí que sería ineficiente porque primero el procedimiento habría extraído todos los registros y luego nos quedaríamos solo con unos pocos de ellos.

    Resumen: Si usas un procedimiento, el filtro debe estar dentro del procedimiento. Si usas una vista, el filtro puede estar dentro o fuera de la vista sin que ello afecte al rendimiento. Esa llamada a la vista podría estar dentro o fuera de un procedimiento, sin que eso afecte al rendimiento.


    lunes, 26 de agosto de 2019 6:42