Pregunta

Tuve que borrar todas las filas de una tabla de registro que contenía alrededor de 5 millones de filas.Mi primer intento fue para emitir el comando siguiente en el analizador de consultas:

eliminar de client_log

que tomó un tiempo muy largo.

¿Fue útil?

Solución

Echa un vistazo truncate table que es mucho más rápido.

Otros consejos

Descubrí el TRUNCATE TABLE en la msdn referencia de transact-SQL.Para todos los interesados aquí están los comentarios:

TRUNCATE TABLE es funcionalmente idéntica a la instrucción DELETE sin cláusula where:eliminar todas las filas en la tabla.Pero TRUNCATE TABLE es más rápido y utiliza menos del sistema de registro de transacciones y recursos de ELIMINAR.

La instrucción DELETE elimina una a una las filas y registra una entrada en el registro de transacciones para cada fila eliminada.TRUNCATE TABLE elimina los datos por la cancelación de la asignación de las páginas de datos utilizada para almacenar los datos de la tabla, y sólo la página deallocations se registran en el registro de transacciones.

TRUNCATE TABLE elimina todas las filas de una tabla, pero la estructura de la tabla y sus columnas, restricciones, índices y demás permanecen.El contador utilizado por una identidad para las nuevas filas se restablece a la semilla para la columna.Si desea conservar la identidad contador de uso ELIMINAR en su lugar.Si desea quitar la definición de la tabla y sus datos, utilice la instrucción DROP TABLE.

Usted no puede usar TRUNCATE TABLE en una tabla que hace referencia a una restricción de CLAVE externa;en su lugar, utilice la instrucción DELETE sin una cláusula where.Porque TRUNCATE TABLE no se registra, no puede activar un trigger.

TRUNCATE TABLE no puede ser utilizado en las tablas que participan en una vista indizada.

Hay un mito común que TRUNCAR de alguna manera se salta de registro de transacciones.

Esto es una equivocación, y se menciona claramente en MSDN.

Este mito se invoca en varios comentarios aquí.Vamos a erradicar juntos ;)

Para referencia TRUNCATE TABLE también funciona en MySQL

olvidar truncate y eliminar.mantener sus definiciones de tabla (en el caso de que quiera volver a crearla) y sólo tiene que utilizar drop table.

Puedo usar el siguiente método para la puesta a cero de las tablas, con la ventaja añadida de que me deja con una copia de archivo de la tabla.

CREATE TABLE `new_table` LIKE `table`;
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`;

truncate table es no SQL-independiente de la plataforma.Si usted sospecha que usted podría cambiar la base de datos de proveedores, usted puede tener cuidado de usar de ella.

En SQL Server, puede utilizar la Truncate Table comando que es más rápido que un regular eliminar y también utiliza menos recursos.Esto restablecerá los campos de la identidad de vuelta a la semilla valor.

Los inconvenientes de truncar son que no se puede utilizar en las tablas de referencia claves foráneas y no desencadena ningún desencadenador.También usted no será capaz de deshacer los datos si algo va mal.

Tenga en cuenta que TRUNCAR también restablecer cualquier auto incremento llaves, si usted está utilizando los.

Si usted no desea perder su auto incremento teclas, usted puede acelerar el proceso de eliminar por eliminar en conjuntos (por ejemplo, ELIMINAR DE la tabla where id > 1 Y id < 10000).Va a acelerar de manera significativa y, en algunos casos, evitar que los datos de ser encerrado.

Sí, bueno, la eliminación de 5 millones de filas es, probablemente, va a tomar mucho tiempo.El único potencialmente más rápido de manera que se me ocurre sería eliminar la tabla y volver a crearla.Que sólo funciona, por supuesto, si desea eliminar TODOS los datos en la tabla.

truncate table client_log

es su mejor apuesta, truncar mata a todo el contenido de la tabla y los índices y restablece las semillas que tienes demasiado.

La sugerencia de "quitar y volver a crear la tabla", probablemente no es una buena debido a que se equivoca de seguridad de sus claves foráneas.

Usted ESTÁ usando claves foráneas, ¿verdad?

Si usted no puede usar TRUNCATE TABLE debido a claves externas y/o desencadenantes, puede considerar la posibilidad de:

  • la caída de todos los índices;
  • hacer lo de siempre ELIMINAR;
  • volver a crear todos los índices.

Esto puede acelerar ELIMINAR algo.

Estoy revisando mi comentario anterior:

Usted debe entender que mediante el uso de TRUNCAR los datos se borrarán, pero nada se registran en el registro de transacciones.La escritura en el registro es por eso que ELIMINAR llevará para siempre en 5 millones de filas.Puedo usar TRUNCATE a menudo durante el desarrollo, pero debe ser cauteloso a la hora de utilizarlo en la producción de la base de datos debido a que usted no será capaz de para deshacer los cambios.Usted debe de inmediato hacer una base de datos completa copia de seguridad después de hacer un TRUNCATE a establecer una nueva base para la restauración.

La declaración anterior fue la intención de pedirle que asegúrese de que usted entienda que existe diferencia entre los dos.Por desgracia, está mal escrito y hace incompatible declaraciones como no he hecho ninguna prueba a mí mismo entre los dos.Se basa en las declaraciones que he escuchado de otros.

De MSDN:

La instrucción DELETE elimina las filas de uno en un momento y registra una entrada en el registro de transacciones para cada fila eliminada.TRUNCATE TABLE elimina los datos por cancelación de la asignación de los datos de las páginas utilizadas para almacenar los datos de la tabla, y sólo el página deallocations se registran en el registro de transacciones.

Yo sólo quería decir que hay una diferencia fundamental entre los dos y porque hay una diferencia, habrá aplicaciones que uno o el otro puede ser inapropiado.

DELETE * FROM table_name;

Prematuro de optimización puede ser peligroso.La optimización puede significar hacer algo extraño, pero si funciona, es posible que desee tomar ventaja de ella.

SELECT DbVendor_SuperFastDeleteAllFunction(tablename, BOZO_BIT) FROM dummy;

Para la velocidad yo creo que depende de...

  • La base de datos subyacente:Oracle, Microsoft, MySQL, PostgreSQL, otros, personalizado...

  • La tabla de contenido, y las tablas relacionadas:

Puede haber reglas de eliminación.Hay un procedimiento existente para eliminar todo el contenido de la tabla?Este puede ser optimizado específicamente para el motor de base de datos?¿Cuánto nos preocupamos por romper cosas / datos relacionados?Realizar una eliminación puede ser el 'más segura' camino suponiendo que otras tablas relacionadas no depende de esta tabla.Hay otras tablas y consultas que están relacionados / dependen de los datos en esta tabla?Si no nos importa mucho acerca de esta tabla están a su alrededor, el uso de DROP podría ser un método rápido, de nuevo dependiendo de la base de datos subyacente.

DROP TABLE table_name;

Cuántas filas se eliminan?Hay otra información que rápidamente se está recogido que optimice la eliminación?Por ejemplo, podemos saber si la tabla está vacía?Podemos saber si hay cientos, miles, millones, miles de millones de filas?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top