проблема union?

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

Модераторы: kdv, dimitr

Ответить
aaa3d
Сообщения: 69
Зарегистрирован: 23 ноя 2005, 11:06

проблема union?

Сообщение aaa3d » 25 июн 2008, 11:16

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 прошу не комментировать :D )

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 25 июн 2008, 11:40

Учись правильно изолировать тр-ции.

aaa3d
Сообщения: 69
Зарегистрирован: 23 ноя 2005, 11:06

Сообщение aaa3d » 25 июн 2008, 11:43

select 1, cast(sum(tw_kol) as float) rr from reg
union
select 2, cast(sum(tw_kol) as float) os from ost


где тут разные транзакции?

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 25 июн 2008, 11:47

Read committed тебе не подходит
Включай уже моск

aaa3d
Сообщения: 69
Зарегистрирован: 23 ноя 2005, 11:06

Сообщение aaa3d » 25 июн 2008, 12:00

хм.... хотел позлиться но сперва почитал доку и понял что лошара я....

спасибо.
суть проблемы понял, моск будет помнить

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 25 июн 2008, 13:22

aaa3d писал(а):хотел позлиться но сперва почитал доку
Правильный подход :) Может в FAQ ? :D

Ответить