Mejora rendimiento utilizando vistas frente sql dinamico

17/03/2006 - 00:46 por Silverius | Informe spam
Hola a todos,

Tenemos una bbdd con tablas mensuales de unos 3 millones de registros (no me
digais por favor el error de trabajar asi,que ya esta tenido en cuenta,pero
la aplicacion esta asi ahora mismo y es complejo cambiarla).Estas tablas se
consultan mucho por una aplicacion en la que usamos sql dinamico para que
segun el rango de fechas atacar una tabla u otra, y se consultan por muchas
consultas distintas con parametros distintos.

La mayoria de las consultas son relativas a los 10 dias, y un porcentaje
menor de consultas llega a 30 dias.Otro 10 % de las consultas lo hacen
contra tablas anteriores.Cuando el rango de fechas comprende 2 tablas (no se
pueden consultar mas de 2) hacemos un union en la consulta dinamica.Como
estamos modificando la aplicacion poco a poco, lo primero que he pensado es
en crear una vista sobre digamos los dos ultimos meses, y solo en caso de
que la consulta sea contra fechas anteriores seguir usando el sqldinamico de
antes,sino hacerlo contra la vista.La pregunta es:

-Creeis que es una buena opcion para mejorar el rendimiento de forma
notable?
-En las tablas se agregan filas con una cadencia aproximada de 3 por
segundo en momentos punta, esto afectara a la vista?

Todas las opiniones o consejos son agradecidos,aunque como digo que no
impliquen cambiar totalmente la arquitectura de golpe por favor

Gracias y un saludo.

Preguntas similare

Leer las respuestas

#6 Silverius
17/03/2006 - 17:25 | Informe spam
Gracias Alejandro,
Me saldria una vista de 150 millones de registros, de los que solo se
consultan habitualmente un 10 %.No crees que es exagerado?
Por eso proponia sobre 2 meses solo.La cosa es que no puedo hacer el select
sobre solo una columna ya que se ataca esta tabla de muchas formas
distintas,pero los indices ya estab en las tablas base,que son los que me
valdrian.

"Alejandro Mesa" escribió en el
mensaje news:
Silverius,

Te recomiendo leas en los BOL sobre las vistas particionadas. Pudieras


crear
una tabla para cada mes, poniendo una restriccion en cada tabla y usando


esta
columna como clave primaria (al menos primera columna de esta pk) y


armando
una vista que sea el "union all" de las tablas. Luego haces la select


sobre
la vista usando la columna usada para particionar.

Using Partitions in a Microsoft SQL Server 2000 Data Warehouse



http://msdn.microsoft.com/library/d...nsql2k/htm
l/partitionsindw.asp


AMB

"Silverius" wrote:

> Hola a todos,
>
> Tenemos una bbdd con tablas mensuales de unos 3 millones de registros


(no me
> digais por favor el error de trabajar asi,que ya esta tenido en


cuenta,pero
> la aplicacion esta asi ahora mismo y es complejo cambiarla).Estas tablas


se
> consultan mucho por una aplicacion en la que usamos sql dinamico para


que
> segun el rango de fechas atacar una tabla u otra, y se consultan por


muchas
> consultas distintas con parametros distintos.
>
> La mayoria de las consultas son relativas a los 10 dias, y un porcentaje
> menor de consultas llega a 30 dias.Otro 10 % de las consultas lo hacen
> contra tablas anteriores.Cuando el rango de fechas comprende 2 tablas


(no se
> pueden consultar mas de 2) hacemos un union en la consulta dinamica.Como
> estamos modificando la aplicacion poco a poco, lo primero que he pensado


es
> en crear una vista sobre digamos los dos ultimos meses, y solo en caso


de
> que la consulta sea contra fechas anteriores seguir usando el


