vistas en sql

16/04/2005 - 17:40 por hugo | Informe spam
En un hilo de ADO.NET donde se hablaba de n capas se escribio


"Cuando haces una restricción de una vista con restricción lo que hace
el SGBD es combinar las restricciones.

Por ejemplo si tienes una vista de ventas de tomates:

create view VentasTomates as select ventas where articulo = 'Tomate'

Y quieres restringirla para saber cuantos tomates has vendido en
Madrid

select VentasTomates where Ciudad = 'Madrid'

La consulta que realmente se va a ejecutar es la siguiente:

select ventas where articulo = 'Tomate' and ciudad = 'Madrid'

En principio el rendimiento debería de ser prácticamente el mismo, a
menos que los desarrolladores del SGBD sean unos ineptos totales, y no
creo que sea el caso."

Mi pregunta es si realmente esto es asi, ya que no lo sabia y me vendría muy
bien confirmarlo.
Gracias y saludos.

Preguntas similare

Leer las respuestas

#1 qwalgrande
15/04/2005 - 21:21 | Informe spam
Hola,

Una vista no es más que un trozo de código que guardas en el servidor para
mayor comodidad del usuario que escribe las consultas. En el mejor de los
casos, el motor será capaz de preparar un plan de ejecución idéntico al que
prepararía si en lugar de la vista se hubiera puesto la consulta que
construye la vista, es decir:

select * from (select * from ventas where articulo = 'Tomate') as MiVista
where Ciudad = 'Madrid'

Luego hay ocasiones (por supuesto con vistas mucho más complejas y con
numerosas tablas involucradas) en las que el motor no es capaz de
"simplificar" el plan de ejecución y tiene que ir creando tablas hash que
dan como resultado un rendimiento muy inferior.

En resumen y respondiendo a tu pregunta, para casos en los que el motor
pueda componer el mismo plan de ejecución con la vista que sin ella, el
rendimiento es igual. En el resto de los casos, el rendimiento será peor.

qwalgrande


"hugo" escribió en el mensaje
news:
En un hilo de ADO.NET donde se hablaba de n capas se escribio


"Cuando haces una restricción de una vista con restricción lo que hace
el SGBD es combinar las restricciones.

Por ejemplo si tienes una vista de ventas de tomates:

create view VentasTomates as select ventas where articulo = 'Tomate'

Y quieres restringirla para saber cuantos tomates has vendido en
Madrid

select VentasTomates where Ciudad = 'Madrid'

La consulta que realmente se va a ejecutar es la siguiente:

select ventas where articulo = 'Tomate' and ciudad = 'Madrid'

En principio el rendimiento debería de ser prácticamente el mismo, a
menos que los desarrolladores del SGBD sean unos ineptos totales, y no
creo que sea el caso."

Mi pregunta es si realmente esto es asi, ya que no lo sabia y me vendría


muy
bien confirmarlo.
Gracias y saludos.



Respuesta Responder a este mensaje
#2 qwalgrande
15/04/2005 - 23:09 | Informe spam
Hola.

En la consulta del ejemplo, es el caso 2.

qwalgrande


"hugo" escribió en el mensaje
news:
Bueno, eso es precisamente lo que quiero que me confirmen.

Que es lo que hace Sql server en el ejemplo
1- Lee primero todos los registros donde el articulo sea tomate, sin
importar en que ciudad se hayan vendido, para recien ahi, tomar ese


conjunto
de registros y filtar nuevamente, pero ahora por ciudad = Madrid.

o

2- Une los filtros de la consulta externa a la vista con el filtro de la
vista para lograr
where articulo = 'Tomate' and ciudad = 'Madrid'

Osea, mas alla de que el plan de jecucionm por falta de indices deba hacer
dos tablas en menmoria, la consulta que ejecuta es similar a:
select * from (select * from ventas where articulo = 'Tomate') as
MiVista
where Ciudad = 'Madrid'

o logra hacer algo asi:
select * from from ventas where articulo = 'Tomate' and Ciudad 'Madrid'



"Jose Antonio" escribió en el mensaje
news:%
> Las vistas de todas la maneras no son para simples consultas como la que
> explicas, pero en tu ejemplo el rendimiento seria el mismo si las tabla


