Вопрос

Я использую следующую команду 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; покидать;

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top