Utilizar índices en vistas no indexadas

01/07/2008 - 13:44 por Juan Diego Bueno | Informe spam
Buenas gente:

Ya he planteado una duda similar en un grupo de C#, pero como una parte
es tan específica del SGBD, la replanteo en este grupo.

Yo suelo utilizar vistas modificables que afectan a más de una tabla.
Suelen basarse en joins o en uniones, de forma que no las puedo crear
como indexadas.

.NET dispone de la clase SQLCommandbuilder que permite generar los
comandos de actualización, inserción y borrado para los adaptadores de
datos de forma rápida. Con el comando de inserción no hay problema,
pero sí con los de actualización y borrado. Todo ello se debe a que no
encuentra el campo o campos que debería/n de ejercer de clave
principal. Es más, creo que con sólo encontrar una restricción UNIQUE
funcionaría. El problema es que no encuentro cómo mostrar esa vista
como si fuera una tabla con sus claves. Ya he comentado por qué no
puedo utilizar vistas indexadas. ¿Alguna idea?

Saludos

http://www.moondance.es

Preguntas similare

Leer las respuestas

#11 Jose Alberto
02/07/2008 - 17:52 | Informe spam
Las vistas no indexadas tambien aprovechan los indices de las tablas en las
cuales se basan.


"Penta" wrote in message
news:
Estimado Juan Diego.
Yo diria mas bien que solo es comodo, no hay duda, pero potente ?? no
creo, ya ves que son en vistas NO indexadas.

Atte.
Penta.
Respuesta Responder a este mensaje
#12 Carlos M. Calvelo
02/07/2008 - 17:55 | Informe spam
Hola Penta,

On Jul 1, 8:10 pm, Penta wrote:
Solo como dato, se debe tener especial cuidado en insertar datos
mediante vista esque ni alguna columna de la tabla inolucrada tiene
calculo, esta insercion no sera posible.




Se debe tener todo el especial cuidado que tu quieras,
pero... ¿por qué crees que no será posible?

Un ejemplo sencillo:

Tenemos una tabla Cent (temperaturas en grados centígrados) y
algunas aplicaciones desean tener las temperaturas en grados
Fahrenheit. Para esto creamos una vista Fahr.

-
create table Cent
(
k int not null primary key,
temperatura numeric(18,8) not null
)
go

create view Fahr as
select
k,
cast(9.0/5.0 * temperatura + 32.0 as numeric(18,8)) as temperatura
from Cent
go

La columna 'temperatura' en Fahr es calculada y ahora creamos
instead of triggers para esta vista:

-
create trigger ti_Fahr on Fahr instead of insert
as
insert into Cent (k,temperatura)
select i.k, (i.temperatura - 32.0) * 5.0/9.0
from inserted i
go

create trigger tu_Fahr on Fahr instead of update
as
update Cent
set temperatura=(i.temperatura - 32.0) * 5.0/9.0
from Cent join inserted i on Cent.k=i.k
go

create trigger td_Fahr on Fahr instead of delete
as
delete Cent
from Cent join deleted d on Cent.k=d.k
go


Lo que ven ahora las aplicaciones es dos tablas: Cent y Fahr.
Solo tienen que saber que exite una tabla Cent con columnas
k (int) y temperatura (numeric(18,8)) y para Fahr lo mismo.
Las dos son actualizables y las aplicaciones no saben, ni
deben saber, que una de ellas es una tabla y la otra una vista.
Es mas, la tabla base y la vista son intercambiables (Fahr se puede
convertir en una tabla base y Cent en una vista) sin romper la
interfaz con las aplicaciones existentes.

Prueba ahora (como si fueras una de las aplicaciones):

-
insert into Cent (k,temperatura) values (1,0)
insert into Cent (k,temperatura) values (2,50)
insert into Cent (k,temperatura) values (3,100)

insert into Fahr (k,temperatura) values (4,32)
insert into Fahr (k,temperatura) values (5,122)
insert into Fahr (k,temperatura) values (6,212)

select * from Cent
select * from Fahr
-

y ahora prueba, por ejemplo:

-
delete Fahr
where k=4

update Fahr
set temperaturaP
where k=5

select * from Cent
select * from Fahr
-

y nos cuentas.
Supongo que estarás de acuerdo que estamos actualizando
una columna derivada (con un cálculo).

Como ejemplo podría haber puesto una vista con las dos
temperaturas y una tabla base con solo una de ellas.
El principio es el mismo.

Te aconsejo de profundices en los siguientes conceptos:

- 'Principio de información'
- 'Independencia lógica de datos'
- 'Principio de intercambiabilidad'
- 'Cierre relacional'

¿'Potente'? ¿A que le llamas tu 'potente'?


Saludos,
Carlos
Respuesta Responder a este mensaje
#13 Jesús López
15/07/2008 - 18:43 | Informe spam
Sólo quisiera añadir que para que el CommandBuilder genere las instrucciones
insert, update y delete sobre la vista en vez de sobre la tabla base, la
vista debería crearse con la opción VIEW_METADATA:

