Proc SQL Delete занимает слишком много времени - PullRequest
0 голосов
/ 21 июля 2009

Я запускаю следующую команду SAS:

Proc SQL;
Delete From Server003.CustomerList;
Quit;

Что занимает более 8 минут ... когда чтение этого файла занимает всего несколько секунд. Что может привести к тому, что удаление займет так много времени, и что я могу сделать, чтобы оно прошло быстрее?

(у меня нет доступа к удалению таблицы, поэтому я могу удалить только все строки)

Спасибо

Dan

Редактировать: Я также, очевидно, не могу усечь таблицы.

Ответы [ 6 ]

8 голосов
/ 26 июля 2009

Это НЕ обычный SQL. SAS Proc SQL не поддерживает оператор Truncate. В идеале вы хотите выяснить, что происходит с производительностью delete from; но если вам действительно нужна функция усечения, вы всегда можете просто использовать чистый SAS и вообще не связываться с SQL.

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

Это эффективно работает и работает как Truncate. Он поддерживает структуру набора данных / таблицы, но не может заполнить ее данными (из-за опции OBS =).

3 голосов
/ 21 июля 2009

Много ли других таблиц имеют внешние ключи к этой таблице? Если в этих таблицах нет индексов для столбцов внешнего ключа, SQL может потребоваться некоторое время, чтобы определить, безопасно ли удалять строки, даже если ни одна из других таблиц не имеет значения во внешнем ключе. столбец (ы). * * тысяча один

2 голосов
/ 21 июля 2009

Я бы также упомянул, что в целом команды SQL выполняются медленнее в SAS PROC SQL.Недавно я выполнил проект и переместил операторы TRUNCATE TABLE в хранимую процедуру, чтобы избежать наказания за то, что они находятся внутри SAS и обрабатываются их оптимизатором SQL и окружающей оболочкой выполнения.В итоге это значительно повысило производительность TRUNCATE TABLE.

1 голос
/ 27 марта 2019

Вы также можете рассмотреть элегантный:

proc sql; создать таблицу libname.tablename наподобие libname.tablename; уволиться;

Я создам новую таблицу с тем же именем и такими же метаданными вашей предыдущей таблицы и удалю старую в той же операции.

1 голос
/ 25 февраля 2013

Попробуйте добавить это к LIBNAME заявлению:

DIRECT_EXE=DELETE 

Согласно SAS / ACCESS® (R) 9.2 для реляционных баз данных: ссылка ,

Производительность значительно улучшается за счет использования DIRECT_EXE =, поскольку оператор удаления SQL передается непосредственно в СУБД, а не SAS, читающий весь набор результатов и удаляющий по одной строке за раз.

1 голос
/ 22 июля 2009

Это может быть медленнее, потому что запись на диск обычно медленнее, чем чтение.

Что касается обхода без опускания / усечения, хороший вопрос! :)

...