powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / задачка про историю...
23 сообщений из 48, страница 2 из 2
задачка про историю...
    #32989989
Сонный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простите, опечатка вкралась. Хотел написать так:
delete from table_b b
where b.id = @a_pk
and b.date not in
(select top 29 t.date from table_b t
where id = @a_pk
order by t.date desc)
...
Рейтинг: 0 / 0
задачка про историю...
    #32989995
Фотография vma_mnt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create #Table (id int)

insert into #Table (id) select top  30  from  table_b b whehe b.FK = @a_pk order by b.PK desc

delete from table_b b
where b.FK = @a_pk
and b.PK not in
(select id from #Table )
...
Рейтинг: 0 / 0
задачка про историю...
    #32990002
папа Карло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
такое будет работать.... только не для 10 миллионов записей в течении часа. :(
...
Рейтинг: 0 / 0
задачка про историю...
    #32990029
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пошли по кругу.
...
Рейтинг: 0 / 0
задачка про историю...
    #32990044
Фотография vma_mnt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create #Table (id int)

insert into #Table (id) select top  30  PK from  table_b b whehe b.FK = @a_pk order by b.PK desc

delete from table_b b
where b.FK = @a_pk
and b.PK not in
(select id from #Table )

Я имел ввиду для каждой записи в рабочем режиме. Мне кажется , надо думать в сторону обработки именно в рабочем режиме.

а если так

select FK from table_b having count(PK) > 30

Разбивается на интервалы с приемлемым значением записей

delete from table_b b
where b.FK in (PK bp интервала)
and b.PK not in
(select top 30 PK from table_b whehe table_b.FK = b.FK)

То есть обрабатывать код кусками, хранить необработанные куски, если ночи не хватит ну и т.д.
...
Рейтинг: 0 / 0
задачка про историю...
    #32990164
Фотография Jimmy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
папа Карлоза посл. 30 дней удаляем сейчас и как бы работает без проблем..... проблема в том, что по некоторым ИД записи в логе появляются скажем раз в год или два года, без системно, но далеко не каждый день, именно поэтому поступило требование хранить последние Н(30-40) обзоров.

апдейт не подходит совсем... дата (в виде инта) в индексе и никуда ты от нее не денешься... было бы интересно посмотреть на солюшен с пометкой записей которые надо удалить....

ну и между делом..... тут код привели....

Код: plaintext
DELETE MyTable WHERE MyDate < convert(char( 8 ),dateadd(dd,- 30 ,getdate()), 112 )

так никто не удаляет.... ибо индексы не работают.....

Код: plaintext
1.
2.
declare @border datetime
set @border = dateadd( d, - 30 , getdate())
delete from table where date <= @border

тьщательнее товарищи.... не допускаем тейблсканов..... ;)
А я ведь недаром указал версию СУБД, когда такой "странный" запрос с конвертацией даты привел.
На Syabse ASE в такой форме запрос работает быстрее, нежели с getdate(), т.к. оптимизатор сначала вычисляет выражение, а потом использует его, как переменную, а преобразование же char->datetime происходит автоматом.
И, как ни странно, никакого tablescan не происходит.
Вот такой загадочный Sybase :0)
...
Рейтинг: 0 / 0
задачка про историю...
    #32991175
Programmer_Ortodox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
папа Карлотакое будет работать.... только не для 10 миллионов записей в течении часа. :(
Друг мой, я вам уже намекал. Разделите понятия физического и логического удаления,идея то старая-престарая! В мастер-таблице вводится поле/флаг "IsDeleted" (хотя идея применима не только к удалению!). Ну и, когда надобно удалять, мы выставляем этот флаг. Например есть 10000 записей в мастер-таблице подлежащих удалению, а у каждой, в среднем например, по 500 дочерей. При удалении мы модифицирует поле IsDeleted у 10000 записей(дочки нас сейчас не интересуют и это Главный наш козырьмы займемся ими как стемнеет,в соответствии с регламентом).
Разница очевидна: пометить на удаление 10000 записей можно за приемлемое время даже на вашей хилой технике (но не 10000+10000 х 5000). Вот собственно и все.
...
Рейтинг: 0 / 0
задачка про историю...
    #32992169
папа Карло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ортодокс , кто тебе сказал что мне надо с мастера что-то удалять? :) В мастере как есть 7 млн записей так и есть... они никуда не уходят.... задача для каждой "мастер" записи хранить не более тридцати-сорока-пятидесити (в зависимости от установок) "чайлд" записей.

у не против хранить счетчик где-то, но(!) прикол закулючается в том, что 80% мастер записей будут иметь 30 чайлдов в течении 1го месяца.... 98% мастер записей будут иметь 30 чайлдов в течении полугода.... т.е. получается что счетчик то можно хранить, только толку по прошествии полугода от этого счетчика не будет никакой, ибо 98% записей все равно набо обрабатывать....
...
Рейтинг: 0 / 0
задачка про историю...
    #32992278
Programmer_Ortodox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
папа Карло Ортодокс , кто тебе сказал что мне надо с мастера что-то удалять? :) В мастере как есть 7 млн записей так и есть... они никуда не уходят.... задача для каждой "мастер" записи хранить не более тридцати-сорока-пятидесити (в зависимости от установок) "чайлд" записей.

у не против хранить счетчик где-то, но(!) прикол закулючается в том, что 80% мастер записей будут иметь 30 чайлдов в течении 1го месяца.... 98% мастер записей будут иметь 30 чайлдов в течении полугода.... т.е. получается что счетчик то можно хранить, только толку по прошествии полугода от этого счетчика не будет никакой, ибо 98% записей все равно набо обрабатывать....

Да можно и детали и любой поддетали искуственно создать соподчинения вводом парой полей..кока-нить xID и xParentID и никто незапрещает им иметь тип "DateTime...", ну а дальше можете держать подчиненных(в этой же самой таблице) сколько удобно, можно и менять это число на ходу, а дальше...?
Сказанное остается в силе, блин!
...
Рейтинг: 0 / 0
задачка про историю...
    #32992351
папа Карло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ортодокс, код в студию.... с таблицами.... :)
...
Рейтинг: 0 / 0
задачка про историю...
    #32992700
Programmer_Ortodox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
папа КарлоОртодокс, код в студию.... с таблицами.... :)

Принцип решения, я думаю понятен всем, но вот разработать и отладить код, это батенька, придется попотеть А ктож нынче потеет за бесплатно?
...
Рейтинг: 0 / 0
задачка про историю...
    #32994454
папа Карло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ортодокс, то что ты там придумал совсем не разшает задачи которая поставлена... тут хоть потей хоть не потей... если бы ты знал как сделать, то написал бы хотябы воркфлоу для поставленной задачи, которое не требует кода и при известном подходе пишется за 15 минут.
...
Рейтинг: 0 / 0
задачка про историю...
    #32994534
Programmer_Ortodox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Workflow (тьфу ты,слово то какое заскорузлое) пущай пионэры пишуть, им делать нехрена...туды яго в качель
...
Рейтинг: 0 / 0
задачка про историю...
    #32994540
папа Карло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Programmer_OrtodoxWorkflow (тьфу ты,слово то какое заскорузлое) пущай пионэры пишуть, им делать нехрена...туды яго в качель

ну значит только бакланить и умеешь, дедушка.

ЗЫ Уа-ха-ха....
...
Рейтинг: 0 / 0
задачка про историю...
    #32994548
Programmer_Ortodox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я весьма и весьма загружен в последнее время, только презренный металл может заставить меня повернуть круто носом к ветру!
...
Рейтинг: 0 / 0
задачка про историю...
    #32994549
Programmer_Ortodox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если говорить серьезно, то вы совершенно напрасно так пренебрегли высказанной идеей! Во многих системах, критичных ко времени реакции, подобные манипуляции с данными, откладываются на потом, НО, бех ужерба для "здоровья", т.е. на логическом уровне удаления сделаны, а фактическая черная работа оставлена на потом, это и операционные системы всех мастей и не только...А тщательная,детальная и скрупулезная проработка требует сил и времени,хотя многим может быть легко убедить самих себя в обратном...
...
Рейтинг: 0 / 0
задачка про историю...
    #32996145
BrokenPot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
update может оказаться предпочтительнее, поскольку delete и последующий insert могут привести к фрагментации табличного/файлового пространства, или как там оно называется в MSSQL, а при таких объемах это должно привести к сильным тормозам.
...
Рейтинг: 0 / 0
задачка про историю...
    #32997142
папа Карло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BrokenPotupdate может оказаться предпочтительнее, поскольку delete и последующий insert могут привести к фрагментации табличного/файлового пространства, или как там оно называется в MSSQL, а при таких объемах это должно привести к сильным тормозам.

дефрагментируем раз в неделю на выходных и индексы пересоздаем.... так что особой проблемы нет... апдейты не получится делать....

логическое удаление.... это один из вариантов.... хочется посмотреть на альтернативы.. у меня в голове два подхода... мне охота посмотреть что народ думает.
...
Рейтинг: 0 / 0
задачка про историю...
    #32998049
Фотография PVP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
папа Карло апдейты не получится делать....
Папа Карло, а можете привести аргументы, почему не проходит Update?

Кроме того, если уж вопрос вызвал такой интерес, то почему бы не представить структуру дочерней таблицы, хотя бы в части полей, которые входят в индексы.

И еще, будут ли оглашены "два подхода", когда никто не придумает походящее решение. Если останутся только они, то это же самое "крутое" решение.
...
Рейтинг: 0 / 0
задачка про историю...
    #32998181
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если в реальном режиме какие-нибудь графики не создаются и длина записи во второй таблице фиксирована, то вторая таблица вообще не нужна. Надо в первую таблицу добавит счетчик, и буфер на N записей и работать только c Insert и Update. Или, на худой конец счетчик, и буфер на вторую таблицу.
...
Рейтинг: 0 / 0
задачка про историю...
    #33007033
Фотография RA\/EN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл уж MSSQL,но:

Процедура добавления в лог:
Берем, открываем курсор со всеми записями table_b, лежащими под нужной, отсортированными по дате в обратном порядке (старые - в конце). Идем по курсору. Если дошли до 30-й записи, то апдейтим дату, инфу. Если на 29 (или менее) записи кончились - то инсертим новую.
Вот только дату из PK надо выкинуть (для 30 записей на одного папу второе поле, фактически, имеет кардинальность 1/30 против 1/7000000 для ID).
И один раз прочистить лог, чтобы не было более 30.
В качестве поддержки в проход по курсору можно добавить удаление того, что старее 30 записей - de facto, выполняться не будет.

Итого - на одну запись открывется не более 2 курсоров.
Бонусы - в учтоявшемся режиме совсем не перестраиваются индексы, а если еще поля фиксированные - то и место не перераспределяется - т.е. нагрузка минимальна.
...
Рейтинг: 0 / 0
задачка про историю...
    #33009171
Oleg Perekhrest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добавить в обе таблицы по полю:
table_a
======
id <pk>
latest_version number
....

table_b
======
id <pk, fk> (FK to table_a.id) <uk>
date <pk>
version number <uk>

+ доп. уник.индекс <id, version>
.....

При вставке записи в table_b увеличивать счетчик в таблице table_a на единицу, и использовать данное значение в table_b.
На триггере after insert или по регламенту удалять из table_b строки у которых
id=? and version < latest_version - 30
индекс как раз должен использоваться
...
Рейтинг: 0 / 0
задачка про историю...
    #33016398
Templar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все сказано еще на первой странице. Вариантов 2:
- явное удаление
- использование "уборщика мусора" (мусором считается запись с порядковым номером > 30)

Папе карло пора стругать буратину, примеряя реализации к своим требованиям.

--
Открытая SmallERP / Архитекторы программных систем
...
Рейтинг: 0 / 0
23 сообщений из 48, страница 2 из 2
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / задачка про историю...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]