Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Есть таблица А в ней порядка 7ми миллионов записей. И таблица Б в которой скажем 500 миллионов записей. Таблица Б является дитем от таблицы А. table_a ====== id <pk> .... table_b ====== id <pk, fk> (FK to table_a.id) date <pk> ..... т.е. для каждого ИД из таблицы А я имею от нуля до N записей в таблице Б с разными датами. т.е. таблица Б не что иное как "лог-файл". Задача проста.... для каждго ИД из таблицы А хранить не более скажем 30ти записей в таблице Б. Т.е. при добавлении новой записи с последней датой, старая (которая стала 31ой) должна уйти.... Желательно чтобы удаление производилось ночью и вставка новых записей не была сильно нагружена. в день добавляется около 10 млн записей.... т.е. порядок удаления будет такой же. ну кто тут самый главный архитектор? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 01:24 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
1. Сервер ? 2. Структура потенциально изменяема ? Решение 1 На уровне идеи, можно ничего вообще не удалять, а для каждого table_a.id сразу вставить 30 записей, а потом переписывать самые старые записи новой информацией, типа закольцованого буфера. P.S. На главного архитектора не претендую, полагаю решений еще будет много. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 02:01 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
структура жесткая.... сразу создавать нельзя. это будет против правил бизнесса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 02:37 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
МС СКЛ если это играет роль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 02:37 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
2 папа Карло >для каждго ИД из таблицы А хранить не более скажем 30ти записей в таблице Б. .... Желательно чтобы удаление производилось ночью и вставка новых записей не была сильно нагружена. Какое из правил может быть нарушено при попытке добавить 31-ю запись? Если первое то решение - скрипт зпаускаемый ночью и удаляющий все кроме последних 30 записей. Вставка не загружена. Если второе - то триггер или вставка через процедуру, но первое ИМХО лучше. Вставка загружена, но по-моему ничего другого, что бы точно поддерживало предел в 30 записей придумать невозможно. ИМХО оптимизировать можно только запросы, которые будут это все выполнять плюс индексы. Если есть желание то можем обсудить вопрос за пивом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 03:15 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
"и удаляющий все кроме последних 30 записей" ты эту квери представил ? :) а теперь помножб на 7 млн..... а у меня только час есть на то, чтоб все почистить..... тут тоньше надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 03:39 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
>ты эту квери представил ? :) а теперь помножб на 7 млн..... а у меня только час есть на то, чтоб все почистить..... тут тоньше надо. Тоньше врядли получится. 7 млн за час может и отработает, если правильно проиндексировать. Это ~2000 записей/сек. Зависит от железа. Можно триггером записывать количество дочерних записей во вспомогательное поле (или таблицу) и запросом бежать по записям, где кол-во дочерних больше 30. Но немного замедлится вставка. По-моему удаление лишних записей во время вставки будет лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 04:55 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
я готов добавить оверхед на вставку.... но не сильный.... 2-3% не более. железо 4 камня, 4 гига.... раид 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 05:02 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
>я готов добавить оверхед на вставку.... но не сильный.... 2-3% не более. железо 4 камня, 4 гига.... раид 10. Ты мне льстишь, я не такой спец по железу и МССКЛ-ю, чтоб глянуть и сразу сказать, уложится в час или нет. Если уложится, то впритык, но это чистое ИМХО. Я бы сделал так. Написал бы триггер на вставку дочерней записи, который бы увеличивал на единицу поле-счетчик в родительской таблице, когда он больше 30, удалял бы самую старую запись. count не делать, хотя с ним было бы проще и надежней, но медленне. Хотя на 30 записях тяжело сказать, может и быстрее т.к. не нужно лазить в родительскую таблицу. Если вдруг будет быстро работать, то можно перейти на count. У тебя добваление ~120 записей в секунду, должно хватить. Понятно что еще нужно внимательно выставить isolation level. Поле-счетчик можно вынести в отдельную таблицу и в другой tablespace, но это уже вариации на тему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 06:26 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Как выглядит индекс таблицы? Если это primary key (FK, PK(Date)) то через count можно будет быстро почистить лишние записи, хоть разом хоть при вставке. Если индекс другой, то и не знаю что можно предложить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 09:08 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
таблицы можно создавать дополнительно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 11:01 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Imho две стратегии: 1. Удалять лишние записи при вставке новых. Плюс: компактность (хотя при оверхеде размера таблицы в 2% преимущество представляется сомнительным). Минус: увеличение времени добавления новых записей. 2. Удалять лишние записи периодически (необязательно ночью, количество запущенных экземпляров бота обратно пропорционально общей загруженности сервера). Оптимизировать просмотр записей table_a (например, добавлением date (время последней вставки данных в table_b, соответствующим table_a.id) для исключения полного перебора. Плюс: мало изменяется время добавления новых записей. Минус: изменяется структура таблицы; дополнительный код для оптимизатора бота. 1. проще, 2. imho правильнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 11:23 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Не добавлять и не удалять записи. Вместо этого применить Update. Особенно это добавит быстродействия, если в Update не попадут поля, используемые в индексах. Для этого в родительской таблице применить циклический счетчик по модулю 30 . Пока его значение меньше 30, запись вставляется. Далее делается Update в запись, значение ключа которой равно значению счетчика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 12:38 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
PVPНе добавлять и не удалять записи. Вместо этого применить Update. Особенно это добавит быстродействия, если в Update не попадут поля, используемые в индексах. Насколько я понимаю, при любой нормальной реализации сервера UPDATE таки заметно медленнее INSERT. Соответственно, мысль хороша, но если скорость добавления не является абсолютно критичной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 12:52 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
softwarer PVPНе добавлять и не удалять записи. Вместо этого применить Update. Особенно это добавит быстродействия, если в Update не попадут поля, используемые в индексах. Насколько я понимаю, при любой нормальной реализации сервера UPDATE таки заметно медленнее INSERT. Соответственно, мысль хороша, но если скорость добавления не является абсолютно критичной.Insert выполняет меньше работы с LOG-файлом. Но при этом обязательно требуется перестроение индексов. Если Размер записи не большой, то затраты на работу с LOG в оператора Update не значительные. Кроме того, в контексте данного вопроса, если применять Insert, то придется применять Delete. А здесь уже полностью задействуется и LOG, и индексы. По моему опыту, самые большие тормоза при вставке и уделении с больших таблицами - это индексы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 13:02 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
А количество записей - принипиально? Если исходить из предположения, что данное ограничение связано с экономией дискового пространства, то может задачу можно несколько видоизменить, например условие "количество записей" заменить на "записей за последние 30 дней" скажем? Если так, то все будет гораздо проще. Иначе - "тяжелые" SQL запросы, о которых говорилось выше, или какие-нибудь трюки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 13:12 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
JimmyА количество записей - принипиально? Если исходить из предположения, что данное ограничение связано с экономией дискового пространства, то может задачу можно несколько видоизменить, например условие "количество записей" заменить на "записей за последние 30 дней" скажем? Если так, то все будет гораздо проще. Иначе - "тяжелые" SQL запросы, о которых говорилось выше, или какие-нибудь трюки.Если позволить накопление записей, то самая тяжелая часть SQL-запроса при удалении будет "... from table_b inner join table_a on ...". А там же есть еще и "...Where ...". И сколько времени будет проходить удаление, можно только догадываться, а следовательно гадать "Пройдет до началы смены или нет?" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 13:21 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Я не знаю почему, но от количества записей в таблице время удаления записит нелинейно, по параболе. Для удаления больших массивов приходится использовать курсор, что бы он удалял записи кусками. Во первых, так проходит быстрее и, во-вторых, можно наблюдать прогресс удаления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 13:26 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Некогда вникать сильно в суть, то мне кажется, что если нужно удалять запись "master", и ее записи в "detail" в процессе работы и, счет идет на миллионы записей (юзеров скока будет законнекчено?), то система будет неработоспособна из-за низкой скорости. Напрашивается мысль о пометки записей как удаленных, а физически удалять в соотв. с придуманным регламентом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 17:56 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
PVPЕсли позволить накопление записей, то самая тяжелая часть SQL-запроса при удалении будет "... from table_b inner join table_a on ...". А там же есть еще и "...Where ...". И сколько времени будет проходить удаление, можно только догадываться, а следовательно гадать "Пройдет до началы смены или нет?" Не понял проблемы. В случае "записей за последние 30 дней": -- for Sybase ASE 12.x DELETE MyTable WHERE MyDate < convert(char(8),dateadd(dd,-30,getdate()),112) Где там join? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 18:23 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
2 Jimmy Да, JOIN там действительно не зачем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 18:30 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
за посл. 30 дней удаляем сейчас и как бы работает без проблем..... проблема в том, что по некоторым ИД записи в логе появляются скажем раз в год или два года, без системно, но далеко не каждый день, именно поэтому поступило требование хранить последние Н(30-40) обзоров. апдейт не подходит совсем... дата (в виде инта) в индексе и никуда ты от нее не денешься... было бы интересно посмотреть на солюшен с пометкой записей которые надо удалить.... ну и между делом..... тут код привели.... Код: plaintext так никто не удаляет.... ибо индексы не работают..... Код: plaintext 1. 2. тьщательнее товарищи.... не допускаем тейблсканов..... ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2005, 23:01 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
папа Карлотак никто не удаляет.... ибо индексы не работают.... ... тьщательнее товарищи.... не допускаем тейблсканов..... ;) Вообще-то деньги за эту работу платят вам, так что удаляйте как надо и не допускайте тейблсканов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2005, 02:08 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
авторВообще-то деньги за эту работу платят вам, так что удаляйте как надо и не допускайте тейблсканов... хороший солюшен. мне нравится :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2005, 04:02 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
А можно мне как полному профану в MS SQL тоже попутно задать вопросик? Что будет если перед добавлением записи делать так: delete from table_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) ? Такой вариант чем плох? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2005, 04:11 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Простите, опечатка вкралась. Хотел написать так: 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2005, 04:13 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
А если так Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2005, 04:46 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
такое будет работать.... только не для 10 миллионов записей в течении часа. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2005, 05:39 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Пошли по кругу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2005, 06:56 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. Я имел ввиду для каждой записи в рабочем режиме. Мне кажется , надо думать в сторону обработки именно в рабочем режиме. а если так 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) То есть обрабатывать код кусками, хранить необработанные куски, если ночи не хватит ну и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2005, 07:42 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
папа Карлоза посл. 30 дней удаляем сейчас и как бы работает без проблем..... проблема в том, что по некоторым ИД записи в логе появляются скажем раз в год или два года, без системно, но далеко не каждый день, именно поэтому поступило требование хранить последние Н(30-40) обзоров. апдейт не подходит совсем... дата (в виде инта) в индексе и никуда ты от нее не денешься... было бы интересно посмотреть на солюшен с пометкой записей которые надо удалить.... ну и между делом..... тут код привели.... Код: plaintext так никто не удаляет.... ибо индексы не работают..... Код: plaintext 1. 2. тьщательнее товарищи.... не допускаем тейблсканов..... ;) А я ведь недаром указал версию СУБД, когда такой "странный" запрос с конвертацией даты привел. На Syabse ASE в такой форме запрос работает быстрее, нежели с getdate(), т.к. оптимизатор сначала вычисляет выражение, а потом использует его, как переменную, а преобразование же char->datetime происходит автоматом. И, как ни странно, никакого tablescan не происходит. Вот такой загадочный Sybase :0) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2005, 09:54 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
папа Карлотакое будет работать.... только не для 10 миллионов записей в течении часа. :( Друг мой, я вам уже намекал. Разделите понятия физического и логического удаления,идея то старая-престарая! В мастер-таблице вводится поле/флаг "IsDeleted" (хотя идея применима не только к удалению!). Ну и, когда надобно удалять, мы выставляем этот флаг. Например есть 10000 записей в мастер-таблице подлежащих удалению, а у каждой, в среднем например, по 500 дочерей. При удалении мы модифицирует поле IsDeleted у 10000 записей(дочки нас сейчас не интересуют и это Главный наш козырьмы займемся ими как стемнеет,в соответствии с регламентом). Разница очевидна: пометить на удаление 10000 записей можно за приемлемое время даже на вашей хилой технике (но не 10000+10000 х 5000). Вот собственно и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2005, 14:47 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Ортодокс , кто тебе сказал что мне надо с мастера что-то удалять? :) В мастере как есть 7 млн записей так и есть... они никуда не уходят.... задача для каждой "мастер" записи хранить не более тридцати-сорока-пятидесити (в зависимости от установок) "чайлд" записей. у не против хранить счетчик где-то, но(!) прикол закулючается в том, что 80% мастер записей будут иметь 30 чайлдов в течении 1го месяца.... 98% мастер записей будут иметь 30 чайлдов в течении полугода.... т.е. получается что счетчик то можно хранить, только толку по прошествии полугода от этого счетчика не будет никакой, ибо 98% записей все равно набо обрабатывать.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2005, 21:46 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
папа Карло Ортодокс , кто тебе сказал что мне надо с мастера что-то удалять? :) В мастере как есть 7 млн записей так и есть... они никуда не уходят.... задача для каждой "мастер" записи хранить не более тридцати-сорока-пятидесити (в зависимости от установок) "чайлд" записей. у не против хранить счетчик где-то, но(!) прикол закулючается в том, что 80% мастер записей будут иметь 30 чайлдов в течении 1го месяца.... 98% мастер записей будут иметь 30 чайлдов в течении полугода.... т.е. получается что счетчик то можно хранить, только толку по прошествии полугода от этого счетчика не будет никакой, ибо 98% записей все равно набо обрабатывать.... Да можно и детали и любой поддетали искуственно создать соподчинения вводом парой полей..кока-нить xID и xParentID и никто незапрещает им иметь тип "DateTime...", ну а дальше можете держать подчиненных(в этой же самой таблице) сколько удобно, можно и менять это число на ходу, а дальше...? Сказанное остается в силе, блин! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2005, 00:09 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Ортодокс, код в студию.... с таблицами.... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2005, 04:21 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
папа КарлоОртодокс, код в студию.... с таблицами.... :) Принцип решения, я думаю понятен всем, но вот разработать и отладить код, это батенька, придется попотеть А ктож нынче потеет за бесплатно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2005, 10:35 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Ортодокс, то что ты там придумал совсем не разшает задачи которая поставлена... тут хоть потей хоть не потей... если бы ты знал как сделать, то написал бы хотябы воркфлоу для поставленной задачи, которое не требует кода и при известном подходе пишется за 15 минут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.04.2005, 22:57 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Workflow (тьфу ты,слово то какое заскорузлое) пущай пионэры пишуть, им делать нехрена...туды яго в качель ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2005, 02:28 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Programmer_OrtodoxWorkflow (тьфу ты,слово то какое заскорузлое) пущай пионэры пишуть, им делать нехрена...туды яго в качель ну значит только бакланить и умеешь, дедушка. ЗЫ Уа-ха-ха.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2005, 03:23 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Я весьма и весьма загружен в последнее время, только презренный металл может заставить меня повернуть круто носом к ветру! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2005, 05:33 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Если говорить серьезно, то вы совершенно напрасно так пренебрегли высказанной идеей! Во многих системах, критичных ко времени реакции, подобные манипуляции с данными, откладываются на потом, НО, бех ужерба для "здоровья", т.е. на логическом уровне удаления сделаны, а фактическая черная работа оставлена на потом, это и операционные системы всех мастей и не только...А тщательная,детальная и скрупулезная проработка требует сил и времени,хотя многим может быть легко убедить самих себя в обратном... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2005, 05:49 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
update может оказаться предпочтительнее, поскольку delete и последующий insert могут привести к фрагментации табличного/файлового пространства, или как там оно называется в MSSQL, а при таких объемах это должно привести к сильным тормозам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2005, 12:53 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
BrokenPotupdate может оказаться предпочтительнее, поскольку delete и последующий insert могут привести к фрагментации табличного/файлового пространства, или как там оно называется в MSSQL, а при таких объемах это должно привести к сильным тормозам. дефрагментируем раз в неделю на выходных и индексы пересоздаем.... так что особой проблемы нет... апдейты не получится делать.... логическое удаление.... это один из вариантов.... хочется посмотреть на альтернативы.. у меня в голове два подхода... мне охота посмотреть что народ думает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2005, 02:15 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
папа Карло апдейты не получится делать.... Папа Карло, а можете привести аргументы, почему не проходит Update? Кроме того, если уж вопрос вызвал такой интерес, то почему бы не представить структуру дочерней таблицы, хотя бы в части полей, которые входят в индексы. И еще, будут ли оглашены "два подхода", когда никто не придумает походящее решение. Если останутся только они, то это же самое "крутое" решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2005, 13:42 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Если в реальном режиме какие-нибудь графики не создаются и длина записи во второй таблице фиксирована, то вторая таблица вообще не нужна. Надо в первую таблицу добавит счетчик, и буфер на N записей и работать только c Insert и Update. Или, на худой конец счетчик, и буфер на вторую таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2005, 14:27 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Забыл уж MSSQL,но: Процедура добавления в лог: Берем, открываем курсор со всеми записями table_b, лежащими под нужной, отсортированными по дате в обратном порядке (старые - в конце). Идем по курсору. Если дошли до 30-й записи, то апдейтим дату, инфу. Если на 29 (или менее) записи кончились - то инсертим новую. Вот только дату из PK надо выкинуть (для 30 записей на одного папу второе поле, фактически, имеет кардинальность 1/30 против 1/7000000 для ID). И один раз прочистить лог, чтобы не было более 30. В качестве поддержки в проход по курсору можно добавить удаление того, что старее 30 записей - de facto, выполняться не будет. Итого - на одну запись открывется не более 2 курсоров. Бонусы - в учтоявшемся режиме совсем не перестраиваются индексы, а если еще поля фиксированные - то и место не перераспределяется - т.е. нагрузка минимальна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2005, 19:46 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Добавить в обе таблицы по полю: 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 индекс как раз должен использоваться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.04.2005, 18:27 |
|
||
|
задачка про историю...
|
|||
|---|---|---|---|
|
#18+
Все сказано еще на первой странице. Вариантов 2: - явное удаление - использование "уборщика мусора" (мусором считается запись с порядковым номером > 30) Папе карло пора стругать буратину, примеряя реализации к своим требованиям. -- Открытая SmallERP / Архитекторы программных систем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.04.2005, 16:04 |
|
||
|
|

start [/forum/topic.php?all=1&fid=32&tid=1545940]: |
0ms |
get settings: |
7ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
134ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
76ms |
get tp. blocked users: |
1ms |
| others: | 231ms |
| total: | 484ms |

| 0 / 0 |
