TRUNCATE

Utilice el comando ' TRUNCATE ' para eliminar todas las filas de una tabla. Esto tiene el mismo efecto que el comando DELETE, pero es más rápido que el comando ' DELETE ' para tablas grandes.

Puede utilizar ' TRUNCATE dentro de una transacción o procedimiento almacenado para realizar otros cambios relacionados en los datos en una unidad atómica. Cuando usas ' TRUNCATE ' de esta manera:
  • La transacción de truncamiento puede revertirse, en cuyo caso el almacenamiento y el contenido de la tabla permanecen intactos.
  • La tabla se bloquea, y no se permite ningún acceso concurrente (incluyendo comandos ' SELECT ) a la tabla desde otras sesiones o transacciones hasta que la transacción de truncado se confirme o retroceda. La reversión puede ocurrir como resultado de un comando ' ROLLBACK o de un fallo de ejecución en la transacción.
  • Si la transacción de truncamiento accede a otras tablas, se incrementa la posibilidad de punto muerto. Puede evitar este problema emitiendo ' LOCK TABLE <tablename> IN ACCESS EXCLUSIVE MODE ' al principio de una operación de truncamiento. Consulte TABLA DE BLOQUEO para obtener directrices sobre el uso de ese comando.
  • 'TRUNCATE TABLE es mucho más rápido que borrar todas las filas con ' DELETE FROM <table> y además no requiere un posterior ' GROOM TABLE ' para recuperar el espacio. Sin embargo, existe un pequeño riesgo de que las transacciones simultáneas que intenten modificar y truncar la misma tabla vean el mensajeERROR: Cannot truncate table because of concurrent insert or update. Puede minimizar el riesgo utilizando el comando ' LOCK TABLE ' y manteniendo activa una transacción que trunca una o más tablas durante no más tiempo del necesario para lograr su objetivo.

NPS admite ' SELECTs en transacciones concurrentes contra una tabla truncada. El almacenamiento en disco de una tabla truncada sólo se libera cuando no hay transacciones concurrentes activas que se iniciaron antes de que se confirmara el truncamiento. Si no hay transacciones simultáneas de este tipo en el momento en que se confirma un truncamiento, el almacenamiento se libera unos segundos después de la confirmación. Las transacciones abiertas que comenzaron antes de que se confirmara el " TRUNCATE " pueden seguir viendo las filas de la tabla anteriores al " TRUNCATE.

Las operaciones distintas de " SELECT " que modifiquen la tabla que se está truncando deben esperar a que la transacción de truncamiento haga commit o roll back.

Si su sistema tiene a menudo sesiones concurrentes que seleccionan contra una tabla que está truncada, tenga en cuenta que el comando ' TRUNCATE ' restablece las estadísticas de recuento de filas de la tabla a cero. El restablecimiento se beneficia de las estimaciones de planificación para las nuevas consultas subsiguientes en la tabla. El restablecimiento de las estadísticas de recuento de filas en " TRUNCATE " puede afectar a las consultas existentes de transacciones concurrentes. Si las nuevas estadísticas de recuento de filas son muy diferentes de los recuentos de filas anteriores al ' TRUNCATE, las consultas concurrentes podrían tardar más en ejecutarse debido a las estimaciones inexactas del planificador para las consultas más antiguas.

Si prefiere mantener intactas las estadísticas de la tabla para beneficiar a las consultas en vuelo, puede configurar el sistema para que conserve las estadísticas de la tabla y el recuento de filas de la tabla desde antes del ' TRUNCATE. Para retener las estadísticas, puede establecer la variable de base de datos concurrent_truncate_zero_stats en false. Este valor hace que el sistema retenga siempre las estadísticas de tabla, que con el tiempo aumentan a medida que se insertan filas nuevas en la tabla, y puede causar problemas de estimación de consulta que pueden producir tiempos de ejecución más largos. Para cambiar el comportamiento predeterminado:

  1. Inicie sesión en el sistema NPS con la cuenta de usuario nz.
  2. Con un editor de texto, abra el archivo /nz/data/postgresql.conf. Tenga precaución cuando edite postgresql.conf. Contiene parámetros de configuración importantes para el funcionamiento del sistema Netezza Performance Server.
  3. Busque una definición de concurrent_truncate_zero_stats en el archivo para asegurarse de que no hay ninguna presente y/o que no está comentado. Si busca una entrada, asegúrese de que concurrent_truncate_zero_stats=false y de que no está comentado. Si no puede encontrar una entrada, añada concurrent_truncate_zero_stats=false al archivo.
  4. Guarde y cierre el archivo postgresql.conf.
  5. Detenga y reinicie el software ' NPS ' utilizando los comandos ' nzstop y luego ' nzstart '.

La variable concurrent_truncate_zero_stats también se puede establecer (o restablecer) en sesiones individuales de la base de datos NPS mediante el comando ' set concurrent_truncate_zero_stats to <value> '. Por ejemplo, es posible establecer la variable a nivel de sesión para obtener un comportamiento diferente para tablas diferentes. Las diferentes sesiones que se truncan a partir de la misma tabla deben utilizar un valor coherente para esta variable a fin de obtener un comportamiento coherente.

Nota: Las siguientes prácticas relativas al uso de " GENERATE STATISTICS " en tablas que se truncan y recargan repetidamente:
  • No añada un ' GENERATE STATISTICS ' después del ' TRUNCATE (o después de que la transacción que llama al ' TRUNCATE ' se comprometa).
  • Lo ideal sería ejecutar ' GENERATE STATISTICS ' después de recargar los datos antes de realizar la consulta. Esto es especialmente importante si concurrent_truncate_zero_stats se establece en false. También es un procedimiento general recomendado para tablas Performance Server grandes porque algunas estadísticas (como el valor de columna "dispersions") no se recopilan automáticamente mientras se cargan.
  • Si ' GENERATE STATISTICS ' no se está ejecutando actualmente después de cada recarga y es demasiado difícil cambiar los flujos de trabajo existentes para añadir el comando, entonces en los casos en los que concurrent_truncate_zero_stats es falso, debe ejecutar ' GENERATE STATISTICS periódicamente en un trabajo en segundo plano. Elija una frecuencia de trabajo tal que no se hayan producido más de cuatro o cinco truncamientos y recargas desde el último " GENERATE STATISTICS.

Sintaxis

Sintaxis para truncar una tabla vacía:
TRUNCATE [ TABLE ] <name>

Entrada

El comando TRUNCATE toma la siguiente entrada:
Tabla 1. Salida TRUNCATE
Entrada Descripción
<name> El nombre de la tabla que desea truncar.

Resultado

El comando TRUNCATE tiene la siguiente salida:
Tabla 2. Salida de TRUNCATE
Resultado Descripción
TRUNCATE TABLE El comando se ha ejecutado correctamente.

Privilegios

Debe ser usuario administrativo, propietario de tabla, propietario de la base de datos o esquema o bien la cuenta debe tener el privilegio para truncar en la tabla o la clase de objeto de tabla.

Uso

Se proporciona el siguiente uso de muestra.
  • Eliminar todas las filas de la tabla bigtable:
    MYDB.SCH1(USER)=> TRUNCATE  bigtable;
  • Sustituir el contenido de la tabla mytable por datos nuevos:
    BEGIN;
    TRUNCATE TABLE mytable;
    INSERT INTO mytable SELECT …;
    COMMIT;