Proc SQL Delete занимает слишком много времени

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

Proc SQL;
Delete From Server003.CustomerList;
Quit;

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

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

Спасибо,

Дэн

Изменить: я также, по-видимому, не могу обрезать таблицы.


person Dan    schedule 20.07.2009    source источник
comment
Какую систему баз данных вы используете?   -  person AFHood    schedule 21.07.2009


Ответы (6)


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

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

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

person Jay Stevens    schedule 26.07.2009

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

person Tom H    schedule 20.07.2009
comment
Даже с индексами это может занять некоторое время, если у вас их много. Наша основная таблица имеет более 100 внешних ключей (Эй, я не проектировал эту штуку), и удаление даже одной записи занимает много времени. - person HLGEM; 21.07.2009

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

person Keith Adler    schedule 20.07.2009
comment
Я бы сказал, что это очень ситуативно. Это будет зависеть от БД на бэкэнде, коннектора, используемого для доступа к нему (общее соединение ODBC и реализованный коннектор SAS для конкретной БД), типа сделанного вызова (операторы выбора или выполнения), независимо от того, осуществляется ли к нему доступ через имя библиотеки. и т. д. Я не сомневаюсь, что ваш пример привел к более высокой скорости, хотя я готов поспорить, что эквивалентная скорость все еще может быть достигнута с помощью SQL в SAS. - person Robert Penridge; 27.03.2019

Попробуйте добавить это в свой оператор LIBNAME:

DIRECT_EXE=DELETE 

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

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

person Todd Owen    schedule 25.02.2013

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

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

person Rog    schedule 22.07.2009

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

процедура sql; создать таблицу libname.tablename, например libname.tablename; покидать;

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

person Agnor Bertheussen    schedule 27.03.2019