Duda sobre vista

04/09/2005 - 02:47 por Alfredo Crisostomo | Informe spam
Si yo tengo una vista compuesta de un inner join entre dos tablas y hago un
query sobre esta vista de la forma:

select * from mivista where mivista.campo=@valor

quiero saber si sql server optimiza el query filtrando los datos de la vista
o primero trae todos los registros de la vista y a ese resultado es que
aplica el where ?

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
04/09/2005 - 15:32 | Informe spam
Alfredo,

Podemos tener dos tipos de vista en SQL Server 2000.

- no indexadas
- indexadas

Las vistas no indexadas no son mas que una tabla virtual. Virtual porque en
realidad solo existe su definicion, la cual es usada cada vez que la vista es
referenciada (como si fuese una macro sustitucion).

Las vistas indexadas, en cambio, se convierten en tablas fisicas una vez que
se crea el indice clustered (puedes leer sobre indices clustered en los BOL
para que tengas una mejor idea de porque estas vistas se materializan).

SQL Server 2000 nos deja crear las vistas indexadas en cualquier version,
pero el optimizador de queries no hace un uso automatico de estas en la
version standard, personal, desktop, etc. En estas versiones debemos usar el
modificador (view hint) "with noexpand" en la sentencia "select" para que SQL
Server no expanda la vista y trabaje sobre las tablas que esta referencia. En
la version "Enterprise" y /o "Developer" esto cambia, el optimizador puede
hacer uso de las vistas indexadas incluso cuando estas no son referenciadas
directamente en la sentencia "select", osea que lo que referenciamos son las
tablas que conforman la vista.


AMB

"Alfredo Crisostomo" wrote:

Si yo tengo una vista compuesta de un inner join entre dos tablas y hago un
query sobre esta vista de la forma:

select * from mivista where mivista.campo=@valor

quiero saber si sql server optimiza el query filtrando los datos de la vista
o primero trae todos los registros de la vista y a ese resultado es que
aplica el where ?




Respuesta Responder a este mensaje
#2 Alfredo Crisostomo
04/09/2005 - 16:00 | Informe spam

Las vistas no indexadas no son mas que una tabla virtual. Virtual porque
en
realidad solo existe su definicion, la cual es usada cada vez que la vista
es
referenciada (como si fuese una macro sustitucion).




De eso deduzco que para el caso que pregunto no es conveniente usar la vista
sino armar el query completo con el join que compone la vista ?

es decir. si la vista mivista la tengo definida como :

select a.* , b.campo, b.campo1 from tabla1 a inner join tabla2 b on
a.campo1=b.campo3


si hago el query que dije arriba:

select * from mivista where mivista.campo=@valor

sql server lo convertirá a :

select * from
(select a.* , b.campo, b.campo1 from tabla1 a inner join tabla2 b on
a.campo1=b.campo3) where mivista.campo=@valor

Me imagino que seria mas eficiente ignorar la vista y hacer directamente
esto:

select a.* , b.campo, b.campo1 from tabla1 a inner join tabla2 b on
a.campo1=b.campo3 and b.campo=@valor


O es sql server lo suficiente "inteligente" para "reducir" u optimizar el
query resultante ?


No se si me explico porque hasta yo mismo me perdi un poco :)
Respuesta Responder a este mensaje
#3 Alejandro Mesa
05/09/2005 - 19:54 | Informe spam
Alfredo,

Al menos que la vista sea una referencia en cadena de otras vistas y asi
sucesivamente, no se notara ninguna diferencia entre hacer un select
directamente sobre las tablas, a hacerlo sobre la vista. SQL Server debe
hacer un chequeo de sintaxis de la sentencia, chequear referencias, permiso
de acceso y compilarla para luego ejecutarla. Eso si, con el uso de vistas
tambien ayudamos a la legibilidad de la sentencia. En este caso la sentencia
es sencilla, pero otras veces ayuda mucho, esto sin hablar de que el uso de
las vistas puede usarse para seguridad, pues dariamos acceso sobre la vista
pero no sobre las tablas a las que esta referencia.


AMB

"Alfredo Crisostomo" wrote:

>
> Las vistas no indexadas no son mas que una tabla virtual. Virtual porque
> en
> realidad solo existe su definicion, la cual es usada cada vez que la vista
> es
> referenciada (como si fuese una macro sustitucion).
>

De eso deduzco que para el caso que pregunto no es conveniente usar la vista
sino armar el query completo con el join que compone la vista ?

es decir. si la vista mivista la tengo definida como :

select a.* , b.campo, b.campo1 from tabla1 a inner join tabla2 b on
a.campo1=b.campo3


si hago el query que dije arriba:

select * from mivista where mivista.campo=@valor

sql server lo convertirá a :

select * from
(select a.* , b.campo, b.campo1 from tabla1 a inner join tabla2 b on
a.campo1=b.campo3) where mivista.campo=@valor

Me imagino que seria mas eficiente ignorar la vista y hacer directamente
esto:

select a.* , b.campo, b.campo1 from tabla1 a inner join tabla2 b on
a.campo1=b.campo3 and b.campo=@valor


O es sql server lo suficiente "inteligente" para "reducir" u optimizar el
query resultante ?


No se si me explico porque hasta yo mismo me perdi un poco :)




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