Страница 1 из 2

Удалить записи из таблицы по условию

Добавлено: 17 ноя 2014, 11:02
rozum
Добрый день всем!За ранее прошу прощения ,если такая тема уже обсуждалась,но... Подскажите пожалуйста как можно почистить(удалить данные из таблицы внешних атрибутов Attrval) за определенный период и с условием .Пробую вот таким образом и в итоге окно модификации данных крутит но данные не удаляет ,а почистить необходимо,сама таблица attrval уже 21гб.
DELETE attrval
where
((
word(1104) /== AttrVal.wtable
and comp(000100000000000Dh) /== AttrVal.cAttrNam
and AttrVal.crec /== Spstep.nrec
and spstep.cstepdoc /== stepdoc.nrec
and stepdoc.cbasedoc /== basedoc.nrec
and date(30,01,2007) <<= basedoc.ddoc (NoIndex)
and date(31,12,2007) >>= basedoc.ddoc (NoIndex)
))
;
Может быть я синтаксис не так пишу.Через rebuild тоже не отрабатывает( не видит ^ )

Re: Удалить записи из таблицы по условию

Добавлено: 17 ноя 2014, 12:33
edward_K
1. Перед delete всегда проверяйте select - ом - есть ли что.
2. delete на таких сложных условиях на ранних версиях мог отработать не корректно(в обе стороны - как не доудалить, так и удалить все).
3. Удаляемая таблица должна быть главной, но здесь вы это выполняете.
4. Универсальное средство сделать выгрузку в txt запросов на удаление одной записи и потом выполнить файло в сапорте. медленно, но зато надежно

Код: Выделить всё

select 'delete attrval where (('+string(attrval.nrec)+' == nrec ));'
...
to txt c:\1\attrval_del.txt
;
#include c:\1\attrval_del.txt
5. причем тут rebuild? у вас первасив? rebuild -у нужно указывать конкретный файл. где то в галке лежит батник для лечения таблиц(ы) - посмотрите.
альтернатива - выгрузить все в dbf, переместить файл данных, загрузить из dbf. Ест. при этом никто не должен находиться в базе.

Re: Удалить записи из таблицы по условию

Добавлено: 17 ноя 2014, 12:59
rozum
да у нас pervasive. вычислять по одной записи это будет ну оочень долго((((((( может буду искать ещё какие варианты
записи 100% есть потому что select выгружает за 1 месяц 20.000 записей которые и нужно убрать но скопом всё удалять нельзя поэтому и опираюсь на даты и подцепки((

Re: Удалить записи из таблицы по условию

Добавлено: 17 ноя 2014, 13:40
edward_K
да ладно - можно и потерпеть. 20000 будет удалять минут 10 максимум. Вот если два ляма тогда другое дело.

Re: Удалить записи из таблицы по условию

Добавлено: 17 ноя 2014, 14:32
rozum
так вот в том то и дело что за 2007 год это уже 250.000 а мне необходимо с 2007 по 2012 удалить.причем где то с 2008 года уже не один атрибут а 4 то есть это уже в 4 раза будет больше записей.

Re: Удалить записи из таблицы по условию

Добавлено: 17 ноя 2014, 17:26
Den
прям именно sql-запросом ?
напишите простенький алгоритм на vip или fcom может...

Re: Удалить записи из таблицы по условию

Добавлено: 17 ноя 2014, 18:02
rozum
я про это уже тоже подумала)) спасибо.Но все таки одну небольшую ошибочку нашла в запросе.)))) прописала не тот nrec :x но думаю записать процедуру придеться

Re: Удалить записи из таблицы по условию

Добавлено: 19 ноя 2014, 10:20
Алексей
сложные удаления тоже всегда на випе пишу...

Re: Удалить записи из таблицы по условию

Добавлено: 19 ноя 2014, 10:41
RAJAH
Алексей писал(а):сложные удаления тоже всегда на випе пишу...
Тоже примажусь к обсуждению: а я на T-SQL. :-P

Re: Удалить записи из таблицы по условию

Добавлено: 19 ноя 2014, 11:19
rozum
подскажите ещё кто сталкивался! select у меня отрабатывает, но так как запрос непроиндексирован, то записи выбираются ооочень долго, то есть поиск бежит по всем записям(а это 16млн)), после часа модификации, я прерываю процесс :oops: ,и в итоге вижу,что вроде бы записи удаляются достаточно хорошо а вот сам размер таблицы не уменьшается.То есть либо у меня не хватает терпения дождаться полного окончания модификации ,либо ситуация такая, что записи якобы удаляются а на физическом уровне может просто ставятся, как помеченные на удаление.Пробую экспортнуть в dbf а затем импорт в базу.Или я не совсем понимаю как проходит удаление(((

Re: Удалить записи из таблицы по условию

Добавлено: 19 ноя 2014, 15:06
edward_K
читайте внимательно, что я вам писал, а не через слово. В промежутке между выгрузкой и загрузкой надо физически удалить файл(переместить куда то).
или rebuild - все это делать когда никого нет в базе.
Первасив не умеет сжимать в каком то другом режиме файлы кроме rebuild-а. В MSSQL файлов всего 5 - и можно в фоне запустить их сжатие всех или нужный.

Re: Удалить записи из таблицы по условию

Добавлено: 19 ноя 2014, 18:44
rozum
Sorry :oops: догнала ,последую совету.Спасибо

Re: Удалить записи из таблицы по условию

Добавлено: 20 ноя 2014, 14:19
rozum
Простите уже опытные программисты новичка :oops: но подскажите ещё плиз по какому критерию можно разбить таблицу Atttrval чтобы экспортировать её? Не поддерживает dbf 20Гб (или я ещё не умею правильно выгружать ) можно ли создать vip в котором описать какую то переменную присвоить ей 1 и в цикле прописать что выгружать с 1 например до 4 млн. записей.в итоге получиться где то 5 файлов dbf которые потом и можно импортировать обратно.Или есть какой нибудь критерий отбора для выгрузки полегче?
Сразу прошу прощения и говорю спасибо)))

Re: Удалить записи из таблицы по условию

Добавлено: 20 ноя 2014, 14:46
Den
rozum писал(а):можно ли создать vip в котором описать какую то переменную присвоить ей 1 и в цикле прописать что выгружать с 1 например до 4 млн. записей.
можно

Re: Удалить записи из таблицы по условию

Добавлено: 21 ноя 2014, 00:32
edward_K
Тут проще по atl_lastdate резать. А с rebuild не разо брались?