Pregunta

estoy ejecutando el siguiente comando SAS:

Proc SQL;
Delete From Server003.CustomerList;
Quit;

Lo que se está llevando a lo largo de 8 minutos ... cuando se toma sólo unos segundos para leer ese archivo. Lo que podría ser causa de una eliminación para tomar tanto tiempo y qué puedo hacer para hacer que vaya más rápido?

(no tengo acceso a eliminar la tabla, así que sólo puedo eliminar todas las filas)

Gracias,

Dan

Edit: Yo también, aparentemente, no puedo truncar tablas

.
¿Fue útil?

Solución

Esto no es SQL normal. SAS Proc SQL no admite la instrucción TRUNCATE. Idealmente, usted quiere averiguar lo que está pasando con el rendimiento de la delete from; pero si lo que realmente necesita es una funcionalidad truncado, siempre se puede simplemente utilizar pura SAS y no meterse con SQL en absoluto.

data Server003.CustomerList;
set Server003.CustomerList (obs=0);
run;

Esto lleva a cabo de manera eficaz y funciona como un Truncate haría. Mantiene la estructura de conjunto de datos / mesa, pero no rellenarlo con los datos (debido a la OBS = opción).

Otros consejos

¿Hay un montón de otras mesas que tienen claves ajenas a esta mesa? Si esas tablas no tienen índices de la columna de clave externa (s), entonces podría tomar un tiempo para SQL para determinar si es o no es seguro para eliminar las filas, incluso si ninguna de las otras mesas en realidad tiene un valor en la clave externa columna (s).

También me gustaría mencionar que en los comandos SQL que se ejecutan en general más lento en SAS PROC SQL. Hace poco hice un proyecto y moví las declaraciones truncar la tabla en un procedimiento almacenado para evitar la pena de tenerlos dentro de SAS y siendo manejado por su optimizador de SQL y que rodea la cáscara ejecución. Al final, esto aumenta el rendimiento de la tabla TRUNCATE sustancialmente.

Puede ser que sea más lento debido a las escrituras en disco son típicamente más lento que lee.

En cuanto a la manera de evitarlo sin dejar caer / truncar, buena pregunta! :)

Trate de añadir esto a su declaración LIBNAME:

DIRECT_EXE=DELETE 

Según SAS / ACCESO (R) 9.2 para bases de datos relacionales: Referencia ,

  

El rendimiento mejora significativamente mediante el uso de DIRECT_EXE =, debido a que el SQL DELETE se pasa directamente a la DBMS, en lugar de leer SAS estableció el resultado completo y eliminación de una fila a la vez.

También podría considerar el elegante:

sql proc; crear libname.tablename mesa como libname.tablename; dejar;

Voy a producir una nueva tabla con el mismo nombre y la misma meta datos de la tabla anterior y eliminar la antigua en la misma operación.

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