Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Народ, какие есть в принципе концептуальные решения для каше для построения консистентных отчетов. Идеальано получать отчету по snap-shot'у данных, однако при условии активного изменения данных пользователями (1000+ CU), генерация отчета происходит по изменяющемуся во времени extent'у. Соответственно вне зависимости от скорости работы генератора отчета существует вероятность изменения данных подлежащих включению в отчет, в итоге генерация отчета по состоянию "на сегодня" дает неверный результат при любом раскладе. Варианты решений которые видятся навскидку 1) Выполнять отчеты в ночное время - не подходит т.к. отчеты могут выполняться дольше ночного времени, к тому же ночью происходят другие регламентные задачи включая full backup. К тому же теоретически ночью пользователи могут работать. 2) Лочить данные на запись и выполнять очередь отчетов - также неприемлем, ввиду длительного подвешивания системы на локе 3) Делать что-то похожее на snap-shot путем организации shadow - тоже малопрактичен, т.к. для каждой операции построения отчета необходимо отключать апдейты с источника на весь период выполнения отчетов. Соответственно частота обновления данных определяется временем требуемым на выполнение всей очереди отчетов. К тому же требует доп. сервера для shadow 4) Выполнять отчеты по состоянию на "вчера" - для этого требуется организация историчности данных на уровне приложения, что не всегда возможно сделать если система не проектируется с нуля. Кроме того, в прикладной системе может быть не запрещен ввод данных задними числами, и тогда попадаем опять под неконсистентность отчета. Вопрос как вы выходите из ситуации в своих системах? Есть ли решения на системном уровне для других СУБД? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2011, 22:47 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Rus000, я конечно не знаю размера ваших таблиц из личного опыта основные таб1 -150тысяч,30полей таб2 -60тыс,10 полей стыковка М-М справочники(около 10 на 100т всего) принцип работы -каждое утро запоминались как-есть таблицей-моментальный снимок таблиц задачи -при необходимости(запросу начальства) -в течении дня -дополнительно -для отчетов высвечивался список доступных архивов -с выбранного(хоть на начало квартала) --отчеты, в шапке дата архива -отчеты с живых таблиц не делались, архивы не корректировались -для сравнения начала квартала и текущего --отчет с двух-трех-четырех архивов этим обеспечивалась идентичность исходной базы по связанным отчетам на заданную дату -укрупненные отчеты-для начальства -деталировка по разным критериям -просмотр динамики изменения по запросу позиции номенклатуры ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2011, 23:26 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Rus000, Из представленных рассуждений (не очень понятно с количеством баз и объемами), проще всего было бы во время регламентного бэкапа ночью одновременно переносить данные в отдельную область для отчетов (на том же сервере, копия оперативных БД). Это можно сделать либо физическим копированием (размонтированных оперативных БД), либо восстановлением ночного бэкапа. Эта область для отчетов будет содержать все данные, актуальные на время бэкапа. В области должны исполняться только отчеты и должна быть запрещена корректировка данных. Тогда вы сможете спокойно получать согласованные отчеты, актуальные на ночное время, при любой длительности их выполнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2011, 06:48 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Я так понимаю, вопрос решать нужно было на этапе проектирования. Т.е. изменения каждого для должны храниться отдельно и индексироваться, тогда не было бы проблем с отчетом на определенный день. Ну или делать отчеты(или предварительное агрегирование данных для отчетов) ночью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2011, 07:13 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
На мой взгляд проблема фактически мало зависит от размера БД - она концептуальная. Если это прояснит выбор решения то, размер БД самого большого хоста порядка 100Гб с тенденцией роста на 20-30Gb+ ежегодно. Количество пользователей 1000+. ser_shu, Мысль с бэкапом понятна, и перекликается с п.3 моего поста. Единственное неудобство в этом варианте - медленный бэкап/рестор (полуручной) и нужен постоянный контроль все ли завершено без ошибок. Свежесть данных получится с задержкой на день. Shadow в этом смысле может дать более актуальные данные, правда shadow api еще тот инструмент. Блок А.Н., Вы пишете про п.4 моего поста. Это понятно, что на стадии проектирования можно было бы подумать об историчности данных, однако в проекте вы не всегда можете стоять у истоков архитектуры. Кроме того исторические данные влекут распухание БД, т.к. приходится хранить версии всех апдейтов. Вдобавок этот вариант не панацея, т.к. я написал в своем сообщении что приложения позволяет вводить документы задними числами - т.е. Вы все равно не избегаете неконсистентности отчета. Основной мой вопрос - а как эта проблема решается в других СУБД? Это же наверняка проработанный шаблон ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2011, 13:09 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
ПЕНСИОНЕРКА-каждое утро запоминались как-есть таблицей-моментальный снимок таблиц задачи что значит запоминалось? время требуемое на выполнение snap-shot должно быть близко к нулю чтобы никто не успел изменить данные которые вы включаете в snap-shot. Не думаю что Вам удалось достичь такой беспрецедентной скорости. Кроме того, то что работает на малых икстентах уже с оговорками работает на больших - десятки миллионов записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2011, 13:14 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Rus000ПЕНСИОНЕРКА-каждое утро запоминались как-есть таблицей-моментальный снимок таблиц задачи что значит запоминалось? время требуемое на выполнение snap-shot должно быть близко к нулю чтобы никто не успел изменить данные которые вы включаете в snap-shot. Не думаю что Вам удалось достичь такой беспрецедентной скорости. Кроме того, то что работает на малых икстентах уже с оговорками работает на больших - десятки миллионов записей. вы не оговаривали в постановке размеры таблиц вряд ли вы корректируете прошлогодний снег в последнюю ночь месяца -архив за прошедший месяц 24гб/12=2гб и архив текущего месяца --менее 2 гигов --вряд ли это проблема остальное остается в силе(отчеты с выбранного архива) можно накопить типичные итоги (без вышестоящих) для типичных запросов начальства -клиент,период(год,месяц),суммаЗакуп,суммаОплат -клиент,продукт,период(текущийМесяц),колич,суммаЗакуп,суммаОплат -клиент,продукт,период(прошлыйМесяц),колич,суммаЗакуп,суммаОплат и форму для произвольной сортировки и группировки фолуфабрикатов --подобие 1с-регистров ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2011, 13:38 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Rus000, Документы задними числами вводите, индексировать и хранится должна фактическая дата проводок. Про то, что вам это сейчас сложно сделать - понятно. Распухания особого нет, если вы не тащите историю как дублирование, а делаете ее встроенной в данные. Остается вариант - делать ночью какое-то агрегирование данных для отчетов и отчеты делать это этим данным, а не по живым. Как защиту от пользователей - лочить систему (если уж они у вас такие упорные). Если отчеты делаются дольше ночи - решать проблему производительности сервера либо организации данных. Скажите хоть, о каких объемах идет речь? Просто постановка задачи противоречивая - не можем изменить данных, не можем залочить систему (даже на ночь), но хотим видеть мнгновенный срез. Мне кажется, так не бывает :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2011, 15:53 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
кстати, у вас бухгалтерский период как-то реализован? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2011, 16:03 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.Rus000, Остается вариант - делать ночью какое-то агрегирование данных для отчетов и отчеты делать это этим данным, а не по живым. Как защиту от пользователей - лочить систему (если уж они у вас такие упорные). этот вариант понятен и он изначально озвучен. какие еще принципиально новые подходы есть? Блок А.Н.Скажите хоть, о каких объемах идет речь? выше я давал кратко - 100Gb БД, 1000+ пользователей, классов (таблиц) около 50, размер базовых икстентов порядка 1-4 млн, с приростом 0,5-1 млн в квартал. Блок А.Н.Просто постановка задачи противоречивая - не можем изменить данных, не можем залочить систему (даже на ночь), но хотим видеть мнгновенный срез. Мне кажется, так не бывает :-) таковы условия Однако еще раз повторю свой вопрос, который даже не в плоскости кашовой реализации КАК В ПРИНЦИПЕ СЧИТАТЬ НЕПРОТИВОРЕЧИВЫЕ ОТЧЕТЫ В АБСТРАКТНОЙ СУБД? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2011, 21:07 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
ПЕНСИОНЕРКАвы не оговаривали в постановке размеры таблиц вряд ли вы корректируете прошлогодний снег хорошо размеры я оговорил. да они в принципе не имеют значения т.к. вы не сделаете снапшот за мгновение. А раз не сделаете, значит вероятность что отчет будет противоречив остается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.04.2011, 21:10 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Rus000Соответственно вне зависимости от скорости работы генератора отчета существует вероятность изменения данных подежащих включению в отчет, в итоге генерация отчета по состоянию "на сегодня" дает неверный результат при любом раскладе. ... КАК В ПРИНЦИПЕ СЧИТАТЬ НЕПРОТИВОРЕЧИВЫЕ ОТЧЕТЫ В АБСТРАКТНОЙ СУБД? Определите, что Вы считаете непротиворечивым отчетом. У Вас ни "на вчера" ни "на сегодня" не будет одинаковых отчетов по одинаковым параметрам, если Вы не закрываете периоды и разрешаете корректировку. В абстрактной субд тоже. Если у Вас что то происходит с выборкой во время формирования отчета, то это решается фиксацией выборки во временную таблицу. И делайте потом отчет по этой временной таблице, никаких противоречий не будет при любой продолжительности отчета. Укажите конкретно, какие противоречия и какие неверные результаты Вы получаете в своем отчете, и какие желали бы получать непротиворечивые результаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2011, 05:09 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
ser_shuЕсли у Вас что то происходит с выборкой во время формирования отчета, то это решается фиксацией выборки во временную таблицу. И делайте потом отчет по этой временной таблице, никаких противоречий не будет при любой продолжительности отчета. помещение во временную таблицу - попытка сделать снапшот со временем существенно отличным от нуля. За время которое потребуется на копирование во временную таблицу (t) возможно произойдут изменения в данных (в ранее скопированных которые СТАЛИ удовлетворять условию отбора, но не были включены и/или в тех которые были отобраны для копирования и ПЕРЕСТАЛИ удовлетворять условию отбора) и объекты будут учены во временной таблице не на время запуска отчета (t0), и даже не на время окончания генерации отчета (или копирования во временную структуру), а на временные точки лежащие МЕЖДУ t0 и t0+t. Время t может занимать часы, соответственно, запустив генерацию отчета в 8.00 утра Вы получите результат не по состоянию БД на 8.00 утра, а по плавающему состоянию БД между 8 утра и временем окончания генерации, например 22.00. В этом и противоречивость. В то время как если бы мы могли делать снапшоты с временем создания слепка стремящимся к нулю (ну или как вариант путем создания резервной копии, или shadow с отключенным коннектом) мы всегда будем формировать правильный и непротиворечивый отчет по состоянию на время запуска. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2011, 08:06 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Rus000помещение во временную таблицу - попытка сделать снапшот со временем существенно отличным от нуля. ... Время t может занимать часы, соответственно, запустив генерацию отчета в 8.00 утра Вы получите результат не по состоянию БД на 8.00 утра, а по плавающему состоянию БД между 8 утра и временем окончания генерации, например 22.00. В этом и противоречивость. В то время как если бы мы могли делать снапшоты с временем создания слепка стремящимся к нулю (ну или как вариант путем создания резервной копии, или shadow с отключенным коннектом) мы всегда будем формировать правильный и непротиворечивый отчет по состоянию на время запуска. Теперь понятнее с противоречивостью. Если мы не можем сделать непротиворечивую выборку в работающей базе, то остается только работа с копией, пополняемой (заменяемой) во время прекращения работы отчетов. В случае с shadow с отключаемым коннектом отчет тоже будет не на момент запуска, а на момент отключения коннекта предыдущими запущенными, но незавершенными, отчетами. С shadow лучше только тем, что все транзакции будут завершены. С копиями завершение транзакций не гарантировано, нужно это обеспечивать дополнительно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2011, 08:55 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
КАК В ПРИНЦИПЕ СЧИТАТЬ НЕПРОТИВОРЕЧИВЫЕ ОТЧЕТЫ В АБСТРАКТНОЙ СУБД? СУБД разделяются на "блокировочники"(MSSQL, Cache) и "версионники"(Oracle). В блокировочниках, чтобы взять непротиворечивый отчет, устанавливается блокировка на изменение данных на время форирования отчета. В версионниках в отчет выбираются версии данных, сохраненные до момента запуска отчета. Для Вашего случая, как вариант, можно предложить "витрину данных" или DataWarehouse, оптимизированную под быстрое выполнение отчетов, а не просто копию базы. Тогда отчеты будут работать быстрее, и обновлять витрину Вы сможете чаще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2011, 16:37 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Я так понимаю, 1000+ пользователей - это внешние пользователи через веб? Которых вы не не можете ограничить и которые не подчиняются регламенту вашей организации. Тогда понятно, почему нельзя залочить базу. Тем не менее 50 таблиц это не так уж много, обычно большая часть из них справочная, рабочих таблиц с данными будет штук 10 максимум. Есть смысл подумать о доработке системы. Вот навскидку(хотя заочно сложно оценить их применимость): 1. историчность данных (да, я понял, как вы к этому относитесь ;-)) 2. делать снапшот ид таблиц и делать отчеты исходя из него, выкидывать все более поздние ид. Не работает, если правятся уже введенные ранее документы. 3. переводить систему в состояние "все изменения ненастоящие, пока делаем отчет", т.е. все изменения вносить в отдельные таблицы или в основные таблицы с особым флагом, а после окончания отчета сливать их с основными данными. Тут плохо то, что работы больше, чем с внедрением историчности. 4. постоянно держать актуальной статистику, при этом каждое изменение данных меняет статистический отчет. Тут надо очень аккуратно кодить, иначе есть риск, что статистика поплывет, а вы этого не заметите. Плюс еще надо думать как не попасть в блокировки от 1000 одновременно работающих пользователей. 5. каждое изменение документа в особую таблицу добавляет "дельту", плюс еще есть стабильная статистика. Позволит обойти взаимоблокировки, кодинга больше чем в (4), но чувствительность к ошибкам немного меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2011, 16:53 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
DirksDRКАК В ПРИНЦИПЕ СЧИТАТЬ НЕПРОТИВОРЕЧИВЫЕ ОТЧЕТЫ В АБСТРАКТНОЙ СУБД? СУБД разделяются на "блокировочники"(MSSQL, Cache) и "версионники"(Oracle). В блокировочниках, чтобы взять непротиворечивый отчет, устанавливается блокировка на изменение данных на время форирования отчета. правильно я понял что при запуске отчета на блокировочнике СУБД лочит все таблицы включенные в запрос и пока отчет не посчитается? Однако в этом случае пользователи должны висеть и транзакции не должны коммитится, так? Можете дать линк на документацию того же MSSQL где про это написано. DirksDRВ версионниках в отчет выбираются версии данных, сохраненные до момента запуска отчета. эта фича поддерживается на уровне СУБД? Можете детальнее пояснить механизм при условии что отчет сложный и требуется выполнить несколько sql-запросов к БД и между ними сделать аналитические вычисления. Если sql-запрос один логично что версионник может отдавать версии закоммиченных данных по состоянию на дату запуска запроса. Но КАК версионник контролирует процедуру прикладного отчета в котором разные селекты вызываются в разные времена в пределах процедуры формирования отчета? DirksDRДля Вашего случая, как вариант, можно предложить "витрину данных" или DataWarehouse, оптимизированную под быстрое выполнение отчетов, а не просто копию базы. Тогда отчеты будут работать быстрее, и обновлять витрину Вы сможете чаще. мой случай здесь не причем. У вас в приложении отчеты также неконсистентны если вы не придумали механизма который бы ее обеспечил. Либо условия эксплуатации Вашего приложения позволяют иметь технологические окна в которые вы вставляете обновления витрин. В это случае Вы работаете лишь по ограниченной модели, а я хотел бы понять теоретический механизм и лучшие практики в каше и других СУБД в максимально общем случае, который не подразумевает технологических окон, для пущей важности считайте что система 24x7 - что предложите? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2011, 20:59 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.Вот навскидку(хотя заочно сложно оценить их применимость): 1. историчность данных (да, я понял, как вы к этому относитесь ;-)) вполне позитивно, но это сильно утяжеляет как само приложение и систему отчетов для него. кроме того, если это изначально не было спроектировано переписывать смерти подобно. Блок А.Н.2. делать снапшот ид таблиц и делать отчеты исходя из него, выкидывать все более поздние ид. Не работает, если правятся уже введенные ранее документы. именно Блок А.Н.3. переводить систему в состояние "все изменения ненастоящие, пока делаем отчет", т.е. все изменения вносить в отдельные таблицы или в основные таблицы с особым флагом, а после окончания отчета сливать их с основными данными. Тут плохо то, что работы больше, чем с внедрением историчности. согласен - реализация слишком сложна Блок А.Н.4. постоянно держать актуальной статистику, при этом каждое изменение данных меняет статистический отчет. Тут надо очень аккуратно кодить, иначе есть риск, что статистика поплывет, а вы этого не заметите. Плюс еще надо думать как не попасть в блокировки от 1000 одновременно работающих пользователей. не вариант, иначе статистику придется актуализировать ДЛЯ ВСЕХ полей которые в принципе могут быть включены в какой-нибудь отчет. Это накладные расходы по записи, жесткая регламентация на перечень полей включаемых в отчет. По сути такая статистика никак не отличается от индексов и самое главное не решает вопрос противоречивости, потому как "статистика" будет также меняться в промежутке [t0;t0+t] где t0-время запуска отчета, а t- его длительность Блок А.Н.5. каждое изменение документа в особую таблицу добавляет "дельту", плюс еще есть стабильная статистика. Позволит обойти взаимоблокировки, кодинга больше чем в (4), но чувствительность к ошибкам немного меньше. не решает, ибо ограничено периодами докатки дельт на основную "статистику", а именно в это время может быть запущен отчет который пройдется по плавающей "статистике" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2011, 21:09 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
ser_shuЕсли мы не можем сделать непротиворечивую выборку в работающей базе, то остается только работа с копией, пополняемой (заменяемой) во время прекращения работы отчетов. В случае с shadow с отключаемым коннектом отчет тоже будет не на момент запуска, а на момент отключения коннекта предыдущими запущенными, но незавершенными, отчетами. С shadow лучше только тем, что все транзакции будут завершены. С копиями завершение транзакций не гарантировано, нужно это обеспечивать дополнительно. думается для каше это единственный путь достижения консистентности отчета, который тем не менее имеет минусы типа дискретности процедуры дежорналинга. В принципе с этим можно смириться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2011, 21:15 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Rus000правильно я понял что при запуске отчета на блокировочнике СУБД лочит все таблицы включенные в запрос и пока отчет не посчитается? Однако в этом случае пользователи должны висеть и транзакции не должны коммитится, так? Можете дать линк на документацию того же MSSQL где про это написано. http://articles.excelion.ru/science/info/57255758.html Rus000 Но КАК версионник контролирует процедуру прикладного отчета в котором разные селекты вызываются в разные времена в пределах процедуры формирования отчета? Затрудняюсь, возможно, если несколько селектов объединить в одну транзакцию, они будут брать версии данных на начало транзакции. Rus000мой случай здесь не причем. У вас в приложении отчеты также неконсистентны если вы не придумали механизма который бы ее обеспечил. Либо условия эксплуатации Вашего приложения позволяют иметь технологические окна в которые вы вставляете обновления витрин. В это случае Вы работаете лишь по ограниченной модели, а я хотел бы понять теоретический механизм и лучшие практики в каше и других СУБД в максимально общем случае, который не подразумевает технологических окон, для пущей важности считайте что система 24x7 - что предложите? У нас сейчас используется Оракл, долгоиграющих отчетов нет, тем не менее, каждую ночь обновляется витрина данных. Она полезна с многих точек зрения. У нас целью было не давать всем пользователям доступ к боевой БД (безопасность) и перенести часть нагрузки на сервер витрины. По-моему, Вы уже пришли к выводу, что нужна вторая база. Наверное, это и будет "лучшей практикой". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2011, 11:51 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
DirksDRА вот как работает Оракл... хм ... с ораклом тоже не все красиво насколько я понял - в рамках одно транзакции нужные версии данных берутся из сегментов отката, однако размер их имеет ограничение и эти сегменты при активных апдейтах могут быть перезаписаны новыми данными. Во вторых, я не понял каким образом обеспечить непротиворечивое чтения для ВСЕГО ОТЧЕТА при условии что данные выбираются более чем одной транзакцией чтения. Приведен пример где в двух сессия коммитят данные на уровне READ_COMMITED и данные закоммиченные второй сессией попадают в первую. в ссылке по MSSQL вообще не нашел при непротиворечивое чтение за исключением уровня одной транзакции что и так понятно - это и в каше есть, только не помогает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2011, 20:38 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
А по этой ссылке можно прочесть что в оракле версии 8 проблема консистентности отчетов все еще была. Интересно есть ли изменения на системном уровне в более поздних версиях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2011, 20:46 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Вот описание подхода по созданию снапшотов у железячников. Пока 3:0 в пользу кашового shadow с возможностью программного отключения дежорналинга по свистку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2011, 20:59 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Ну и наконец википедия - snapshot . Замените создание резервной копии создание отчета на меняющейся БД получим один в один ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.04.2011, 21:05 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Что-то тема не пользуется популярностью, хотя концептульные недоработки каше налицо - нет ни версионности ни реализации снапшота ни repeatable read, которые есть в большинстве популярных РСУБД :( /topic/846423&pg=1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 14:27 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
а как тогда отчеты-то строим, господа? в расчете на ночные калькуляции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 14:28 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Вы так смело говорите про концептуальные недоработки каше, что я прямо удивляюсь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 15:22 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Блок А.Н., чему удивляетесь? разве Вы не согласны что в отсутствии нужного уровня изоляции транзакций формировать консистентные отчеты можно не в 100% случаев и лишь со множеством "если" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 15:35 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
для многопользовательской СУБД управление конкурирующими транзакциями - основная задача. в том числе на системном уровне должно быть решены вопросы с фантомами. сейчас максимум из того что должно быть есть только read_commited ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 15:40 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Ваши заявления про концептуальные недоработки подобны заявлениям на форуме японской кухни "только совершенные придурки могут есть с помощью палочек, все современные люди едят ножом и вилкой". Могу вам сказать, что вашу систему проектировал тот, кто не умеет этого делать, и теперь вы негодуете, что не пришел добрый дядя и не сделал за вас всю работу "на системном уровне". Мне, например, совершенно не нужно то, о чем вы говорите. И хотя наша система довольно таки многопользовательская, блокировки в ней используются в очень небольшом количестве мест. То же касается и транзакций, мало того многие программы с транзакциями мы иногда переписывали на код без транзакций либо с минимальным их количеством. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 16:13 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.Могу вам сказать, что вашу систему проектировал тот, кто не умеет этого делать, и теперь вы негодуете, что не пришел добрый дядя и не сделал за вас всю работу "на системном уровне". в отсутствие нормальных аргументов переход на личности порочная практика некоторых авторов в форумах при чем здесь дядя? почитайте начало топика - при чем здесь архитектура приложения? вопрос в том что без системно поддерживаемого СУБД снапшота или повторяемого чтения Вы принципиально в приложении не сможете обеспечить повторяемое чтение. Именно поэтому любой отчет априори неконсистентен. Да, в _некоторых_ случаях (в Вашей системе например ночью) может случиться так что апдейтов нет и отчет выдаст то что нужно, но в общем случае это не так. Блок А.Н.Мне, например, совершенно не нужно то, о чем вы говорите. И хотя наша система довольно таки многопользовательская, блокировки в ней используются в очень небольшом количестве мест. а где я упоминаю блокировки? Блок А.Н.То же касается и транзакций, мало того многие программы с транзакциями мы иногда переписывали на код без транзакций либо с минимальным их количеством. Видимо Вы не ведаете что творите. Каким образом Вы обеспечиваете атомарность изменений в Вашей системе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 18:18 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Rus000в отсутствие нормальных аргументов переход на личности порочная практика некоторых авторов в форумах Ну если в самом деле причина в личности. Не хотелось вас специально обижать, но ваша категоричность скорее всего следствие отчания, а не взвешенного подхода. Rus000 без системно поддерживаемого СУБД снапшота или повторяемого чтения Вы принципиально в приложении не сможете обеспечить повторяемое чтение. Да нет, вы путаете. Это Вы не можете ;-) Rus000 Блок А.Н.То же касается и транзакций, мало того многие программы с транзакциями мы иногда переписывали на код без транзакций либо с минимальным их количеством.Видимо Вы не ведаете что творите. Каким образом Вы обеспечиваете атомарность изменений в Вашей системе?Проще разобраться с ситуацией, когда падающий процесс говорит "пиу", и оставляет все как было. Значительная часть операций уже сама по себе атомарна, либо атомарность не критична. Используются статусы операций, анализ объектов перед операцией либо после операции. Ну и кое-где транзакции все-таки есть. Для примера, нужно разнести макет на 100000 записей. Как делать глупо - создать одну транзакцию в начале операции и в случае ошибок ее откатываем. Результат - множественные блокировки в системе, подвешивание с случае отката, проблемы с разбором полетов при ошибке. Как получше - поместить в транзакцию разноску одной строки Как еще лучше - не помещать разноску строки в транзакцию, а анализировать статус возврата более низкоуровневых функций, делающих проводки. Транзакции остаются только на самом нижнем уровне, который являятся критичным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 19:05 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.Rus000 без системно поддерживаемого СУБД снапшота или повторяемого чтения Вы принципиально в приложении не сможете обеспечить повторяемое чтение. Да нет, вы путаете. Это Вы не можете ;-) хех, для начала "давайте обсуждать вкус креветок с теми кто их ел" (c) что ж раз вызвались, покажите здесь пример _прикладного уровня_, обеспечивающий повторяемой чтение. Надеюсь не нужно напоминать требование к этому уровню изоляции? Проще разобраться с ситуацией, когда падающий процесс говорит "пиу", и оставляет все как было. Значительная часть операций уже сама по себе атомарна, либо атомарность не критична. это просто перл :) классический пример: со счета А делаем перевод денег на счет Б. Со счета А сняли, записать на Б не успели и процесс "пиу" (c). Транзакции нет - что делать-то будете? Для примера, нужно разнести макет на 100000 записей. [skip] Транзакции остаются только на самом нижнем уровне, который являятся критичным. и что показывает этот пример? вернитесь к repeatable read ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 19:58 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Ну вот не нужно снисходительно сверху вниз на меня смотреть. Проблемы то у вас, а не у меня. Rus000 классический пример: со счета А делаем перевод денег на счет Б. Со счета А сняли, записать на Б не успели и процесс "пиу" (c). Транзакции нет - что делать-то будете? Я понимаю, уже поздно и внимание ослабено. Почитайте внимательно - тут транзакции есть. Но во многих других местах их не будет. Но можно и тут обойтись без транзакций, при условия что запрос каше целиком либо выполняется, либо нет. Если не ошибаюсь, то внутри одного запроса каше все-таки использует транзакции. Например, (1) записываем в таблицу проводок две проводки поочередно со статусом "предварительно". (2) Если запись прошла без ошибок, меняем статус этих записей на "записано" одним запросом. Представьте, что вот есть, например, оракл. И в нем, хотите вы того или нет, тоже есть микрооперации, абсолютно не реляционные, наподобие операций с глобалами в каше. И вот с помощью этих операций волшебный дядя "на уровне системы" организует все вот эти фантомы и все такое. Но так как это все должно быть, во-первых, универсально, во-вторых, оно будет там где надо и там где не надо - это будет жрать ресурсы. Ну вот я считаю, что этими ресурсами можно распорядиться по своему усмотрению. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2011, 20:51 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
что ж раз вызвались, покажите здесь пример _прикладного уровня_, обеспечивающий повторяемой чтение. Надеюсь не нужно напоминать требование к этому уровню изоляции? ждем примера, потом продолжим дискуссию про микрооперации ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2011, 15:46 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Вы опять все путаете. Это у вас проблемы, и вам нужна помощь. А с подходом, что вам кто-то что-то должен, вы далеко не уедете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2011, 17:05 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.Вы опять все путаете. Это у вас проблемы, и вам нужна помощь. А с подходом, что вам кто-то что-то должен, вы далеко не уедете. Коллега, у меня проблем нет. Проблемы есть у разработчиков которые принципиально в каше не могут выдавать заказчику консистентные отчеты на работающей системе, только на отсоединенном от апдейтов шадоу. Вы тоже в их числе. Если хотите это опровергнуть прошу привести пример повторяемого чтения на уровне прикладного кода каше, о котором вы публично заявили. Блок А.Н.Rus000 без системно поддерживаемого СУБД снапшота или повторяемого чтения Вы принципиально в приложении не сможете обеспечить повторяемое чтение. Да нет, вы путаете. Это Вы не можете ;-) Сказали А говорите Б - ждем, ждем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2011, 20:22 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
На слабо пытаетесь взять? Чтобы я пытаясь что-то вам доказать, делал за вас работу? Нее ... :-) Попытайтесь понять, что нет некого мистического "системного уровня". Все зависит от того, куда вас пускает производитель субд и что он за вас делает. Представьте, что вы разработчик оракла. Вот что бы вы сделали? Вот нужно сделать инсерт, чтобы его не видел другой процесс, вот апдейт нужно делать, но для разных процессов хранить обе копии. Представьте, что нет никаких транзакций. Ну? Это ведь не сложно. Вам же не нужно, как для оракла, делать универсальную систему, устойчивую ко всяким кривым рукам, вам не нужно писать компилятор запросов. Вам нужно это сделать по деревенски, на ваш прикладной уровень. ----- И все-таки, не нужно экстраполировать ваши проблемы на всех. И не думайте, что если вы отчеты берете с тени, то все это делают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2011, 21:19 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.На слабо пытаетесь взять? Чтобы я пытаясь что-то вам доказать, делал за вас работу? Нее ... :-) я не прошу делать за меня работу, а прошу показать ЛЮБОЙ мифический пример который бы показывал свойства повторяемого чтения. Примера я не вижу здесь, значит делаю вывод что этого сделать нельзя. Ну или точнее вы его сделать не можете, несмотря на бахвальство выше. Слив засчитан, как говорится. Что и требовалось доказать про концептульные пробелы каше. Попытайтесь понять, что нет некого мистического "системного уровня". Все зависит от того, куда вас пускает производитель субд и что он за вас делает. Представьте, что вы разработчик оракла. Вот что бы вы сделали? Вот нужно сделать инсерт, чтобы его не видел другой процесс, вот апдейт нужно делать, но для разных процессов хранить обе копии. Представьте, что нет никаких транзакций. Ну? Это ведь не сложно. поверьте, это сложно. возьмите пару серьезных книжек по транзакционной обработке и офигеете от теоретических посылок, я уже не говорю о реализации. И все-таки, не нужно экстраполировать ваши проблемы на всех. И не думайте, что если вы отчетык берете с тени, то все это делают. Если Вы этого не понимаете то это не значит что этой проблемы в СУБД не существует. Я утверждаю что есть нерешенная в каше задача обеспечения transaction level consistency. Именно поэтому приходится лепить коленочные "конструкторы" которые и отдаленно не могут приблизится по степени проработки системных решений, которые есть в большинстве популярных СУБД, ДАЖЕ в FB, которая не позиционируется как промышленная. И из-за отсутствия таких системных механизмов прикладные разработчики и как следствие заказчики получают непонятно какие отчеты. Вот в чем печаль, коллега. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2011, 20:25 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Я понимаю, вам единственная радость потешить свое ЧСВ. Удивительно :-) На прикладном уровне гораздо все гораздо проще, вам не нужно писать универсальный компилятор и процессор запросов, учитывающий все эти моменты. Вам всего лишь нужно хранить данные так, чтобы самому в них не запутаться. Т.е. все версии данных, если они имеют какое-то значение, должны храниться. К каждой версии данных должна быть прикреплена метка времени. В большинстве случаев этого будет достаточно, и это просто в реализации. У меня устойчивое ощущение, что я это говорил кому-то с проблемой, подозрительно похожей на вашу, но он отмахнулся. Я ассоциирую его с вами, и поэтому ваше требование примера реализации мне казалось странным. Если вы используете длительные транзакции, то все усложняется (поэтому я избегаю длительных транзакций) В случае с одним уровнем транзакции нужно будет держать метки нахождения в транзакции и временные метки выхода из транзакций, что уже на грани изврата, а в случае многоуровневых транзакций и вовсе превращается в хрен знает что. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2011, 21:35 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.У меня устойчивое ощущение, что я это говорил кому-то с проблемой, подозрительно похожей на вашу, но он отмахнулся.Я ассоциирую его с вами, и поэтому ваше требование примера реализации мне казалось странным. А ну так это в этой же теме было: http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=840890&msg=10465459 Для вас оказалось проблемой изменить архитектуру своего приложения, но зато вы с легкостью говорите о изменении архитектуры каше. Кстати, дату документа, о которой вы там говорите, вы путаете с меткой времени, которую я имею ввиду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2011, 21:45 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.На прикладном уровне гораздо все гораздо проще, вам не нужно писать универсальный компилятор и процессор запросов, учитывающий все эти моменты. Вам всего лишь нужно хранить данные так, чтобы самому в них не запутаться. Т.е. все версии данных, если они имеют какое-то значение, должны храниться. К каждой версии данных должна быть прикреплена метка времени. В большинстве случаев этого будет достаточно, и это просто в реализации. это проще для систем которые только в стадии проектирования. Но не применимо для систем архитектура уже сложилась за годы эксплуатации и доработки. Если бы каше представляло возможность создания снапшотов и повторяемого чтения, решение было бы универсально для любых приложений причем _без переделки_, соответственно сохранение ранее вложенных в разработку программы инвестиций. Если вы используете длительные транзакции, то все усложняется (поэтому я избегаю длительных транзакций) это понятно, вопрос не в этом, а в том, что для обеспечения консистентности вам _придется_ использовать длинную транзакцию для обертывания всего отчета, чтобы он посчитался корректно. По крайней мере так делается в оракле, ms sql, sybase и FB. С учетом того, что в каше нет консистентности на уровне транзакций, делать длинные транзакции не имеет смысла. В случае с одним уровнем транзакции нужно будет держать метки нахождения в транзакции и временные метки выхода из транзакций, что уже на грани изврата, а в случае многоуровневых транзакций и вовсе превращается в хрен знает что. я об этом и говорю - это однозначно не прикладной уровень. Все что бы ни сделал прикладной разработчик будет убогой поделкой по сравнению с аналогичной системной фичей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2011, 07:04 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Блок А.Н. Вы писали: Код: plaintext 1. 2. 3. 4. 5. А нельзя ли поподробней? Столкнулся с неожиданной (для меня) ситуацией: 1.Открываю два терминала Каше 2.В первом сеансе делаю: tstart s ^xx(22)=22 3.Во втором сеансе делаю: w ^xx(22) 22 Такими примерами на курсах по MSSQL и Oracle демонстрируют работу транзакций. Только там второй сеанс не видит НЕЗАКОМИТЧЕНЫХ данных первого сеанса. А здесь - пожалуйста, транзакция незакончена, а второй сеанс уже работает с ее данными. Транзакция первого сеанса может быть откачена, но часть ее данных попала в отчет, расчет или то, что делает второй процесс. Получается, что надо либо ставить блокировки, либо реализовать версионность данных на прикладном или инструментальном уровне. http://www.ibase.ru/devinfo/versions.htm - здесь приведено описание реализации версионности в InterBase. Если кто-то знает более простой способ, просьба привести ссылку или описание. В частности, Вы, Блок А.Н. пишете: "К каждой версии данных должна быть прикреплена метка времени. В большинстве случаев этого будет достаточно, и это просто в реализации." Как Вы с этим работаете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2011, 13:00 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Да, транзакционность в каше работает так, что ее как бы нет до тех пор, пока вы захотите откатить результаты. Мало того, блокировки тоже работают так, как будто их нет. Т.е. вы можете проверить наличие блокировки на ресурс, но это не помешает вам с ним работать, если захотите. Все на откуп разработчика. Применительно к вашему примеру, если вам нужно будет заменить ^xx c 22 на 220 "версионность" будет выглядеть так: s ^xx(1)=22 s ^xx(2)=-22 s ^xx(3)=220 Это грубо, конечно, но как-то аналогично делается и на таблицах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2011, 14:41 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.Да, транзакционность в каше работает так, что ее как бы нет до тех пор, пока вы захотите откатить результаты. Мало того, блокировки тоже работают так, как будто их нет. Т.е. вы можете проверить наличие блокировки на ресурс, но это не помешает вам с ним работать, если захотите. Все на откуп разработчика. Применительно к вашему примеру, если вам нужно будет заменить ^xx c 22 на 220 "версионность" будет выглядеть так: s ^xx(1)=22 s ^xx(2)=-22 s ^xx(3)=220 Это грубо, конечно, но как-то аналогично делается и на таблицах. Т.е. 1, 2 и 3 - это номера версий? А как с ними работать? Во время работы отчета может появиться версия 4. Как определить, что для отчета нужна версия 3? И где упомянутые Вами "временные ветки"? Впрочем, если это фирменное Ноу хау, я не настаиваю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2011, 15:57 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
DirksDR, "временные метки" (очепятка) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2011, 15:58 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
DirksDR, Это не ноу-хау каше, естественно. Пример условный, это тоже понятно. Просто если документ проводится или откатывается, то создаются новые проводки, а не исправляются старые. Если документ правится, то обычно имеет значение история и кто исправлял, т.е. создается строка истории. И если будет необходимость получить состояние системы на определенную временную метку, то это можно сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2011, 16:58 |
|
||
|
О построении отчетов на OLTP
|
|||
|---|---|---|---|
|
#18+
Блок А.Н., Спасибо, теперь понял. У нас система оперативно-диспетчерской отчетности аналогично формирует отчеты на любую дату, и даже с точностью до двухчасовки. Я немного на другом сосредоточился, поэтому не сразу вьехал. В процессе формирования отчета на текущую двухчасовку весьма вероятны изменения данных на эту двухчасовку. Диспетчера по нескольку раз могут перебивать показатели одной и той же двухчасовки. Чтобы в этих условиях получить непротиворечивый отчет, надо дискретизировать время до таймстампа, при формировании отчета засечь время, выждать полсекунды, и потом выбирать данные на момент засечки времени по таймстампам. Пожалуй, действительно проще interbase-овской версионности. P.S.На самом деле выждать надо не полсекунды, а время самой продолжительной транзакции на обновление:( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2011, 19:30 |
|
||
|
|

start [/forum/topic.php?all=1&fid=39&tid=1557677]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
| others: | 248ms |
| total: | 386ms |

| 0 / 0 |
