¿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.
 

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

Preguntas similares