create view Fahr
WITH VIEW_METADATA
as
select
k,
cast(9.0/5.0 * temperatura + 32.0 as numeric(18,8)) as temperatura
from Cent
go

Saludos:

Jesús López
www.soldiq.com



"Carlos M. Calvelo" escribió en el mensaje
news:

Hola Penta,

On Jul 1, 8:10 pm, Penta wrote:
Solo como dato, se debe tener especial cuidado en insertar datos
mediante vista esque ni alguna columna de la tabla inolucrada tiene
calculo, esta insercion no sera posible.




Se debe tener todo el especial cuidado que tu quieras,
pero... ¿por qué crees que no será posible?

Un ejemplo sencillo:

Tenemos una tabla Cent (temperaturas en grados centígrados) y
algunas aplicaciones desean tener las temperaturas en grados
Fahrenheit. Para esto creamos una vista Fahr.

-
create table Cent
(
k int not null primary key,
temperatura numeric(18,8) not null
)
go

create view Fahr as
select
k,
cast(9.0/5.0 * temperatura + 32.0 as numeric(18,8)) as temperatura
from Cent
go

La columna 'temperatura' en Fahr es calculada y ahora creamos
instead of triggers para esta vista:

-
create trigger ti_Fahr on Fahr instead of insert
as
insert into Cent (k,temperatura)
select i.k, (i.temperatura - 32.0) * 5.0/9.0
from inserted i
go

create trigger tu_Fahr on Fahr instead of update
as
update Cent
set temperatura=(i.temperatura - 32.0) * 5.0/9.0
from Cent join inserted i on Cent.k=i.k
go

create trigger td_Fahr on Fahr instead of delete
as
delete Cent
from Cent join deleted d on Cent.k=d.k
go


Lo que ven ahora las aplicaciones es dos tablas: Cent y Fahr.
Solo tienen que saber que exite una tabla Cent con columnas
k (int) y temperatura (numeric(18,8)) y para Fahr lo mismo.
Las dos son actualizables y las aplicaciones no saben, ni
deben saber, que una de ellas es una tabla y la otra una vista.
Es mas, la tabla base y la vista son intercambiables (Fahr se puede
convertir en una tabla base y Cent en una vista) sin romper la
interfaz con las aplicaciones existentes.

Prueba ahora (como si fueras una de las aplicaciones):

-
insert into Cent (k,temperatura) values (1,0)
insert into Cent (k,temperatura) values (2,50)
insert into Cent (k,temperatura) values (3,100)

insert into Fahr (k,temperatura) values (4,32)
insert into Fahr (k,temperatura) values (5,122)
insert into Fahr (k,temperatura) values (6,212)

select * from Cent
select * from Fahr
-

y ahora prueba, por ejemplo:

-
delete Fahr
where k=4

update Fahr
set temperaturaP
where k=5

select * from Cent
select * from Fahr
-

y nos cuentas.
Supongo que estarás de acuerdo que estamos actualizando
una columna derivada (con un cálculo).

Como ejemplo podría haber puesto una vista con las dos
temperaturas y una tabla base con solo una de ellas.
El principio es el mismo.

Te aconsejo de profundices en los siguientes conceptos:

- 'Principio de información'
- 'Independencia lógica de datos'
- 'Principio de intercambiabilidad'
- 'Cierre relacional'

¿'Potente'? ¿A que le llamas tu 'potente'?


Saludos,
Carlos
Respuesta Responder a este mensaje
#14 Carlos M. Calvelo
15/07/2008 - 21:30 | Informe spam
Hola Jesús,

On 15 jul, 18:43, "Jesús López"
wrote:
Sólo quisiera añadir que para que el CommandBuilder genere las instrucciones
insert, update y delete sobre la vista en vez de sobre la tabla base, la
vista debería crearse con la opción VIEW_METADATA:




Pues muy buena la 'añadidura' :-)
Muchas gracias por el (importante!) detalle.

Saludos,
Carlos
Respuesta Responder a este mensaje
#15 Juan Diego Bueno
15/07/2008 - 21:35 | Informe spam
Hola Jesús:

"Jesús López" escribió en el
mensaje de noticias:#
Sólo quisiera añadir que para que el CommandBuilder genere las
instrucciones insert, update y delete sobre la vista en vez de sobre la
tabla base, la vista debería crearse con la opción VIEW_METADATA:



No sé si fue en este grupo o en otro donde comenté que inicialmente pensaba
que con esa opción valdría. Y es así... a medias. Si que crea el
insertcommand, pero no el update y delete. He probado incluso poniendo a
true la opción SetAllValues para el caso del update, pero no va.

En cualquier caso, generar esos dos command no me supone mucho esfuerzo, así
que a falta de algo mejor...

Un saludo y gracias por la aportación.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida