sql server - varios - La forma más rápida de eliminar todos los datos en una tabla grande
insertar datos en una tabla sql (15)
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 el analizador de consultas:
eliminar de client_log
que tomó mucho tiempo.
Descubrí TRUNCATE TABLE en la referencia msdn transact-SQL. Para todos los interesados aquí están los comentarios:
TRUNCATE TABLE es funcionalmente idéntico a la declaración DELETE sin cláusula WHERE: ambos eliminan todas las filas de la tabla. Pero TRUNCATE TABLE es más rápido y utiliza menos recursos de sistema y registro de transacciones que DELETE.
La instrucción DELETE elimina las filas de una en una y registra una entrada en el registro de transacciones para cada fila eliminada. TRUNCATE TABLE elimina los datos desasignando las páginas de datos utilizadas para almacenar los datos de la tabla, y solo las desasignaciones de página 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 filas nuevas se restablece a la semilla para la columna. Si desea conservar el contador de identidad, use DELETE en su lugar. Si desea eliminar la definición de tabla y sus datos, use la instrucción DROP TABLE.
No puede usar TRUNCATE TABLE en una tabla a la que hace referencia una restricción FOREIGN KEY; en su lugar, use la declaración DELETE sin una cláusula WHERE. Debido a que TRUNCATE TABLE no está registrado, no puede activar un disparador.
TRUNCATE TABLE no se puede usar en tablas que participan en una vista indexada.
En SQL Server puede usar el comando Truncate Table
que es más rápido que una eliminación normal y también utiliza menos recursos. También restablecerá cualquier campo de identidad al valor de inicialización.
Los inconvenientes de truncar son que no se puede usar en tablas a las que se hace referencia mediante claves externas y no activará ningún disparador. Además, no podrá deshacer los datos si algo sale mal.
La sugerencia de "Soltar y recrear la tabla" probablemente no sea buena porque eso complica tus claves foráneas.
ESTÁS usando claves foráneas, ¿verdad?
Para referencia TRUNCATE TABLE también funciona en MySQL
Sí, bueno, borrar 5 millones de filas probablemente llevará mucho tiempo. La única forma potencialmente más rápida que puedo pensar sería abandonar la mesa y volver a crearla. Eso solo funciona, por supuesto, si quieres borrar TODOS los datos en la tabla.
Tenga en cuenta que TRUNCATE también restablecerá todas las teclas de aumento automático, si las está utilizando.
Si no desea perder sus claves de incremento automático, puede acelerar la eliminación eliminando en conjuntos (por ejemplo, ELIMINAR DE LA tabla DONDE id> 1 AND id <10000). Lo acelerará significativamente y en algunos casos evitará que se bloqueen los datos.
truncate table
no es independiente de la plataforma SQL. Si sospecha que alguna vez podría cambiar los proveedores de la base de datos, es posible que desconfíe de su uso.
truncate table client_log
es tu mejor opción, truncar mata todo el contenido de la tabla y los índices y restablece las semillas que tienes también.
Existe un mito común de que TRUNCATE de algún modo omite el registro de transacciones.
Esto es un malentendido, y se menciona claramente en MSDN.
Este mito se invoca en varios comentarios aquí. Vamos a erradicarlo juntos;)
Si no puede usar TRUNCATE TABLE debido a claves externas y / o disparadores, puede considerar:
- soltar todos los índices;
- hacer el DELETE habitual;
- volver a crear todos los índices.
Esto puede acelerar DELETE un poco.
Utilizo el siguiente método para poner a cero las tablas, con la ventaja añadida de que me deja una copia de archivo de la tabla.
CREATE TABLE `new_table` LIKE `table`;
RENAME TABLE `table` TO `old_table`, `new_table` TO `table`;
olvida truncar y eliminar. mantenga sus definiciones de tablas (en caso de que quiera recrearlas) y simplemente use drop table.
Estoy revisando mi declaración anterior:
Debe comprender que al usar TRUNCATE, los datos se borrarán, pero no se registrará nada en el registro de transacciones. Escribir en el registro es por qué DELETE tomará para siempre 5 millones de filas. Uso TRUNCATE con frecuencia durante el desarrollo, pero debe tener cuidado al usarlo en una base de datos de producción porque no podrá deshacer los cambios. Debería hacer inmediatamente una copia de seguridad completa de la base de datos después de hacer una TRUNCATE para establecer una nueva base para la restauración.
La declaración anterior tenía la intención de solicitarle que esté seguro de que comprende que hay una diferencia entre los dos. Desafortunadamente, está mal escrito y hace afirmaciones sin fundamento, ya que yo no hice ninguna prueba entre los dos. Se basa en declaraciones que he escuchado de otros.
Desde MSDN :
La instrucción DELETE elimina las filas de una en una y registra una entrada en el registro de transacciones para cada fila eliminada. TRUNCATE TABLE elimina los datos desasignando las páginas de datos utilizadas para almacenar los datos de la tabla, y solo las desasignaciones de página se registran en el registro de transacciones.
Solo quería decir que hay una diferencia fundamental entre los dos y porque hay una diferencia, habrá aplicaciones en las que una u otra puedan ser inapropiadas.
DELETE * FROM table_name;
La optimización prematura puede ser peligrosa. Optimizar puede significar hacer algo extraño, pero si funciona, puede aprovecharlo.
SELECT DbVendor_SuperFastDeleteAllFunction(tablename, BOZO_BIT) FROM dummy;
Por velocidad, creo que depende de ...
La base de datos subyacente: Oracle, Microsoft, MySQL, PostgreSQL, otros, personalizados ...
La tabla, su contenido y tablas relacionadas:
Puede haber reglas de eliminación. ¿Existe un procedimiento existente 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 un DELETE puede ser la forma más "segura" suponiendo que otras tablas relacionadas no dependen de esta tabla. ¿Hay otras tablas y consultas relacionadas / que dependen de los datos dentro de esta tabla? Si no nos importa que esta tabla esté cerca, 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 se están eliminando? ¿Hay otra información que se recopile rápidamente que optimice la eliminación? Por ejemplo, ¿podemos decir si la tabla ya está vacía? ¿Podemos decir si hay cientos, miles, millones, miles de millones de filas?
Echa un vistazo a la tabla truncada, que es mucho más rápida.