¿Diferencia entre una vista y una consulta?

20/04/2004 - 09:47 por Naimps | Informe spam
Hola.

Me explico.

Tengo el siguiente SP:

DECLARE @dias_i smallint
DECLARE @dias_v tinyint SET @dias_v = CASE @tipo WHEN 1 THEN 7 ELSE 0 END
DECLARE @acomodacion varchar(3)
DECLARE @com char(1)
DECLARE @sql varchar(1500)
SET @com = char(39)

IF (@internet = 1) AND (@linea IN (9, 10))
SET @acomodacion = 'C2'
ELSE
SET @acomodacion = ''

IF (@tipo = 1) AND (@internet = 1)
BEGIN
SET @dias_i = DATEDIFF(day, getDate(), @fecha)
SET @dias_i = CASE WHEN @dias_i > 7 THEN 7 ELSE @dias_i END
END
ELSE
SET @dias_i = CASE @tipo WHEN 1 THEN 7 ELSE 0 END

SET @sql = 'SELECT MIN(aco.plazas) AS plazas, MIN(aco.vacios) AS vacias,
aco_capacidad, aco_nombre, aco_siglas, grup_codi, grup_nombre,'
+ ' MAX(aco.cerrado) AS cerrado, MIN(aco.mts) AS metros, MIN(aco.pax) AS
pax, CONVERT(varchar, grup_fechsa, 103) AS grup_fechsa,'
+ ' grup_horasa, grup_horall, grup_fechsa AS orden,
MIN(iscomar.NUMEROCOCHES(vgr_codgrup, 0)) AS coches'
+ ' FROM (SELECT SUM(CASE nac_vacio WHEN 1 THEN nac_libres ELSE 0 END) AS
plazas, SUM(nac_vacio) AS vacios, nac_codaco,'
+ ' vgr_codgrup, via_cerrado AS cerrado, via_metdis AS mts, via_pax_disp
AS pax'
+ ' FROM ic_numaco INNER JOIN ic_viaje ON via_codi = nac_via_codi'
+ ' INNER JOIN ic_viagrup ON via_codi = vgr_codvia'
+ ' INNER JOIN ic_grupoviaje ON grup_codi = vgr_codgrup'
+ ' WHERE (grup_fechsa BETWEEN DATEADD(day, -' + cast(@dias_i as varchar)
+ ', ' + @com + cast(@fecha as varchar) + @com + ')'
+ ' AND DATEADD(day, ' + cast(@dias_v as varchar) + ', ' + @com +
cast(@fecha as varchar) + @com + ')) AND (grup_codlin = ' + cast(@linea as
varchar) + ')'
IF (@acomodacion <> '')
SET @sql = @sql + ' AND (nac_codaco <> ' + @com + @acomodacion + @com +
')'
SET @sql = @sql + ' GROUP BY nac_codaco, vgr_codgrup, via_cerrado,
via_metdis, via_pax_disp) aco'
+ ' INNER JOIN ic_grupoviaje ON grup_codi = aco.vgr_codgrup'
+ ' INNER JOIN ic_acomodaciones ON aco_siglas = aco.nac_codaco'
+ ' GROUP BY grup_codi, grup_nombre, grup_fechsa, grup_horasa,
grup_horall, aco_capacidad, aco_siglas, aco_nombre'
+ ' ORDER BY 14, grup_horasa, aco_siglas'

EXEC (@sql)


Antes lo tenía una consulta, pero pensé que sería mejor primero crear la
cadena y luego ejecutarla (¿buena idea?).

Ahora estoy mirando las vistas.

Una cosa: las tablas, tienen unas 200.000 filas, y crecen unas 100.000 al
año (sólo una tabla tiene más de 1.000.000 de filas).

Lo que decía: ahora estoy mirando si merece la pena crear una vista y que
el SP la utilize, pero no se la diferencia que hay entre una vista o
utilizar una consulta SQL. ¿no es lo mismo? (supongo que no, poruqe si no
no existirían las vistas).

Espero haberme explicado, pues soy muy malo en el uso del lenguaje.

Muchas gracias.

Preguntas similare

Leer las respuestas

#1 Maximiliano D. A.
20/04/2004 - 14:39 | Informe spam
Hola, bueno una vista no es lo mismo que un Store procedure.

La vista es como una tabla que representa un query, por ej uno en una vista
puede ocultar complejidad y aumentar facilidad.

Veamos un ej:

Si yo tengo un query que hace muchos Join y lo pongo en una vista, en mi
cliente o Stores/Triggers,etc, solo con hacer.

Select campos from vista, me alcanza, esto es mas facil y legible a la vez.

si mañana necesito poner un campo nuevo, solo modifico la vista.

Bien un Store:

Estos no siempre retornan resultados como las vistas, yo podria tener un
Store para que haga ciertos procesos y no retorne nada, o un Store que
retorne resultados en variables o uno que lo haga por medio de un Select.

