vista unificada de varias tablas,problema con plan de ejecucion

15/06/2006 - 23:22 por Silverius | Informe spam
Hola a todos,

Tengo un conjunto de operaciones particionado por meses en varias tablas

create table OperacionesEnero(id int,codigo int,fecha datetime)
create table OperacionesFebrero(id int,codigo int,fecha datetime)
asi hasta varios meses (cada tabla tiene una constraint en "fecha" para
que los datos no puedan estar fuera de ese mes)

Y una vista que unifica estas tablas
create view VistaUnificada
as
select id,codigo,fecha from OperacionesEnero union all
select id,codigo,fecha from OperacionesEnero..

Se que no es el mejor diseño, pero es como esta y cambiarlo nos es ahora
mismo imposible.

El caso es que cuando ejecuto una consulta, por ejemplo
select * from VistaUnificada where fecha='20060615',el plan de consulta
muestra que solo se busca en la tabla de Junio.Pero cuendo hago un
procedimiento como:select * from VistaUnificada where fecha=@fecha y lo
ejecuto, el plan de consulta muestra que se busca en todas las tablas.En la
practica,con el parametro tarda tambien muchisimo mas.
Entiendo que esto sera debido a que el servidor tiene que crear un plan de
ejecucion generico, ya que no sabe que contendra el parametro.


Mi pregunta es,hay alguna manera de salvar esto y hacer que solo busque en
la tabla necesaria? el procedimiento no se usa demasiado, asi que no me
importa que se recompile muchas veces.Yo he pensado en sql dinamico,pero me
parece un poco chapucero.
Otra pregunta:Las tablas de operaciones mensuales son muy utilizadas en mi
sistema.Cuando ejecuto una select normal sobre la vista,si la consulta es
pesada se generan un monton de bloqueos en la bbdd.Sabeis a que puede ser
debido?

Gracias por todo y perdonar que no ponga los scripts pero no tengo acceso
ahora mismo al servidor.Espero haber sido claro, cualquier ayuda la
agradecere.

Un saludo.
 

Leer las respuestas

#1 Ele
16/06/2006 - 01:34 | Informe spam
hola sobre los bloqueos checa esta instruccion SET TRANSACTION ISOLATION
LEVEL
acerca de la vista pues es tema de indices en la vista. Pero la opcion que
yo haria asi como esta el diseño es que solo consultaras un mes y si hacerlo
dinamico
Por ejemplo para cada mes agregar codigo asi
If DatePart(mm,@Fecha) = 1
Begin
select * from enero where Fecha = @Fecha
End
la desventaja es que no funciona con rango de fechas

"Silverius" escribió en el mensaje
news:
Hola a todos,

Tengo un conjunto de operaciones particionado por meses en varias tablas

create table OperacionesEnero(id int,codigo int,fecha datetime)
create table OperacionesFebrero(id int,codigo int,fecha datetime)
asi hasta varios meses (cada tabla tiene una constraint en "fecha"
para
que los datos no puedan estar fuera de ese mes)

Y una vista que unifica estas tablas
create view VistaUnificada
as
select id,codigo,fecha from OperacionesEnero union all
select id,codigo,fecha from OperacionesEnero..

Se que no es el mejor diseño, pero es como esta y cambiarlo nos es ahora
mismo imposible.

El caso es que cuando ejecuto una consulta, por ejemplo
select * from VistaUnificada where fecha='20060615',el plan de consulta
muestra que solo se busca en la tabla de Junio.Pero cuendo hago un
procedimiento como:select * from VistaUnificada where fecha=@fecha y lo
ejecuto, el plan de consulta muestra que se busca en todas las tablas.En
la
practica,con el parametro tarda tambien muchisimo mas.
Entiendo que esto sera debido a que el servidor tiene que crear un plan de
ejecucion generico, ya que no sabe que contendra el parametro.


Mi pregunta es,hay alguna manera de salvar esto y hacer que solo busque en
la tabla necesaria? el procedimiento no se usa demasiado, asi que no me
importa que se recompile muchas veces.Yo he pensado en sql dinamico,pero
me
parece un poco chapucero.
Otra pregunta:Las tablas de operaciones mensuales son muy utilizadas en mi
sistema.Cuando ejecuto una select normal sobre la vista,si la consulta es
pesada se generan un monton de bloqueos en la bbdd.Sabeis a que puede ser
debido?

Gracias por todo y perdonar que no ponga los scripts pero no tengo acceso
ahora mismo al servidor.Espero haber sido claro, cualquier ayuda la
agradecere.

Un saludo.


Preguntas similares