no
> tuviera indices, pero si la tabla tiene indices para articulo y ciudad


las
> consulta sin vista sera mucho mas eficiente, dado que no leera todas las
> filas de tomates, cosa que si hace la vista.
>
> "qwalgrande" escribió en el mensaje
> news:
> > Hola,
> >
> > Una vista no es más que un trozo de código que guardas en el servidor
para
> > mayor comodidad del usuario que escribe las consultas. En el mejor de
los
> > casos, el motor será capaz de preparar un plan de ejecución idéntico


al
> > que
> > prepararía si en lugar de la vista se hubiera puesto la consulta que
> > construye la vista, es decir:
> >
> > select * from (select * from ventas where articulo = 'Tomate') as
MiVista
> > where Ciudad = 'Madrid'
> >
> > Luego hay ocasiones (por supuesto con vistas mucho más complejas y con
> > numerosas tablas involucradas) en las que el motor no es capaz de
> > "simplificar" el plan de ejecución y tiene que ir creando tablas hash
que
> > dan como resultado un rendimiento muy inferior.
> >
> > En resumen y respondiendo a tu pregunta, para casos en los que el


motor
> > pueda componer el mismo plan de ejecución con la vista que sin ella,


el
> > rendimiento es igual. En el resto de los casos, el rendimiento será
peor.
> >
> > qwalgrande
> >
> >
> > "hugo" escribió en el mensaje
> > news:
> >> En un hilo de ADO.NET donde se hablaba de n capas se escribio
> >>
> >>
> >> "Cuando haces una restricción de una vista con restricción lo que


hace
> >> el SGBD es combinar las restricciones.
> >>
> >> Por ejemplo si tienes una vista de ventas de tomates:
> >>
> >> create view VentasTomates as select ventas where articulo = 'Tomate'
> >>
> >> Y quieres restringirla para saber cuantos tomates has vendido en
> >> Madrid
> >>
> >> select VentasTomates where Ciudad = 'Madrid'
> >>
> >> La consulta que realmente se va a ejecutar es la siguiente:
> >>
> >> select ventas where articulo = 'Tomate' and ciudad = 'Madrid'
> >>
> >> En principio el rendimiento debería de ser prácticamente el mismo, a
> >> menos que los desarrolladores del SGBD sean unos ineptos totales, y


no
> >> creo que sea el caso."
> >>
> >> Mi pregunta es si realmente esto es asi, ya que no lo sabia y me
vendría
> > muy
> >> bien confirmarlo.
> >> Gracias y saludos.
> >>
> >>
> >>
> >
> >
>
>


Respuesta Responder a este mensaje
#3 Jose Antonio
16/04/2005 - 21:36 | Informe spam
Las vistas de todas la maneras no son para simples consultas como la que
explicas, pero en tu ejemplo el rendimiento seria el mismo si las tabla no
tuviera indices, pero si la tabla tiene indices para articulo y ciudad las
consulta sin vista sera mucho mas eficiente, dado que no leera todas las
filas de tomates, cosa que si hace la vista.

"qwalgrande" escribió en el mensaje
news:
Hola,

Una vista no es más que un trozo de código que guardas en el servidor para
mayor comodidad del usuario que escribe las consultas. En el mejor de los
casos, el motor será capaz de preparar un plan de ejecución idéntico al
que
prepararía si en lugar de la vista se hubiera puesto la consulta que
construye la vista, es decir:

select * from (select * from ventas where articulo = 'Tomate') as MiVista
where Ciudad = 'Madrid'

Luego hay ocasiones (por supuesto con vistas mucho más complejas y con
numerosas tablas involucradas) en las que el motor no es capaz de
"simplificar" el plan de ejecución y tiene que ir creando tablas hash que
dan como resultado un rendimiento muy inferior.

En resumen y respondiendo a tu pregunta, para casos en los que el motor
pueda componer el mismo plan de ejecución con la vista que sin ella, el
rendimiento es igual. En el resto de los casos, el rendimiento será peor.

qwalgrande


"hugo" escribió en el mensaje
news:
En un hilo de ADO.NET donde se hablaba de n capas se escribio


"Cuando haces una restricción de una vista con restricción lo que hace
el SGBD es combinar las restricciones.

Por ejemplo si tienes una vista de ventas de tomates:

create view VentasTomates as select ventas where articulo = 'Tomate'

Y quieres restringirla para saber cuantos tomates has vendido en
Madrid

select VentasTomates where Ciudad = 'Madrid'

La consulta que realmente se va a ejecutar es la siguiente:

select ventas where articulo = 'Tomate' and ciudad = 'Madrid'

En principio el rendimiento debería de ser prácticamente el mismo, a
menos que los desarrolladores del SGBD sean unos ineptos totales, y no
creo que sea el caso."

Mi pregunta es si realmente esto es asi, ya que no lo sabia y me vendría


muy
bien confirmarlo.
Gracias y saludos.







Respuesta Responder a este mensaje
#4 hugo
16/04/2005 - 22:25 | Informe spam
Bueno, eso es precisamente lo que quiero que me confirmen.

Que es lo que hace Sql server en el ejemplo
1- Lee primero todos los registros donde el articulo sea tomate, sin
importar en que ciudad se hayan vendido, para recien ahi, tomar ese conjunto
de registros y filtar nuevamente, pero ahora por ciudad = Madrid.

o

2- Une los filtros de la consulta externa a la vista con el filtro de la
vista para lograr
where articulo = 'Tomate' and ciudad = 'Madrid'

Osea, mas alla de que el plan de jecucionm por falta de indices deba hacer
dos tablas en menmoria, la consulta que ejecuta es similar a:
select * from (select * from ventas where articulo = 'Tomate') as
MiVista
where Ciudad = 'Madrid'

o logra hacer algo asi:
select * from from ventas where articulo = 'Tomate' and Ciudad = 'Madrid'



"Jose Antonio" escribió en el mensaje
news:%
Las vistas de todas la maneras no son para simples consultas como la que
explicas, pero en tu ejemplo el rendimiento seria el mismo si las tabla no
tuviera indices, pero si la tabla tiene indices para articulo y ciudad las
consulta sin vista sera mucho mas eficiente, dado que no leera todas las
filas de tomates, cosa que si hace la vista.

"qwalgrande" escribió en el mensaje
news:
> Hola,
>
> Una vista no es más que un trozo de código que guardas en el servidor


para
> mayor comodidad del usuario que escribe las consultas. En el mejor de


los
> casos, el motor será capaz de preparar un plan de ejecución idéntico al
> que
> prepararía si en lugar de la vista se hubiera puesto la consulta que
> construye la vista, es decir:
>
> select * from (select * from ventas where articulo = 'Tomate') as


MiVista
> where Ciudad = 'Madrid'
>
> Luego hay ocasiones (por supuesto con vistas mucho más complejas y con
> numerosas tablas involucradas) en las que el motor no es capaz de
> "simplificar" el plan de ejecución y tiene que ir creando tablas hash


que
> dan como resultado un rendimiento muy inferior.
>
> En resumen y respondiendo a tu pregunta, para casos en los que el motor
> pueda componer el mismo plan de ejecución con la vista que sin ella, el
> rendimiento es igual. En el resto de los casos, el rendimiento será


peor.
>
> qwalgrande
>
>
> "hugo" escribió en el mensaje
> news:
>> En un hilo de ADO.NET donde se hablaba de n capas se escribio
>>
>>
>> "Cuando haces una restricción de una vista con restricción lo que hace
>> el SGBD es combinar las restricciones.
>>
>> Por ejemplo si tienes una vista de ventas de tomates:
>>
>> create view VentasTomates as select ventas where articulo = 'Tomate'
>>
>> Y quieres restringirla para saber cuantos tomates has vendido en
>> Madrid
>>
>> select VentasTomates where Ciudad = 'Madrid'
>>
>> La consulta que realmente se va a ejecutar es la siguiente:
>>
>> select ventas where articulo = 'Tomate' and ciudad = 'Madrid'
>>
>> En principio el rendimiento debería de ser prácticamente el mismo, a
>> menos que los desarrolladores del SGBD sean unos ineptos totales, y no
>> creo que sea el caso."
>>
>> Mi pregunta es si realmente esto es asi, ya que no lo sabia y me