Ademas de esta diferencia, existe la siguiente: El store se compila y ahi
arma que plan va a utilizar, cuando la vista cada vez que la ejecute lo va a
armar.

Claro no es todo de color de rosas, si yo armo un Store y luego pongo
indices donde el store hacia referencia, si no lo recompilo este Store no
los usara cuando la vista quizas si.

Claro se puede solucuinar que cada Store se recompile por cada vez que se
ejecuta, pero esto genera carga :(

Para redondiar, una vista es una forma muy simple de ocultar complejidad, un
store no solo puede retornar sino hacer cosas.

Suerte y espero haber sido claro :)

Bye


Salu2
Maxi

Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET

MSN:
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"Naimps" <"@naimps@"@terra.es> escribió en el mensaje
news:1n3dr0q8as2jb$.10asw51bzn9xs$
Hola.

Me explico.

Tengo el siguiente SP:

DECLARE @dias_i smallint
DECLARE @dias_v tinyint SET @dias_v = CASE @tipo WHEN 1 THEN 7 ELSE 0 END
DECLARE @acomodacion varchar(3)
DECLARE @com char(1)
DECLARE @sql varchar(1500)
SET @com = char(39)

IF (@internet = 1) AND (@linea IN (9, 10))
SET @acomodacion = 'C2'
ELSE
SET @acomodacion = ''

IF (@tipo = 1) AND (@internet = 1)
BEGIN
SET @dias_i = DATEDIFF(day, getDate(), @fecha)
SET @dias_i = CASE WHEN @dias_i > 7 THEN 7 ELSE @dias_i END
END
ELSE
SET @dias_i = CASE @tipo WHEN 1 THEN 7 ELSE 0 END

SET @sql = 'SELECT MIN(aco.plazas) AS plazas, MIN(aco.vacios) AS vacias,
aco_capacidad, aco_nombre, aco_siglas, grup_codi, grup_nombre,'
+ ' MAX(aco.cerrado) AS cerrado, MIN(aco.mts) AS metros, MIN(aco.pax) AS
pax, CONVERT(varchar, grup_fechsa, 103) AS grup_fechsa,'
+ ' grup_horasa, grup_horall, grup_fechsa AS orden,
MIN(iscomar.NUMEROCOCHES(vgr_codgrup, 0)) AS coches'
+ ' FROM (SELECT SUM(CASE nac_vacio WHEN 1 THEN nac_libres ELSE 0 END) AS
plazas, SUM(nac_vacio) AS vacios, nac_codaco,'
+ ' vgr_codgrup, via_cerrado AS cerrado, via_metdis AS mts, via_pax_disp
AS pax'
+ ' FROM ic_numaco INNER JOIN ic_viaje ON via_codi = nac_via_codi'
+ ' INNER JOIN ic_viagrup ON via_codi = vgr_codvia'
+ ' INNER JOIN ic_grupoviaje ON grup_codi = vgr_codgrup'
+ ' WHERE (grup_fechsa BETWEEN DATEADD(day, -' + cast(@dias_i as varchar)
+ ', ' + @com + cast(@fecha as varchar) + @com + ')'
+ ' AND DATEADD(day, ' + cast(@dias_v as varchar) + ', ' + @com +
cast(@fecha as varchar) + @com + ')) AND (grup_codlin = ' + cast(@linea as
varchar) + ')'
IF (@acomodacion <> '')
SET @sql = @sql + ' AND (nac_codaco <> ' + @com + @acomodacion + @com +
')'
SET @sql = @sql + ' GROUP BY nac_codaco, vgr_codgrup, via_cerrado,
via_metdis, via_pax_disp) aco'
+ ' INNER JOIN ic_grupoviaje ON grup_codi = aco.vgr_codgrup'
+ ' INNER JOIN ic_acomodaciones ON aco_siglas = aco.nac_codaco'
+ ' GROUP BY grup_codi, grup_nombre, grup_fechsa, grup_horasa,
grup_horall, aco_capacidad, aco_siglas, aco_nombre'
+ ' ORDER BY 14, grup_horasa, aco_siglas'

EXEC (@sql)


Antes lo tenía una consulta, pero pensé que sería mejor primero crear la
cadena y luego ejecutarla (¿buena idea?).

Ahora estoy mirando las vistas.

Una cosa: las tablas, tienen unas 200.000 filas, y crecen unas 100.000 al
año (sólo una tabla tiene más de 1.000.000 de filas).

Lo que decía: ahora estoy mirando si merece la pena crear una vista y que
el SP la utilize, pero no se la diferencia que hay entre una vista o
utilizar una consulta SQL. ¿no es lo mismo? (supongo que no, poruqe si no
no existirían las vistas).

Espero haberme explicado, pues soy muy malo en el uso del lenguaje.

Muchas gracias.





Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.661 / Virus Database: 424 - Release Date: 19/04/2004
Respuesta Responder a este mensaje
#2 Naimps
21/04/2004 - 09:47 | Informe spam
On Tue, 20 Apr 2004 09:39:43 -0300, Maximiliano D. A. wrote:

Hola, bueno una vista no es lo mismo que un Store procedure.

La vista es como una tabla que representa un query, por ej uno en una vista
puede ocultar complejidad y aumentar facilidad.

Veamos un ej:

Si yo tengo un query que hace muchos Join y lo pongo en una vista, en mi
cliente o Stores/Triggers,etc, solo con hacer.

Select campos from vista, me alcanza, esto es mas facil y legible a la vez.

si mañana necesito poner un campo nuevo, solo modifico la vista.

Bien un Store:

Estos no siempre retornan resultados como las vistas, yo podria tener un
Store para que haga ciertos procesos y no retorne nada, o un Store que
retorne resultados en variables o uno que lo haga por medio de un Select.

Ademas de esta diferencia, existe la siguiente: El store se compila y ahi
arma que plan va a utilizar, cuando la vista cada vez que la ejecute lo va a
armar.

Claro no es todo de color de rosas, si yo armo un Store y luego pongo
indices donde el store hacia referencia, si no lo recompilo este Store no
los usara cuando la vista quizas si.

Claro se puede solucuinar que cada Store se recompile por cada vez que se
ejecuta, pero esto genera carga :(

Para redondiar, una vista es una forma muy simple de ocultar complejidad, un
store no solo puede retornar sino hacer cosas.

Suerte y espero haber sido claro :)

Bye



Buenas.

Asi consa :-)

Que un SP es diferente a una vista lo sabía. Puse el código del SP para que
se viera cómo realizaba una consulta (o sea, dinámicamente), y que así que
me comentarais si era mejor así o montar un select "estático". O, si como
pienso, sería mejor montar una vista del núcleo de la consulta y dentro del
SP utilizar un select que llame a la vista.

Una cosa que no me ha quedado claro: si la vista es "como una tabla",
¿quiere decir que a la hora de crearla guarda el resultado físicamente?

Gracias.

PD: Dios, que mal me explico.
Respuesta Responder a este mensaje
#3 Carlos Sacristan
21/04/2004 - 11:17 | Informe spam
El tema del sql dinámico es problemático. Si sabes un poco de inglés
(digo poco porque yo tampoco es que sea bilingüe precisamente y lo entendí
bien), hay un artículo buenísimo de Erland Sommarskog (MVP en SQL Server)
que habla sobre este tema: http://www.algonet.se/~sommar/dynamic_sql.html

Las vistas normales (no las indizadas) no guardan el resultado
físicamente. Cuando Max comenta lo de que es como una tabla se refiere a que
se maneja igual que ellas: se pueden consultar, y en muchos casos se pueden
actualizar sus datos directamente, al igual que una tabla.


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Naimps" <"@naimps@"@terra.es> escribió en el mensaje
news:zai2dpnoxkjc$.1g8xrncepq3zu$
On Tue, 20 Apr 2004 09:39:43 -0300, Maximiliano D. A. wrote:

> Hola, bueno una vista no es lo mismo que un Store procedure.
>
> La vista es como una tabla que representa un query, por ej uno en una


vista
> puede ocultar complejidad y aumentar facilidad.
>
> Veamos un ej:
>
> Si yo tengo un query que hace muchos Join y lo pongo en una vista, en mi
> cliente o Stores/Triggers,etc, solo con hacer.
>
> Select campos from vista, me alcanza, esto es mas facil y legible a la


vez.
>
> si mañana necesito poner un campo nuevo, solo modifico la vista.
>
> Bien un Store:
>
> Estos no siempre retornan resultados como las vistas, yo podria tener un
> Store para que haga ciertos procesos y no retorne nada, o un Store que
> retorne resultados en variables o uno que lo haga por medio de un


Select.
>
> Ademas de esta diferencia, existe la siguiente: El store se compila y


ahi
> arma que plan va a utilizar, cuando la vista cada vez que la ejecute lo


va a
> armar.
>
> Claro no es todo de color de rosas, si yo armo un Store y luego pongo
> indices donde el store hacia referencia, si no lo recompilo este Store


no
> los usara cuando la vista quizas si.
>
> Claro se puede solucuinar que cada Store se recompile por cada vez que


se
> ejecuta, pero esto genera carga :(
>
> Para redondiar, una vista es una forma muy simple de ocultar


complejidad, un
> store no solo puede retornar sino hacer cosas.
>
> Suerte y espero haber sido claro :)
>
> Bye

Buenas.

Asi consa :-)

Que un SP es diferente a una vista lo sabía. Puse el código del SP para


que
se viera cómo realizaba una consulta (o sea, dinámicamente), y que así que
me comentarais si era mejor así o montar un select "estático". O, si como
pienso, sería mejor montar una vista del núcleo de la consulta y dentro


del
SP utilizar un select que llame a la vista.

Una cosa que no me ha quedado claro: si la vista es "como una tabla",
¿quiere decir que a la hora de crearla guarda el resultado físicamente?

Gracias.

PD: Dios, que mal me explico.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida