La forma más rápida de eliminar todos los datos en una tabla grande


Tuve que eliminar todas las filas de una tabla de registro que contenía alrededor de 5 millones de filas. Mi intento inicial fue emitir el siguiente comando en query analyzer:

Eliminar del client_log

Lo que llevó mucho tiempo.

Author: Joel Coehoorn, 2008-09-15

15 answers

Echa un vistazo a tabla truncada que es mucho más rápido.

 73
Author: Rob Walker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-16 10:40:29

Descubrí la TABLA TRUNCADA en la referencia transact-SQL de msdn. Para todos los interesados aquí están las observaciones:

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

La instrucción DELETE elimina filas de una en una y registra una entrada en el diario de transacciones para cada fila eliminada. TRUNCAR TABLA elimina los datos mediante la desasignación de las páginas de datos utilizadas para almacenar los datos de la tabla, y solo las desasignaciones de páginas 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, etc. permanecen. El contador utilizado por una identidad para nuevas filas se restablece a la semilla de la columna. Si desea conservar el contador de identidades, utilice ELIMINAR en su lugar. Si desea eliminar la definición de la tabla y sus datos, utilice la TABLA DESPLEGABLE instrucción.

No puede usar TRUNCATE TABLE en una tabla referenciada por una restricción de CLAVE FORÁNEA; en su lugar, use la instrucción DELETE sin una cláusula WHERE. Debido a que la TABLA TRUNCADA no está registrada, no puede activar un desencadenador.

La TABLA TRUNCADA no se puede utilizar en las tablas que participan en una vista indexada.

 32
Author: Ron Skufca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 15:50:33

Existe un mito común que TRUNCA de alguna manera omite el registro de transacciones.

Esto es un malentendido, y se menciona claramente en MSDN.

Este mito es invocado en varios comentarios aquí. Vamos a erradicarlo juntos;)

 13
Author: squadette,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 18:02:35

Para referencia TRUNCATE TABLE también funciona en MySQL

 6
Author: UnkwnTech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-11 08:05:06

Olvidar truncar y borrar. mantenga las definiciones de la tabla (en caso de que desee recrearla) y simplemente use drop table.

 3
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 18:57:04

Utilizo el siguiente método para poner a cero 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`;
 3
Author: dar7yl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 19:00:14

truncate table es no independiente de la plataforma SQL. Si sospecha que podría cambiar alguna vez los proveedores de bases de datos, es posible que tenga cuidado de usarlo.

 1
Author: James A. Rosen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 15:53:52

En SQL Server puede usar el comando Truncate Table que es más rápido que una eliminación normal y también usa menos recursos. También restablecerá cualquier campo de identidad al valor de semilla.

Los inconvenientes de truncate son que no se puede usar en tablas a las que se hace referencia con claves foráneas y no disparará ningún disparador. Además, no podrá revertir los datos si algo sale mal.

 1
Author: Martynnw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 15:55:31

Tenga en cuenta que TRUNCATE también restablecerá cualquier tecla de incremento automático, si las está utilizando.

Si no desea perder sus claves de incremento automático, puede acelerar la eliminación borrando en conjuntos (por ejemplo, ELIMINAR DE LA tabla DONDE id > 1 E id

 1
Author: Brian D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 16:28:24

Sí, bueno, eliminar 5 millones de filas probablemente llevará mucho tiempo. La única forma potencialmente más rápida que se me ocurre sería dejar caer la mesa y volver a crearla. Eso solo funciona, por supuesto, si desea eliminar TODOS los datos de la tabla.

 0
Author: TheSmurf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 15:49:29

Tabla truncada client_log

Es tu mejor apuesta, truncar mata todo el contenido de la tabla y los índices y restablece cualquier semilla que tengas también.

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 15:50:02

La sugerencia de "Soltar y volver a crear la tabla" probablemente no sea buena porque eso estropea tus claves foráneas.

Está utilizando claves foráneas, ¿verdad?

 0
Author: Andy Lester,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 16:06:16

Si no puede usar TRUNCATE TABLE debido a claves foráneas y / o disparadores, puede considerar lo siguiente:

  • eliminar todos los índices;
  • haga la ELIMINACIÓN habitual;
  • volver a crear todos los índices.

Esto puede acelerar un poco la ELIMINACIÓN.

 0
Author: squadette,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 18:04:45

Estoy revisando mi declaración anterior:

Usted debe entender que mediante el uso de TRUNCAR los datos se borrarán pero nada será registrado en el transaction log. Escribir en el registro es por eso que ELIMINAR tomará para siempre en 5 millones de filas. Uso TRUNCATE a menudo durante el desarrollo, pero usted debe ser desconfiar de usarlo en una producción base de datos porque usted no será capaz para revertir sus cambios. Deberías haga inmediatamente una base de datos completa copia de seguridad después haciendo un TRUNCADO a establecer una nueva base para la restauración.

La declaración anterior tenía la intención de incitarle a estar seguro de que entiende que hay diferencia entre los dos. Desafortunadamente, está mal escrito y hace declaraciones sin apoyo, ya que en realidad no he hecho ninguna prueba entre los dos. Se basa en declaraciones que he escuchado de otros.

De MSDN :

La instrucción DELETE elimina las filas uno a la vez y los registros una entrada en el registro de transacciones para cada fila eliminada. TRUNCATE TABLE elimina los datos por desasignación de las páginas de datos utilizadas para almacenar los datos de la tabla, y solo las desasignaciones de página se registran en el transaction log.

Solo quería decir que hay una diferencia fundamental entre los dos y porque hay una diferencia, habrá aplicaciones donde una u otra puede ser inapropiada.

 0
Author: Andy Frieders,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-20 18:01:22
DELETE * FROM table_name;

La optimización prematura puede ser peligrosa. Optimizar puede significar hacer algo extraño, pero si funciona, es posible que desee aprovecharlo.

SELECT DbVendor_SuperFastDeleteAllFunction(tablename, BOZO_BIT) FROM dummy;

Para la velocidad creo que depende...

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

  • La tabla, su contenido y tablas relacionadas:

Puede haber reglas de eliminación. ¿Existe un procedimiento para eliminar todo el contenido de la tabla? ¿Se puede optimizar esto para el motor de base de datos subyacente específico? ¿Cuánto nos importa romper cosas / datos relacionados? Realizar una ELIMINACIÓN puede ser la forma' más segura ' asumiendo que otras tablas relacionadas no dependen de esta tabla. ¿Hay otras tablas y consultas que estén relacionadas o dependan de los datos de esta tabla? Si no nos importa mucho que esta tabla esté presente, usar 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 ¿ser borrado? ¿Hay otra información que se recoge rápidamente que optimizará la eliminación? Por ejemplo, ¿podemos saber si la mesa ya está vacía? Podemos saber si hay cientos, miles, millones, miles de millones de filas?

 0
Author: Mark Stock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-20 18:49:54