Borrado extremadamente lento

09/02/2006 - 16:56 por Jesús | Informe spam
Hola:
Necesito un poco de ayuda. Trato de explicar la situación. Tengo una
tabla TA con su clave primaria compuesta de un sólo campo A y una tabla TB
con su clave primaria compuesta de un sólo campo B. Con estas dos tablas
implemento una relación muchos a muchos en una tabla TAB con clave primaria
en los campos A y B que a su vez son clave ajena de las tablas TA y TB
respectivamente. Además tengo 15 tablas con los campos A y B formando clave
ajena contra la tabla TAB. Hasta aquí nada del otro mundo.
Mi problema viene al intentar borrar registros de la tabla TAB de la
forma "delete from TAB where A=@valor" ya que tarda una eternidad. El
problema es evidentemente la integridad referencial ya que si antes del
borrado deshabilito las relaciones de todas la tablas con la tabla TAB
entonces el borrado es casi inmediato. Esto no es solución ya que en el
periodo que están deshabilitadas las relaciones podrían entrar datos
incoherentes. LA tabla TAB tiene 5 millones y medio de registros y las otras
15 tienen un media de casi el millón de registros.
Por favor, ¿me podéis echar una mano para poder resolver esto? No sé
por donde tratar de buscar la solución.
Gracias de antemano y perdón por el tostón de explicación pero creo que
era necesario.

Jesús Corbí.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
09/02/2006 - 17:06 | Informe spam
Jesús,

Asegurate que en cada una de las 15 tablas que referencian a la tabla TAB,
existe un indice por las columnas A y B o B y A segun la selectividad de las
mismas. SQL Server no crea un indice cuando creamos una restriccion de clave
foranea.


AMB

"Jesús" wrote:

Hola:
Necesito un poco de ayuda. Trato de explicar la situación. Tengo una
tabla TA con su clave primaria compuesta de un sólo campo A y una tabla TB
con su clave primaria compuesta de un sólo campo B. Con estas dos tablas
implemento una relación muchos a muchos en una tabla TAB con clave primaria
en los campos A y B que a su vez son clave ajena de las tablas TA y TB
respectivamente. Además tengo 15 tablas con los campos A y B formando clave
ajena contra la tabla TAB. Hasta aquí nada del otro mundo.
Mi problema viene al intentar borrar registros de la tabla TAB de la
forma "delete from TAB where A=@valor" ya que tarda una eternidad. El
problema es evidentemente la integridad referencial ya que si antes del
borrado deshabilito las relaciones de todas la tablas con la tabla TAB
entonces el borrado es casi inmediato. Esto no es solución ya que en el
periodo que están deshabilitadas las relaciones podrían entrar datos
incoherentes. LA tabla TAB tiene 5 millones y medio de registros y las otras
15 tienen un media de casi el millón de registros.
Por favor, ¿me podéis echar una mano para poder resolver esto? No sé
por donde tratar de buscar la solución.
Gracias de antemano y perdón por el tostón de explicación pero creo que
era necesario.

Jesús Corbí.
Respuesta Responder a este mensaje
#2 Maxi
09/02/2006 - 17:10 | Informe spam
Hola, en las tablas TAB revisa que por los campos que se este haciendo la
relacion tenga indices. De no ser asi ahi tienes el problema


Salu2
Maxi [MVP SQL SERVER]
www.sqlgurus.org


"Jesús" escribió en el mensaje
news:
Hola:
Necesito un poco de ayuda. Trato de explicar la situación. Tengo una
tabla TA con su clave primaria compuesta de un sólo campo A y una tabla TB
con su clave primaria compuesta de un sólo campo B. Con estas dos tablas
implemento una relación muchos a muchos en una tabla TAB con clave
primaria
en los campos A y B que a su vez son clave ajena de las tablas TA y TB
respectivamente. Además tengo 15 tablas con los campos A y B formando
clave
ajena contra la tabla TAB. Hasta aquí nada del otro mundo.
Mi problema viene al intentar borrar registros de la tabla TAB de la
forma "delete from TAB where A=@valor" ya que tarda una eternidad. El
problema es evidentemente la integridad referencial ya que si antes del
borrado deshabilito las relaciones de todas la tablas con la tabla TAB
entonces el borrado es casi inmediato. Esto no es solución ya que en el
periodo que están deshabilitadas las relaciones podrían entrar datos
incoherentes. LA tabla TAB tiene 5 millones y medio de registros y las
otras
15 tienen un media de casi el millón de registros.
Por favor, ¿me podéis echar una mano para poder resolver esto? No sé
por donde tratar de buscar la solución.
Gracias de antemano y perdón por el tostón de explicación pero creo
que
era necesario.

Jesús Corbí.
Respuesta Responder a este mensaje
#3 Jesús
09/02/2006 - 18:22 | Informe spam
Gracias por la respuesta.
Otra pregunta a raíz de vuestros consejos. ¿El índice lo debería crear por
los dos campos o dos índices uno por cada campo?. ¿Cómo repercute el añadir
esos índices en los SELECT, INSERT y UPDATES de esas tablas?

De nuevo gracias por anticipado


"Jesús" escribió:

Hola:
Necesito un poco de ayuda. Trato de explicar la situación. Tengo una
tabla TA con su clave primaria compuesta de un sólo campo A y una tabla TB
con su clave primaria compuesta de un sólo campo B. Con estas dos tablas
implemento una relación muchos a muchos en una tabla TAB con clave primaria
en los campos A y B que a su vez son clave ajena de las tablas TA y TB
respectivamente. Además tengo 15 tablas con los campos A y B formando clave
ajena contra la tabla TAB. Hasta aquí nada del otro mundo.
Mi problema viene al intentar borrar registros de la tabla TAB de la
forma "delete from TAB where A=@valor" ya que tarda una eternidad. El
problema es evidentemente la integridad referencial ya que si antes del
borrado deshabilito las relaciones de todas la tablas con la tabla TAB
entonces el borrado es casi inmediato. Esto no es solución ya que en el
periodo que están deshabilitadas las relaciones podrían entrar datos
incoherentes. LA tabla TAB tiene 5 millones y medio de registros y las otras
15 tienen un media de casi el millón de registros.
Por favor, ¿me podéis echar una mano para poder resolver esto? No sé
por donde tratar de buscar la solución.
Gracias de antemano y perdón por el tostón de explicación pero creo que
era necesario.

Jesús Corbí.
Respuesta Responder a este mensaje
#4 Salvador Ramos
09/02/2006 - 18:31 | Informe spam
Hola,

Deberías añadir un índice a cada tabla por los campos que formen la clave
externa (en tu caso por los dos). Las repercusiones en cuanto a los
insert/update/delete sobre estas tablas no son significativas en absoluto,
mientras que la mejora del rendimiento de tus consultas si que va a ser
notable.

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL Server y .NET)


"Jesús" escribió en el mensaje
news:
Gracias por la respuesta.
Otra pregunta a raíz de vuestros consejos. ¿El índice lo debería crear por
los dos campos o dos índices uno por cada campo?. ¿Cómo repercute el
añadir
esos índices en los SELECT, INSERT y UPDATES de esas tablas?

De nuevo gracias por anticipado


"Jesús" escribió:

Hola:
Necesito un poco de ayuda. Trato de explicar la situación. Tengo una
tabla TA con su clave primaria compuesta de un sólo campo A y una tabla
TB
con su clave primaria compuesta de un sólo campo B. Con estas dos tablas
implemento una relación muchos a muchos en una tabla TAB con clave
primaria
en los campos A y B que a su vez son clave ajena de las tablas TA y TB
respectivamente. Además tengo 15 tablas con los campos A y B formando
clave
ajena contra la tabla TAB. Hasta aquí nada del otro mundo.
Mi problema viene al intentar borrar registros de la tabla TAB de la
forma "delete from TAB where A=@valor" ya que tarda una eternidad. El
problema es evidentemente la integridad referencial ya que si antes del
borrado deshabilito las relaciones de todas la tablas con la tabla TAB
entonces el borrado es casi inmediato. Esto no es solución ya que en el
periodo que están deshabilitadas las relaciones podrían entrar datos
incoherentes. LA tabla TAB tiene 5 millones y medio de registros y las
otras
15 tienen un media de casi el millón de registros.
Por favor, ¿me podéis echar una mano para poder resolver esto? No sé
por donde tratar de buscar la solución.
Gracias de antemano y perdón por el tostón de explicación pero creo
que
era necesario.

Jesús Corbí.
Respuesta Responder a este mensaje
#5 Jesús
09/02/2006 - 19:39 | Informe spam
Vuelvo a molestar otra vez, es que estoy un poco pez en el asunto.
¿El índice debe ser agrupado o no agrupado y con qué factor de relleno?

Gracias de nuevo.

Jesús.



"Salvador Ramos" escribió:

Hola,

Deberías añadir un índice a cada tabla por los campos que formen la clave
externa (en tu caso por los dos). Las repercusiones en cuanto a los
insert/update/delete sobre estas tablas no son significativas en absoluto,
mientras que la mejora del rendimiento de tus consultas si que va a ser
notable.

Un saludo
Salvador Ramos
Murcia - España

[Microsoft MVP SQL Server]
www.helpdna.net (información sobre SQL Server y .NET)


"Jesús" escribió en el mensaje
news:
> Gracias por la respuesta.
> Otra pregunta a raíz de vuestros consejos. ¿El índice lo debería crear por
> los dos campos o dos índices uno por cada campo?. ¿Cómo repercute el
> añadir
> esos índices en los SELECT, INSERT y UPDATES de esas tablas?
>
> De nuevo gracias por anticipado
>
>
> "Jesús" escribió:
>
>> Hola:
>> Necesito un poco de ayuda. Trato de explicar la situación. Tengo una
>> tabla TA con su clave primaria compuesta de un sólo campo A y una tabla
>> TB
>> con su clave primaria compuesta de un sólo campo B. Con estas dos tablas
>> implemento una relación muchos a muchos en una tabla TAB con clave
>> primaria
>> en los campos A y B que a su vez son clave ajena de las tablas TA y TB
>> respectivamente. Además tengo 15 tablas con los campos A y B formando
>> clave
>> ajena contra la tabla TAB. Hasta aquí nada del otro mundo.
>> Mi problema viene al intentar borrar registros de la tabla TAB de la
>> forma "delete from TAB where A=@valor" ya que tarda una eternidad. El
>> problema es evidentemente la integridad referencial ya que si antes del
>> borrado deshabilito las relaciones de todas la tablas con la tabla TAB
>> entonces el borrado es casi inmediato. Esto no es solución ya que en el
>> periodo que están deshabilitadas las relaciones podrían entrar datos
>> incoherentes. LA tabla TAB tiene 5 millones y medio de registros y las
>> otras
>> 15 tienen un media de casi el millón de registros.
>> Por favor, ¿me podéis echar una mano para poder resolver esto? No sé
>> por donde tratar de buscar la solución.
>> Gracias de antemano y perdón por el tostón de explicación pero creo
>> que
>> era necesario.
>>
>> Jesús Corbí.



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida