Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Удаление записей за период времени  [new]
karpov-ukg
Member

Откуда:
Сообщений: 5
Здравствуйте.
Есть программа стороннего разработчика под FireBird 1.5.
В одной таблице накопилось большое количество записей. Но в программе не предусмотрено групповое удаление записей. Подключил ее в IBExpert. Думаю, что можно удалить все записи за определенный период при помощи запроса.
О БД имею теоретические знания. Но предполагаю, что запрос должен начинаться как-то так:
DELETE FROM TABLE_NAME WHERE ... дальше не знаю что писать. По-русски он звучит так: УДАЛИТЬ В ТАБЛИЦЕ ЗАПИСИ ОТ 01.01.2005 ДО 01.01.2015
Понимаю всю наглость своей просьбы, но так как задача одноразовая...
Может кто-то напишет мне шаблон запроса? Как для блондинки.
Или в IBExpert есть такая штатная функция?
К пинкам, плевкам и анальному выпилу из реальности готов.
16 май 18, 15:42    [21414017]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 380
karpov-ukg,

DELETE FROM TABLE_NAME WHERE date between '2005-01-01' and '2014-12-31'.
16 май 18, 15:58    [21414122]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3342
karpov-ukg
есть такая штатная функция?

Нет.
Если нет специального поля типа "ДатаСозданияЗаписи" - то нельзя никак.
Да и если есть - откуда ты знаешь, важна ли эта запись.
Нужно искать этого стороннего разработчика.
16 май 18, 15:59    [21414127]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 27141
KreatorXXI,

спасибо, добрый человек!
16 май 18, 16:04    [21414151]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 380
karpov-ukg,

И не забыть подтвердить транзакцию (кнопка с зелёной галкой).
16 май 18, 16:08    [21414162]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 27141
karpov-ukg, и до кучи KreatorXXI

в базе не всегда можно что-то удалить, казалось-бы "лишнее". Например, в бухгалтерской БД нельзя просто удалить что-то за прошлый год. Должна быть специальная процедура "свёртки".
Кроме того, определенные данные невозможно удалить из-за связей с другими данными.
Допустим, в 1С можно удалить адресный классификатор. Но в результате потом нельзя по конторам напечатать конверты, приходится опять грузить часть классификатора по индексу.
И так далее.

Так что см. ответ YuRock.

А потом - "большое количество записей" - это какое? Программа тормозит, или что?
16 май 18, 16:12    [21414167]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
Tactical Nuclear Penguin
Member

Откуда: холодно тут
Сообщений: 2603
karpov-ukg
Здравствуйте.
Есть программа стороннего разработчика под FireBird 1.5.
В одной таблице накопилось большое количество записей. Но в программе не предусмотрено групповое удаление записей. Подключил ее в IBExpert. Думаю, что можно удалить все записи за определенный период при помощи запроса.
О БД имею теоретические знания. Но предполагаю, что запрос должен начинаться как-то так:
DELETE FROM TABLE_NAME WHERE ... дальше не знаю что писать. По-русски он звучит так: УДАЛИТЬ В ТАБЛИЦЕ ЗАПИСИ ОТ 01.01.2005 ДО 01.01.2015
Понимаю всю наглость своей просьбы, но так как задача одноразовая...
Может кто-то напишет мне шаблон запроса? Как для блондинки.
Или в IBExpert есть такая штатная функция?
К пинкам, плевкам и анальному выпилу из реальности готов.


будь готов что пользователи тебе что-нибудь оторвут после удалений таких...
16 май 18, 16:15    [21414178]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 23697
karpov-ukg
К пинкам, плевкам и анальному выпилу из реальности готов.

1. Тихой темной ночью добавь поле "признак архива" и сделай вьюху, которая берет только не архивные записи. Переделай все селекты на вьюху.
2. Опять же темной и тихой ночью создай таблицу-двойника, перенеси в нее архивные данные и сделай вьюху, которая объединяет эти таблицы.

Я-бы так сделал, если архитектура кривая и иного не предусматривает.
16 май 18, 16:21    [21414202]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
karpov-ukg
Member

Откуда:
Сообщений: 5
YuRock
Если нет специального поля типа "ДатаСозданияЗаписи" - то нельзя никак.
Да и если есть - откуда ты знаешь, важна ли эта запись.
Нужно искать этого стороннего разработчика.

Поле есть.
Разраб говорит: давай базу - посмотрим. А начальство не разрешает.
kdv
Кроме того, определенные данные невозможно удалить из-за связей с другими данными.

А потом - "большое количество записей" - это какое? Программа тормозит, или что?

От таблицы зависят только триггеры (хз, что за зверь). Удаление записей может повлиять на них?
Подсчет записей в программе вызывает ее зависание, а как сделать это в IBExpert я не нашел. Большое, короче, количество. И да, программа тормозит, жутко, до полного зависания. Именно, когда некоторые пользователи переходят в программе на эту таблицу.
Я не совсем понял:
KreatorXXI
karpov-ukg,
DELETE FROM TABLE_NAME WHERE date between '2005-01-01' and '2014-12-31'.

это тру запрос? А то в высказываниях некоторых участников мне послышался сарказм в его адрес.
17 май 18, 08:43    [21415633]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
fraks
Member

Откуда: Новосибирск
Сообщений: 1314
karpov-ukg
Я не совсем понял:
KreatorXXI
karpov-ukg,
DELETE FROM TABLE_NAME WHERE date between '2005-01-01' and '2014-12-31'.

это тру запрос? А то в высказываниях некоторых участников мне послышался сарказм в его адрес.


Теоретически запрос верен. Если в базе всего одна таблица и в ней есть поле date по которому ставится условие удаления.

Но в реальной жизни как правило все совсем не так.
На реальной базе он в лучшем случае не сработает из-за отсутствия поля date в этой таблице,
а в худшем - повредит данные так что в одной таблице перестанет соответстсвовать в другой.
Или, к примеру, пересчитает какие-то суммы в других таблицах, непредственно сейчас или когда-то в будущем, когда программа натолкнется на несовпадение.
Еще один страшный сценарий - удаление записей повлечет за собой каскадное удаление записей в других таблицах, чего ты не планировал.

После гигантских delete останется куча мусора который нужно будет собрать. Хотя бы перебэкапом.

Зависание при обращении к таблице может быть вызвано не только большим количеством записей, но и к примеру поломкой нужного для этого запроса индекса. Или другой случай - при разработке запроса план запроса был один. Увеличилось количество записей - и план запроса поменялся, и может так случиться что не в лучшую сторону. Тут без разработчика не обойтись.
И ему нужна база с реальным количеством данных, о чем он и просит.
17 май 18, 09:16    [21415682]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 380
karpov-ukg,

Запрос-то тру. А Вы рассказали бы - что за таблица, есть ли связи. Действительно, может толку от запроса никакого, стоит, например, защита по форейн-ключу. Может лучше посмотреть какие индексы сделать. Нужен сам запрос, который тормозит.
17 май 18, 09:43    [21415747]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3342
karpov-ukg
Подсчет записей в программе вызывает ее зависание, а как сделать это в IBExpert я не нашел. Большое, короче, количество.
SELECT COUNT(*) FROM TABLE_NAME
17 май 18, 09:48    [21415762]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
Alibek B.
Member

Откуда:
Сообщений: 2666
karpov-ukg
Разраб говорит: давай базу - посмотрим. А начальство не разрешает.

Если разработчик, прежде чем дать инструкции по удалению, просит посмотреть базу, значит лучше ему ее дать.
А если начальство не разрешает, значит ничего удалять не нужно.
17 май 18, 10:12    [21415914]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 380
KreatorXXI
karpov-ukg,

Запрос-то тру. А Вы рассказали бы - что за таблица, есть ли связи. Действительно, может толку от запроса никакого, стоит, например, защита по форейн-ключу. Может лучше посмотреть какие индексы сделать. Нужен сам запрос, который тормозит.


Для начала можно DDL искомой таблицы привести (в Эксперте закладка "Скрипт" или "DDL").

А подсчёт количества записей во всей таблице, как правило, не имеет смысла, таблица может быть огромной. Смысл имеет подсчёт количества записей по какому-нибудь критерию (например, за период времени), а здесь нужно смотреть наличие индексов. Если их нет, или нужных нет, то перебирается вся таблица, что не есть хорошо.
17 май 18, 10:13    [21415922]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 27141
KreatorXXI,

да он не понимает в БД. Какой смысл такие советы давать.
Этот топик из разряда "дайте я сам починю ядерный реактор".
17 май 18, 11:13    [21416237]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
karpov-ukg
Member

Откуда:
Сообщений: 5
310354
KreatorXXI
Для начала можно DDL искомой таблицы привести (в Эксперте закладка "Скрипт" или "DDL").

Вкладки DDL не нашел,
+ скопировал из вкладки скрипт

/******************************************************************************/
/*** Generated by IBExpert 17.05.2018 11:09:07 ***/
/******************************************************************************/

/******************************************************************************/
/*** Following SET SQL DIALECT is just for the Database Comparer ***/
/******************************************************************************/


/******************************************************************************/
/*** Tables ***/
/******************************************************************************/



CREATE TABLE HISTORY (
IDHIST INTEGER NOT NULL,
IDCUST INTEGER NOT NULL,
IDUSER INTEGER,
DATECR DATE,
HISTORY CHAR(1) COLLATE PXW_CYRL,
NOTE VAR4096 COLLATE PXW_CYRL /* VAR4096 = VARCHAR(4096) */,
ACCESS CHAR(1),
PRIOR CHAR(1) default "-" COLLATE PXW_CYRL,
BUDIL CHAR(1) default "-" COLLATE PXW_CYRL,
IDHISTTYPE INTEGER NOT NULL,
IDCONTACTS ID_NULL /* ID_NULL = INTEGER */,
FILEPATH VAR255 COLLATE PXW_CYRL /* VAR255 = VARCHAR(255) */,
IDCREATOR INTEGER
);




/******************************************************************************/
/*** Primary keys ***/
/******************************************************************************/

ALTER TABLE HISTORY ADD PRIMARY KEY (IDHIST);


/******************************************************************************/
/*** Foreign keys ***/
/******************************************************************************/

ALTER TABLE HISTORY ADD CONSTRAINT FK_HISTORY_TO_CONTACTS FOREIGN KEY (IDCONTACTS) REFERENCES CONTACTS (IDCONTACTS) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE HISTORY ADD CONSTRAINT FK_HISTORY_TO_CUSTOMER FOREIGN KEY (IDCUST) REFERENCES CUSTOMER (IDCUST) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE HISTORY ADD CONSTRAINT FK_HISTORY_TO_HISTTYPE FOREIGN KEY (IDHISTTYPE) REFERENCES HISTTYPE (IDHISTTYPE) ON UPDATE CASCADE;
ALTER TABLE HISTORY ADD CONSTRAINT FK_HISTORY_TO_USERS FOREIGN KEY (IDUSER) REFERENCES USERS (IDUSER) ON UPDATE CASCADE;


/******************************************************************************/
/*** Indices ***/
/******************************************************************************/

CREATE DESCENDING INDEX HISTORY_DATECR ON HISTORY (DATECR);


/******************************************************************************/
/*** Privileges ***/
/******************************************************************************/

Скрин полей
Скрин индексов
Экспорт метаданных - и это наверно будет самая полная информация.
Чего бы еще вам показать... Говорю ж, в БД я - бландынка.
17 май 18, 11:51    [21416429]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
karpov-ukg
Member

Откуда:
Сообщений: 5
kdv
KreatorXXI,

да он не понимает в БД. Какой смысл такие советы давать.
Этот топик из разряда "дайте я сам починю ядерный реактор".

Нереально?
17 май 18, 11:53    [21416442]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 7991
karpov-ukg
... UPDATE CASCADE


ужас
17 май 18, 11:54    [21416447]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 23697
karpov-ukg
DATECR DATE,

Дата создания есть... Но все равно, отстрелит себе обе ноги, одну руку и хорошо, если голову не заденет.
17 май 18, 12:05    [21416494]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 27141
karpov-ukg
Нереально?

ну вот я не чиню трактора, потому что не умею. И не испытываю по этому поводу никаких сожалений.
Вам руководство на каком основании дало задание "уменьшить базу данных"? Вы админ? Или сами проявляете инициативу (которая обычно наказуема)?
Ваша задача была найти автора программы. Нашли. Руководство "давать" базу данных не хочет. А удаленный доступ даст? К другому компу с копией этой базы? Нет? Ну тогда сообщите руководству, что иначе удалить записи нельзя. Или пусть оно само (руководство) удалит эти записи.
Или пусть покупает ssd для хранения базы, тогда всё будет работать гораздо быстрее.
Впрочем, про размер базы мы так ничего и не услышали.
17 май 18, 12:21    [21416567]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 58464
kdv> Впрочем, про размер базы мы так ничего и не услышали.

Стопицот!

Какая разница? Важно не сколько там гиг, а как
написана - если размер небольшой, но написана
пер-анус - всё равно тормозить будет.

Posted via ActualForum NNTP Server 1.5

17 май 18, 12:23    [21416579]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 380
karpov-ukg,

нормальная таблица. И индекс по дате есть. А чего тормозит? Какую инфу пытаетесь вытащить из таблицы?
В принципе считаю, можно записи грохнуть по дате создания записи (DATECR). Некая история, никому уже не нужна.
17 май 18, 12:34    [21416622]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3342
KreatorXXI
В принципе считаю, можно записи грохнуть по дате создания записи (DATECR)

Можно сразу так:
WHERE CURRENT_TIMESTAMP BETWEEN '2001-01-01' AND '2101-01-01'

Навсякий: karpov-ukg, это шутка, не делай такого.
17 май 18, 12:50    [21416687]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
karpov-ukg
Member

Откуда:
Сообщений: 5
Я понял, что с этим не так все просто, как на самом деле.
Благодарю всех откликнувшихся, извиняюсь за потраченное время.
Добра.
И ПыСы
YuRock
Догадался. По конечной дате.
И ПыСы2
А народ в этой ветке поотзывчевей, чем на иных форумах. Где меня постов 20 бы обливали дерьмом, прежде чем написать по делу.
17 май 18, 16:28    [21417762]     Ответить | Цитировать Сообщить модератору
 Re: Удаление записей за период времени  [new]
fraks
Member

Откуда: Новосибирск
Сообщений: 1314
karpov-ukg
И ПыСы
YuRock
Догадался. По конечной дате.

У меня такое ощущение что догадался, но неправильно :)

DELETE FROM TABLE_NAME 
WHERE CURRENT_TIMESTAMP BETWEEN '2001-01-01' AND '2101-01-01'

CURRENT_TIMESTAMP - это текущее дата-время.
Т.е. если эту команду выполнить в период с 2001 года по 2101 год - то она просто удаляет ВСЕ ЗАПИСИ из таблицы :)
А если каким-то образом текущая дата не поопадает в вилку годов - то просто ничего не делает.
18 май 18, 04:26    [21419213]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Firebird, InterBase Ответить