vendría
> muy
>> bien confirmarlo.
>> Gracias y saludos.
>>
>>
>>
>
>


Respuesta Responder a este mensaje
#5 Jose Antonio
16/04/2005 - 22:44 | Informe spam
Si la tabla no tiene indices, cualquier consulta sera ineficiente, porque
leera siempre todas las filas para devolver el resultado.

En el caso de la vista sqlserver realiza la opcion 1.

esta consulta:
select * from (select * from ventas where articulo = 'Tomate') as
MiVista
where Ciudad = 'Madrid'

y esta:

select VentasTomates where Ciudad = 'Madrid'

son iguales.

"hugo" escribió en el mensaje
news:
Bueno, eso es precisamente lo que quiero que me confirmen.

Que es lo que hace Sql server en el ejemplo
1- Lee primero todos los registros donde el articulo sea tomate, sin
importar en que ciudad se hayan vendido, para recien ahi, tomar ese
conjunto
de registros y filtar nuevamente, pero ahora por ciudad = Madrid.

o

2- Une los filtros de la consulta externa a la vista con el filtro de la
vista para lograr
where articulo = 'Tomate' and ciudad = 'Madrid'

Osea, mas alla de que el plan de jecucionm por falta de indices deba hacer
dos tablas en menmoria, la consulta que ejecuta es similar a:
select * from (select * from ventas where articulo = 'Tomate') as
MiVista
where Ciudad = 'Madrid'

o logra hacer algo asi:
select * from from ventas where articulo = 'Tomate' and Ciudad = 'Madrid'



"Jose Antonio" escribió en el mensaje
news:%
Las vistas de todas la maneras no son para simples consultas como la que
explicas, pero en tu ejemplo el rendimiento seria el mismo si las tabla
no
tuviera indices, pero si la tabla tiene indices para articulo y ciudad
las
consulta sin vista sera mucho mas eficiente, dado que no leera todas las
filas de tomates, cosa que si hace la vista.

"qwalgrande" escribió en el mensaje
news:
> Hola,
>
> Una vista no es más que un trozo de código que guardas en el servidor


para
> mayor comodidad del usuario que escribe las consultas. En el mejor de


los
> casos, el motor será capaz de preparar un plan de ejecución idéntico al
> que
> prepararía si en lugar de la vista se hubiera puesto la consulta que
> construye la vista, es decir:
>
> select * from (select * from ventas where articulo = 'Tomate') as


MiVista
> where Ciudad = 'Madrid'
>
> Luego hay ocasiones (por supuesto con vistas mucho más complejas y con
> numerosas tablas involucradas) en las que el motor no es capaz de
> "simplificar" el plan de ejecución y tiene que ir creando tablas hash


que
> dan como resultado un rendimiento muy inferior.
>
> En resumen y respondiendo a tu pregunta, para casos en los que el motor
> pueda componer el mismo plan de ejecución con la vista que sin ella, el
> rendimiento es igual. En el resto de los casos, el rendimiento será


peor.
>
> qwalgrande
>
>
> "hugo" escribió en el mensaje
> news:
>> En un hilo de ADO.NET donde se hablaba de n capas se escribio
>>
>>
>> "Cuando haces una restricción de una vista con restricción lo que hace
>> el SGBD es combinar las restricciones.
>>
>> Por ejemplo si tienes una vista de ventas de tomates:
>>
>> create view VentasTomates as select ventas where articulo = 'Tomate'
>>
>> Y quieres restringirla para saber cuantos tomates has vendido en
>> Madrid
>>
>> select VentasTomates where Ciudad = 'Madrid'
>>
>> La consulta que realmente se va a ejecutar es la siguiente:
>>
>> select ventas where articulo = 'Tomate' and ciudad = 'Madrid'
>>
>> En principio el rendimiento debería de ser prácticamente el mismo, a
>> menos que los desarrolladores del SGBD sean unos ineptos totales, y no
>> creo que sea el caso."
>>
>> Mi pregunta es si realmente esto es asi, ya que no lo sabia y me


vendría
> muy
>> bien confirmarlo.
>> Gracias y saludos.
>>
>>
>>
>
>






email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida