indices de tablas

30/06/2006 - 12:11 por edbufe1 | Informe spam
Mi pregunta es la siguiente:

Yo tengo una tabla llamada detalles de albaranes con su clave primaria que
es el numero de albaran y un numero que me indica la linea del albaran. A
esta linea se le asocia una referencia de un articulo.

Bien, pues al borrar una linea de los detalles de albaranes tardaba mucho,
la tabla tiene 500000 registros aprox. y uno de los problemas es que hacía un
table scan buscando sobre la referencia de los albaranes. Entonces mi idea ha
sido crear un indice a este campo y el resultado ha sido magnifico. 10
segundos en borrarlo. Antes tardaba un minuto. Es un servidor de pruebas, en
el servidor normal eran 10 seg. y con el indice 1 seg. pero asi se ve mejor
la diferencia. pues bien pasado un rato he vuelto a borrar otro detalle y me
vuelve a tardar lo mismo y a hacer el table scan. He comprobado que los
indices estaban creados y he vuelto a intentarlo y otra vez tardaba mucho y
table scan. Lo he intentado otra vez y esta vez iba rapido y no hacía table
scan.
Alguien sabe porque con el indice creado unas veces hace table scan y otras
no. No ha pasado mas de 30 min en estas circunstancias y no se ha modificado
la tabla de articulos donde estan estas referencias.

Si alguien me pudiera informar lo agradecería gracias de antemano.
 

Leer las respuestas

#1 J.A. García Barceló
30/06/2006 - 13:31 | Informe spam
[...]En muchos casos, algunas instrucciones muy sencillas y que realizamos
habitualmente sobre la bases de datos pueden tener muy mala performance. El
caso que voy a analizar es el de la eliminación o actualización de un
registro en una tabla foránea relacionada mediante un constraint.[...]

http://www.mug.org.ar/SQL/ArticSQL/203.aspx

En el ejemplo de esa página explica que pasa cuando se intenta borrar un
registro (Familias) que es apuntado mediante una referencia de integridad
desde otra tabla (Productos). Es algo parecido a tu caso con detalles de
albarán y artículos (aunque no me queda claro en tu caso si la restriccion
de integridad va desde los articulos a los detalles de albarán o al revés).

[...]Esta verificación se realiza mediante un "Clustered Index Scan" sobre
productos que como dijimos, es en definitiva el scan sobre la tabla física.
Esto significa que si por ejemplo tuviéramos 1.000.000 de productos, al
borrar un registro sobre la tabla familias estaríamos haciendo un scan de
1.000.000 de registros para verificar simplemente que no se viola la
integridad referencial. Esto en ocasiones provoca que sistemas que en prueba
funcionan correctamente a medida que crece la información almacenada el
sistema se haga cada vez más lento.[...]

[..]Como el primer componente del índice es el campo a buscar, la búsqueda
es puntual y sumamente efectiva, y es por eso que en lugar de hacer un
"index scan" y revisar por completo el índice que habitualmente es más chico
y efectivo que revisar la tabla completa, hace un "index seek" y accede
puntualmente solo a los registros que requiere. Este tema lo vamos a ver en
las próximas notas y esta relacionado con la cardinalidad de la información
y las estadísticas disponibles, además de la existencia de estos
índices[...]

Tal vez las estadísticas no estén actualizadas (aunque el índice sí) y los
planes de ejecución no tengan información fiable sobre la que determinar
cual de los posibles planes será el mejor.

J.A. García Barceló
http://jagbarcelo.blogspot.com/


"edbufe1" escribió en el mensaje
news:
Mi pregunta es la siguiente:

Yo tengo una tabla llamada detalles de albaranes con su clave primaria que
es el numero de albaran y un numero que me indica la linea del albaran. A
esta linea se le asocia una referencia de un articulo.

Bien, pues al borrar una linea de los detalles de albaranes tardaba mucho,
la tabla tiene 500000 registros aprox. y uno de los problemas es que hacía
un
table scan buscando sobre la referencia de los albaranes. Entonces mi idea
ha
sido crear un indice a este campo y el resultado ha sido magnifico. 10
segundos en borrarlo. Antes tardaba un minuto. Es un servidor de pruebas,
en
el servidor normal eran 10 seg. y con el indice 1 seg. pero asi se ve
mejor
la diferencia. pues bien pasado un rato he vuelto a borrar otro detalle y
me
vuelve a tardar lo mismo y a hacer el table scan. He comprobado que los
indices estaban creados y he vuelto a intentarlo y otra vez tardaba mucho
y
table scan. Lo he intentado otra vez y esta vez iba rapido y no hacía
table
scan.
Alguien sabe porque con el indice creado unas veces hace table scan y
otras
no. No ha pasado mas de 30 min en estas circunstancias y no se ha
modificado
la tabla de articulos donde estan estas referencias.

Si alguien me pudiera informar lo agradecería gracias de antemano.

Preguntas similares