Firebird 1.5.3 Classic, Debian Linux, Dual Core
2 таблицы REG и OST для учета остатков товара по складам.
CREATE TABLE REG (
TW_ID ID /* ID = INTEGER NOT NULL */,
SHOP_ID ID /* ID = INTEGER NOT NULL */,
SKL_ID ID /* ID = INTEGER NOT NULL */,
DT DATE,
TW_KOL FLOAT,
ID ID /* ID = INTEGER NOT NULL */,
TYP ID /* ID = INTEGER NOT NULL */,
FRM_ID ID /* ID = INTEGER NOT NULL */
);
CREATE TABLE OST (
TW_ID INTEGER,
SKL_ID INTEGER,
TW_KOL DOUBLE PRECISION,
TM DATE
);
индексы имеются.
REG - примерно 2 000 000 записей, OST - примерно 100 000.
в REG добавляются и удаляются записи при проведении документов.
на REG есть триггеры, которые при вставке или удалении соответственно прибавляют или удаляют значения в OST.
//пример триггера.
CREATE OR ALTER TRIGGER REG_BI0 FOR REG
ACTIVE BEFORE INSERT POSITION 0
AS
begin
update ost set tw_kol = tw_kol+new.tw_kol, tm = 'now' where tw_id=new.tw_id and skl_id=new.skl_id;
if ( row_count = 0) then
insert into ost (tw_id, skl_id, tw_kol, tm)
values(new.tw_id, new.skl_id, new.tw_kol, 'now');
end
ввел такую схему пару дней назад для ускорения получения остатков
для проверки запускаю запросик:
select 1, cast(sum(tw_kol) as float) rr from reg
union
select 2, cast(sum(tw_kol) as float) os from ost
в случае запуска запроса без нагрузки на сервер возвращаются одинаковые значения. (LA 0.2-0.4).
сегодня была ситуация когда нагрузка выросла до LoadAverage 6-9.
(Строились отчеты, проводились документы, обрабазывалась синхронизация.) в итоге запрос выполнялся минут 15 (на низкой нагрузке выполняется секунд 20).
и запрос выдал разные значения..........
позже сервак разгрузился и опять были одинаковые результаты......
вопрос: почему были разные значения???
PS:
(нагрузку на сервак в 6-8 прошу не комментировать )