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.

Preguntas similare

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.
Respuesta Responder a este mensaje
#2 J.A. García Barceló
30/06/2006 - 13:35 | Informe spam
http://www.sql-server-performance.c...istics.asp

[...]Bad statistics lead to bad execution plans. If an index is placed on a
small table, the optimal plan might be to ignore the index and use a table
scan. If the statistics are not updated while the table grows significantly,
SQL Server will still assume that the table is small and use the table scan,
even if this is no longer the optimal plan.[...]

Puedes usar UPDATE STATISTICS <tabla> para actualizar las estadísticas de
las tablas involucradas en tu problema. Comprueba también si la bbdd tiene
la activa la opcion auto-actualizar estadísticas (EXEC sp_dboption
'MyDatabase', ' auto update statistics', 'true')

Un saludo.

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.
Respuesta Responder a este mensaje
#3 Alejandro Mesa
30/06/2006 - 13:42 | Informe spam
edbufe1,

Si buscas una respuesta especifica a tu problema, entonces muestranos la
definicion de tus tablas, incluyendo restricciones e indices. De lo contrario
solo podemos darte una respuesta a ciegas. Que tal si nos muestras tambien la
manera en que borras el detalle?

La ayuda debe ser mutua.


AMB


"edbufe1" wrote:

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.
Respuesta Responder a este mensaje
#4 Victor Koch
30/06/2006 - 16:35 | Informe spam
Hola edbufe1

Tal ves la solución a tu problema pase por forzar un índice a utilizar

DELETE Ventas FROM Ventas WITH (INDEX = idxAño) WHERE Año = 2005

Un saludo, Víctor Koch.


"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.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida