Proc SQL Delete занимает слишком много времени
Вопрос
Я использую следующую команду SAS:
Proc SQL;
Delete From Server003.CustomerList;
Quit;
Который занимает более 8 минут ... когда для прочтения этого файла требуется всего несколько секунд. Что может привести к тому, что удаление займет так много времени и что я могу сделать, чтобы он пошел быстрее?
(У меня нет доступа, чтобы сбросить таблицу, поэтому я могу удалить только все ряды)
Спасибо,
Дэн
РЕДАКТИРОВАТЬ: Я также, очевидно, не могу усечь таблицы.
Решение
Это не обычный SQL. SAS 'Proc SQL не поддерживает оператор Truncate. В идеале вы хотите выяснить, что происходит с производительностью delete from
; Но если вам действительно нужна функциональность усечения, вы всегда можете просто использовать чистый SAS и не связываться с SQL вообще.
data Server003.CustomerList;
set Server003.CustomerList (obs=0);
run;
Это эффективно работает и работает как Truncate
бы. Он поддерживает структуру набора данных/таблицы, но не может заполнить его данными (из -за опции OBS =.
Другие советы
Есть ли много других таблиц, которые имеют иностранные ключи к этой таблице? Если в этих таблицах нет индексов в столбцах (ы) иностранного ключа, то SQL может потребоваться некоторое время, чтобы определить, безопасно ли удалить строки, даже если ни одна из других таблиц на самом деле не имеет значения в иностранном ключе столбец (ы).
Я также упомянул бы, что в общем случае команды SQL работают медленнее в SAS Proc SQL. Недавно я сделал проект и переместил операторы Truncate Table в хранимую процедуру, чтобы избежать штрафа за то, что они внутри SAS и обрабатывались их оптимизатором SQL и окружающей оболочкой. В конце концов это значительно увеличило производительность усеченной таблицы.
Это может быть медленнее, потому что диск записи, как правило, медленнее, чем чтения.
Что касается этого, без падения/усечения, хороший вопрос! :)
Попробуйте добавить это в свой LIBNAME
утверждение:
DIRECT_EXE=DELETE
Согласно с SAS/Access (r) 9.2 для реляционных баз данных: ссылка,
Производительность значительно улучшается, используя direct_exe =, потому что оператор DELETE SQL передается непосредственно в СУБД, вместо того, чтобы читать весь набор результатов и удалять по одной строке за раз.
Вы также можете считать элегантным:
Proc SQL; Создать таблицу libname.tablename как libname.tablename; покидать;
Я создам новую таблицу с тем же именем и одинаковыми метаданами в вашей предыдущей таблице и удалю старую в той же операции.