sqldinamico de
> antes,sino hacerlo contra la vista.La pregunta es:
>
> -Creeis que es una buena opcion para mejorar el rendimiento de forma
> notable?
> -En las tablas se agregan filas con una cadencia aproximada de 3 por
> segundo en momentos punta, esto afectara a la vista?
>
> Todas las opiniones o consejos son agradecidos,aunque como digo que no
> impliquen cambiar totalmente la arquitectura de golpe por favor
>
> Gracias y un saludo.
>
>
>
Respuesta Responder a este mensaje
#7 Guillermo Roldán
17/03/2006 - 18:22 | Informe spam
Hola de nuevo, Silverius

En principio, poco más se me ocurre, sin disponer un mayor detalle.

De cualquier modo, si tienes identificado algún proceso o alguna consulta
que deseas mejorar, estaremos encantados de poder ayudarte. Hay muchas cosas
que pudieran ser... por ejemplo, cuando se trabaja con subconsultas IN, en
determinados casos el uso de tablas temporales puede reducir tiempos de
varios segundos a ser instantáneo...

Para lo que quieras,
Guillermo Roldán




"Silverius" escribió en el mensaje
news:
Gracias Guillermo, pero la verdad me he quedado un poco igual que estaba
con
tu respuesta.Se cuales son los motivos de perdida de rendimiento,pero en
este caso no es tanto la teoria sino como la practica e intentar hacer los
menores cambios posibles para conseguir el mayor rendimiento.
Logicamente se que para averiguar las posibles mejoras hay que medir y
tracear,pero eso ya esta hecho.Ahora pregunto si esta medida en concreto
es
apropiada,u otras ideas que me podais dar para esto como me comenta
Alejandro en la respuesta anterior.

Gracias de todas formas y un saludo.



"Guillermo Roldan" escribió en
el mensaje news:
Hola Silverius,

Habitualmente, la mejora de rendimiento se suele conseguir principalmente
con una indexación apropiada, partiendo que actualices estadísticas
habitualmente, o bien, re-construyas índices habitualmente (ya sea
manualmente o por Plan de Mantenimiento) que a fin de cuentas, también
actualiza estadísticas.

Otra razón de pérdida de rendimiento, podrían ser los bloqueos.

Puedes ayudarte de trazas, para identificar qué consultas se demoran,
bloqueos, etc.

De cualquier modo, si no consigues mejorar el rendimiento porque se
lanzan
consultas que actúan sobre grandes conjuntos de registros para hallar


medias,
totales, y estadísticas en general, estarás ante un escenario ideal para
implementar Analysis Services.

Saludos,
Guillermo Roldán
"Silverius" escribió:

> Hola a todos,
>
> Tenemos una bbdd con tablas mensuales de unos 3 millones de registros


(no me
> digais por favor el error de trabajar asi,que ya esta tenido en


cuenta,pero
> la aplicacion esta asi ahora mismo y es complejo cambiarla).Estas
> tablas


se
> consultan mucho por una aplicacion en la que usamos sql dinamico para


que
> segun el rango de fechas atacar una tabla u otra, y se consultan por


muchas
> consultas distintas con parametros distintos.
>
> La mayoria de las consultas son relativas a los 10 dias, y un
> porcentaje
> menor de consultas llega a 30 dias.Otro 10 % de las consultas lo hacen
> contra tablas anteriores.Cuando el rango de fechas comprende 2 tablas


(no se
> pueden consultar mas de 2) hacemos un union en la consulta
> dinamica.Como
> estamos modificando la aplicacion poco a poco, lo primero que he
> pensado


es
> en crear una vista sobre digamos los dos ultimos meses, y solo en caso


de
> que la consulta sea contra fechas anteriores seguir usando el


sqldinamico de
> antes,sino hacerlo contra la vista.La pregunta es:
>
> -Creeis que es una buena opcion para mejorar el rendimiento de
> forma
> notable?
> -En las tablas se agregan filas con una cadencia aproximada de 3
> por
> segundo en momentos punta, esto afectara a la vista?
>
> Todas las opiniones o consejos son agradecidos,aunque como digo que no
> impliquen cambiar totalmente la arquitectura de golpe por favor
>
> Gracias y un saludo.
>
>
>




Respuesta Responder a este mensaje
#8 Alejandro Mesa
17/03/2006 - 20:23 | Informe spam
Silverius,

Por eso te puse que leyeras un poco sobre vistas particionadas en los libros
en linea de sql server. No importa cuantas filas tenga esa vista (por aca
tengo una de 450 millones de filas). Lo importante es particionar la data de
acuerdo a como la consultas. Cuando envias una consulta por la columna que
particionastes, SQL Server usara solo la tabla que continene ese rango. De
acuerdo a tus especificaciones, una vista particionada te vendria como anillo
al dedo.


AMB

"Silverius" wrote:

Gracias Alejandro,
Me saldria una vista de 150 millones de registros, de los que solo se
consultan habitualmente un 10 %.No crees que es exagerado?
Por eso proponia sobre 2 meses solo.La cosa es que no puedo hacer el select
sobre solo una columna ya que se ataca esta tabla de muchas formas
distintas,pero los indices ya estab en las tablas base,que son los que me
valdrian.

"Alejandro Mesa" escribió en el
mensaje news:
> Silverius,
>
> Te recomiendo leas en los BOL sobre las vistas particionadas. Pudieras
crear
> una tabla para cada mes, poniendo una restriccion en cada tabla y usando
esta
> columna como clave primaria (al menos primera columna de esta pk) y
armando
> una vista que sea el "union all" de las tablas. Luego haces la select
sobre
> la vista usando la columna usada para particionar.
>
> Using Partitions in a Microsoft SQL Server 2000 Data Warehouse
>
http://msdn.microsoft.com/library/d...nsql2k/htm
l/partitionsindw.asp
>
>
> AMB
>
> "Silverius" wrote:
>
> > Hola a todos,
> >
> > Tenemos una bbdd con tablas mensuales de unos 3 millones de registros
(no me
> > digais por favor el error de trabajar asi,que ya esta tenido en
cuenta,pero
> > la aplicacion esta asi ahora mismo y es complejo cambiarla).Estas tablas
se
> > consultan mucho por una aplicacion en la que usamos sql dinamico para
que
> > segun el rango de fechas atacar una tabla u otra, y se consultan por
muchas
> > consultas distintas con parametros distintos.
> >
> > La mayoria de las consultas son relativas a los 10 dias, y un porcentaje
> > menor de consultas llega a 30 dias.Otro 10 % de las consultas lo hacen
> > contra tablas anteriores.Cuando el rango de fechas comprende 2 tablas
(no se
> > pueden consultar mas de 2) hacemos un union en la consulta dinamica.Como
> > estamos modificando la aplicacion poco a poco, lo primero que he pensado
es
> > en crear una vista sobre digamos los dos ultimos meses, y solo en caso
de
> > que la consulta sea contra fechas anteriores seguir usando el
sqldinamico de
> > antes,sino hacerlo contra la vista.La pregunta es:
> >
> > -Creeis que es una buena opcion para mejorar el rendimiento de forma
> > notable?
> > -En las tablas se agregan filas con una cadencia aproximada de 3 por
> > segundo en momentos punta, esto afectara a la vista?
> >
> > Todas las opiniones o consejos son agradecidos,aunque como digo que no
> > impliquen cambiar totalmente la arquitectura de golpe por favor
> >
> > Gracias y un saludo.
> >
> >
> >



Respuesta Responder a este mensaje
#9 Silverius
21/03/2006 - 00:16 | Informe spam
Gracias Guilleromo, la verdad es ue esto ultimo que has dicho si me
interesa,ya que aui tenemos el famoso caso de los arrays en sql.Como
solventas el problema de los IN?

Gracias y un saludo.


"Guillermo Roldán" escribió en el
mensaje news:
Hola de nuevo, Silverius

En principio, poco más se me ocurre, sin disponer un mayor detalle.

De cualquier modo, si tienes identificado algún proceso o alguna consulta
que deseas mejorar, estaremos encantados de poder ayudarte. Hay muchas


cosas
que pudieran ser... por ejemplo, cuando se trabaja con subconsultas IN, en
determinados casos el uso de tablas temporales puede reducir tiempos de
varios segundos a ser instantáneo...

Para lo que quieras,
Guillermo Roldán




"Silverius" escribió en el mensaje
news:
> Gracias Guillermo, pero la verdad me he quedado un poco igual que estaba
> con
> tu respuesta.Se cuales son los motivos de perdida de rendimiento,pero en
> este caso no es tanto la teoria sino como la practica e intentar hacer


los
> menores cambios posibles para conseguir el mayor rendimiento.
> Logicamente se que para averiguar las posibles mejoras hay que medir y
> tracear,pero eso ya esta hecho.Ahora pregunto si esta medida en concreto
> es
> apropiada,u otras ideas que me podais dar para esto como me comenta
> Alejandro en la respuesta anterior.
>
> Gracias de todas formas y un saludo.
>
>
>
> "Guillermo Roldan" escribió


en
> el mensaje news:
>> Hola Silverius,
>>
>> Habitualmente, la mejora de rendimiento se suele conseguir


principalmente
>> con una indexación apropiada, partiendo que actualices estadísticas
>> habitualmente, o bien, re-construyas índices habitualmente (ya sea
>> manualmente o por Plan de Mantenimiento) que a fin de cuentas, también
>> actualiza estadísticas.
>>
>> Otra razón de pérdida de rendimiento, podrían ser los bloqueos.
>>
>> Puedes ayudarte de trazas, para identificar qué consultas se demoran,
>> bloqueos, etc.
>>
>> De cualquier modo, si no consigues mejorar el rendimiento porque se
>> lanzan
>> consultas que actúan sobre grandes conjuntos de registros para hallar
> medias,
>> totales, y estadísticas en general, estarás ante un escenario ideal


para
>> implementar Analysis Services.
>>
>> Saludos,
>> Guillermo Roldán
>> "Silverius" escribió:
>>
>> > Hola a todos,
>> >
>> > Tenemos una bbdd con tablas mensuales de unos 3 millones de registros
> (no me
>> > digais por favor el error de trabajar asi,que ya esta tenido en
> cuenta,pero
>> > la aplicacion esta asi ahora mismo y es complejo cambiarla).Estas
>> > tablas
> se
>> > consultan mucho por una aplicacion en la que usamos sql dinamico para
> que
>> > segun el rango de fechas atacar una tabla u otra, y se consultan por
> muchas
>> > consultas distintas con parametros distintos.
>> >
>> > La mayoria de las consultas son relativas a los 10 dias, y un
>> > porcentaje
>> > menor de consultas llega a 30 dias.Otro 10 % de las consultas lo


hacen
>> > contra tablas anteriores.Cuando el rango de fechas comprende 2 tablas
> (no se
>> > pueden consultar mas de 2) hacemos un union en la consulta
>> > dinamica.Como
>> > estamos modificando la aplicacion poco a poco, lo primero que he
>> > pensado
> es
>> > en crear una vista sobre digamos los dos ultimos meses, y solo en


caso
> de
>> > que la consulta sea contra fechas anteriores seguir usando el
> sqldinamico de
>> > antes,sino hacerlo contra la vista.La pregunta es:
>> >
>> > -Creeis que es una buena opcion para mejorar el rendimiento de
>> > forma
>> > notable?
>> > -En las tablas se agregan filas con una cadencia aproximada de 3
>> > por
>> > segundo en momentos punta, esto afectara a la vista?
>> >
>> > Todas las opiniones o consejos son agradecidos,aunque como digo que


no
>> > impliquen cambiar totalmente la arquitectura de golpe por favor
>> >
>> > Gracias y un saludo.
>> >
>> >
>> >
>
>


Respuesta Responder a este mensaje
#10 Silverius
21/03/2006 - 00:17 | Informe spam
Una ultima cosa Alejandro.No consulto la tabla por una sola columna,sino por
muchas.Esto implica algo en lo que me dices???

Gracias.


"Alejandro Mesa" escribió en el
mensaje news:
Silverius,

Por eso te puse que leyeras un poco sobre vistas particionadas en los


libros
en linea de sql server. No importa cuantas filas tenga esa vista (por aca
tengo una de 450 millones de filas). Lo importante es particionar la data


de
acuerdo a como la consultas. Cuando envias una consulta por la columna que
particionastes, SQL Server usara solo la tabla que continene ese rango. De
acuerdo a tus especificaciones, una vista particionada te vendria como


anillo
al dedo.


AMB

"Silverius" wrote:

> Gracias Alejandro,
> Me saldria una vista de 150 millones de registros, de los que solo se
> consultan habitualmente un 10 %.No crees que es exagerado?
> Por eso proponia sobre 2 meses solo.La cosa es que no puedo hacer el


select
> sobre solo una columna ya que se ataca esta tabla de muchas formas
> distintas,pero los indices ya estab en las tablas base,que son los que


me
> valdrian.
>
> "Alejandro Mesa" escribió en


el
> mensaje news:
> > Silverius,
> >
> > Te recomiendo leas en los BOL sobre las vistas particionadas. Pudieras
> crear
> > una tabla para cada mes, poniendo una restriccion en cada tabla y


usando
> esta
> > columna como clave primaria (al menos primera columna de esta pk) y
> armando
> > una vista que sea el "union all" de las tablas. Luego haces la select
> sobre
> > la vista usando la columna usada para particionar.
> >
> > Using Partitions in a Microsoft SQL Server 2000 Data Warehouse
> >
>


http://msdn.microsoft.com/library/d...nsql2k/htm
> l/partitionsindw.asp
> >
> >
> > AMB
> >
> > "Silverius" wrote:
> >
> > > Hola a todos,
> > >
> > > Tenemos una bbdd con tablas mensuales de unos 3 millones de


registros
> (no me
> > > digais por favor el error de trabajar asi,que ya esta tenido en
> cuenta,pero
> > > la aplicacion esta asi ahora mismo y es complejo cambiarla).Estas


tablas
> se
> > > consultan mucho por una aplicacion en la que usamos sql dinamico


para
> que
> > > segun el rango de fechas atacar una tabla u otra, y se consultan por
> muchas
> > > consultas distintas con parametros distintos.
> > >
> > > La mayoria de las consultas son relativas a los 10 dias, y un


porcentaje
> > > menor de consultas llega a 30 dias.Otro 10 % de las consultas lo


hacen
> > > contra tablas anteriores.Cuando el rango de fechas comprende 2


tablas
> (no se
> > > pueden consultar mas de 2) hacemos un union en la consulta


dinamica.Como
> > > estamos modificando la aplicacion poco a poco, lo primero que he


pensado
> es
> > > en crear una vista sobre digamos los dos ultimos meses, y solo en


caso
> de
> > > que la consulta sea contra fechas anteriores seguir usando el
> sqldinamico de
> > > antes,sino hacerlo contra la vista.La pregunta es:
> > >
> > > -Creeis que es una buena opcion para mejorar el rendimiento de


forma
> > > notable?
> > > -En las tablas se agregan filas con una cadencia aproximada de 3


por
> > > segundo en momentos punta, esto afectara a la vista?
> > >
> > > Todas las opiniones o consejos son agradecidos,aunque como digo que


no
> > > impliquen cambiar totalmente la arquitectura de golpe por favor
> > >
> > > Gracias y un saludo.
> > >
> > >
> > >
>
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida