Всем, привет.
В базах данных не силен, так что извините за морось, если будет. Хочу спросить совета перед началом экспериментов.
Возникла необходимость написать очень грузную процедуру расчета данных на сервере.
Требования:
— создать периодическую процедуру расчета статистических данных по результатам работы учетной системы.
— рассчитать за возможно короткое время и результаты предоставить в виде отдельной таблицы.
— вынос всего функционала и данных на отдельный сервер не подходит, т.к. результата расчета должен быть использован существующей учетной системой и должен храниться в той же базе данных, что и исходные данные.
— не использовать технологии OLAP (учетная система не умеет полноценно работать с кубами)
Заведомо известно, что запуск процедуры с использованием штатных средств (существующей учетной системы) не уложится в максимально допустимый период (1 ночь) т.к. сервер находится под нагрузкой круглосуточно. Нагрузка на сервер связана не с исчерпыванием ресурсов, а с большим количеством блокировок данных. Данные непрерывно модифицирует вышеуказанная учетная система не умеющая работать с версионностью записей. (READ_COMMITTED_SNAPSHOT OFF). Саму процедуру буду писать на SQL (пока еще не совсем понятно как
но по крайней мере появится возможность использовать MSSQL на полную).
Суть вопроса: выиграю ли я что-то по времени если перед расчетом перенесу необходимые исходные данные с рабочего сервера на какой либо другой сервер (или просто в другую базу данных там же), там рассчитаю и верну результаты в таблицу обратно в базу. Это идея или "анекдот", собственно?
Если это идея, то можно ли перенос данных настроить с помощью механизма репликаций и как? (В общем куда рыть надо?)
P.S. может просто написать в той же базе, но с использованием версионности так чтобы не мешать работе системы? Тогда как? ... Вопросов много — ответов нет.
Хелп, плз!
M>Суть вопроса: выиграю ли я что-то по времени если перед расчетом перенесу необходимые исходные данные с рабочего сервера на какой либо другой сервер (или просто в другую базу данных там же), там рассчитаю и верну результаты в таблицу обратно в базу. Это идея или "анекдот", собственно? Если это идея, то можно ли перенос данных настроить с помощью механизма репликаций и как? (В общем куда рыть надо?)
M>P.S. может просто написать в той же базе, но с использованием версионности так чтобы не мешать работе системы? Тогда как? ... Вопросов много — ответов нет.
M>Хелп, плз!
Перенос в др. базу тебе ничего не даст, на др. сервер, если только твой расчет слишком прожорлив до процессорного времени и это самое узкое место. Обычно данные выгружают во временные таблицы с необходимой группировкой и объединением и работают уже непосредственно с ними. При расчете статистики по объемным данным особая точность не нужна (в большом строительстве метр не кривизна), т.е. за копейками гнаться не стоит, поэтому если мешают блокировки можно использовать грязное чтение — процент ошибки будет крошечный. Если у тебя используется серьезный мат. аппарат посмотри в сторону создание процедуры на .NET — потому как TSQL ужасно тормозная вещь, по возможности избегай создание курсоров, делай все вычисления запросами и в один проход.
Собственно все.