![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
Consultas IBQuery
Hola a todos y gracias de antemano, tengo una tabla de firebird de la cual debo eliminar una gran cantidad de registros (+ de 1000,000 ), la cosa es que la eliminacion me va muy lenta, quisiera saber si hay una forma mas rapida de hacerlo o como me recomiendan relizar la eliminacion, mi codigo esta algo asi:
select * from remision where fecha <= :xFecha; luego de filtrar hago la eliminacion mediante un while not EOF do begin delete; next; end; funciona todo bien pero lo he dejado correr mas de 3 horas y no termina... segun mis calculos elimina 1000 registros en aproximadamente una hora ... ojala me puedan ayudar...
__________________
Nadie puede separar su fe de sus actos, o sus creencias de sus afanes |
#3
|
||||
|
||||
Gracias por tu pronta respuesta... de hecho fue mi primer opcion pero al ver la problematica (lentitud) estuve leyendo po ahi y encontre el bucle, y hago un commit cada 1000 registros para no saturar el cache.. pero aun asi sigue lentisimo y solo quiesiera saber si hay otro metodo ojala tengas algo , gracias otra vez
__________________
Nadie puede separar su fe de sus actos, o sus creencias de sus afanes Última edición por roman fecha: 02-03-2010 a las 02:02:33. Razón: Agregar etiquetas [delphi para mayor legibilidad del código |
#4
|
||||
|
||||
Bueno, mira, yo no conozco Firebird pero podría jurar que la consulta DELETE siempre va a ser más rápida y eficiente que un ciclo, pues este ciclo, muy posiblemente se limite a hacer un DELETE sobre cada uno de los registros.
Ahora bien, aunque, como te digo, no conozco Firebird, se me ocurren dos considerandos generales que podrían ayudar: primero asegurarte que tu tabla tiene un índice sobre el campo fecha, pues de esta manera, el motor encontrará mucho más rápido los registros que debe borrar. Segundo, si lo anterior no funciona, entonces quizá debas probar desactivando los índices. Toma en cuenta que si tu tabla tiene definidos muchos índices, todos ellos deben actualizarse al borra registros. // Saludos |
#5
|
||||
|
||||
pues no se lo que los demas opinen, pero creo que un ciclo While con su respectiva transacción (commit) es mil veces más lenta que la instrucción delete que propone maese Roman....
![]()
__________________
|
#6
|
||||
|
||||
Hombre está claro que un DELETE va a ir más rápido que un WHILE, puesto que al primero le dejas total libertada al motor SQL para definir el recorrido del borrado, etc. ...
Pero la diferencia será mínima, y desde luego no puede explicar una demora de horas para hacer ese borrado. En mi opinión estoy convencido de que tu problema vienen dado por los triggers que tienes en esa tabla. Cada vez que borras un registro (independientemente de si lo has borrado con un DELETE o mediante un bucle), se dispara el trigger correspondiente, el cual debe hacer un montón de cálculos, por lo que parece. Si esto lo multiplicas por los 100.000 registros que quieres borrar, pues de ahí viene esa lentitud. Resumiendo, olvídate de como haces el borrado y examina lo que hacen los triggers que se disparan para cada registro borrado. Quizás quieras desactivar esos triggers antes de empezar el borrado.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#7
|
||||
|
||||
Evidentemente el "delete" es más rápido que el bucle, pero estoy con guillotmarc en que deben existir triggers o procedimientos que se ejecutan al borrar, debes desactivarlo antes y verás que se borra todo en un "santiamén"
![]() |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Consultas SQL V.S. Consultas Clipper | AGAG4 | SQL | 7 | 20-12-2005 15:59:31 |
Refresh de un IBQuery | perillan | Conexión con bases de datos | 1 | 28-08-2005 20:43:12 |
Filter en IBQuery | StartKill | Firebird e Interbase | 1 | 27-08-2005 06:51:06 |
IBDataSet - IBQuery | dmagui | Firebird e Interbase | 0 | 14-06-2005 16:24:40 |
query Vs. IBquery | Eolo | Conexión con bases de datos | 0 | 11-02-2004 18:54:24 |
![]() |
|