Гость
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / Толи косяк 12.10FC8, толи я переработал / 5 сообщений из 5, страница 1 из 1
12.07.2017, 16:28
    #39487703
falcon111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Толи косяк 12.10FC8, толи я переработал
Добрый день.
Делаю расчет некоторой статистики и столкнулся со странным глюком.

В процедуре делается предрассчет и выборка данных, их подготовка и фильтрация, в конечном итоге по ним надо построить топ-клиентов по сумме продаж.

Делал так:
Код: sql
1.
2.
3.
4.
5.
insert into tmp_StatisticsTopClientsSalesClientsTop(ClientId, Amount)
select first XTopX t1.ClientId, sum(t1.DstAmount)
from tmp_StatisticsTopClientsSalesPayments t1
group by 1
order by 2 desc;



Выходит полная лажа, там клиенты с одним-двумя платежами попадают в топ со смешными суммами.
Переделал так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
let i=0;
foreach select t1.ClientId, sum(t1.DstAmount)
        into    t_ClientId, t_Amount
        from tmp_StatisticsTopClientsSalesPayments t1
        group by 1
        order by 2 desc
  let i=i+1;
  if i>XTopX then exit foreach; end if;
  insert into tmp_StatisticsTopClientsSalesClientsTop(ClientId, Amount) values(t_ClientId, t_Amount);
end foreach;



Так все чудесно считает. Ощущение, что пора отдыхать, в трех соснах запутался уже, поясните почему результаты разные?
...
Рейтинг: 0 / 0
12.07.2017, 17:54
    #39487775
falcon111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Толи косяк 12.10FC8, толи я переработал
Вот проверочный скрипт, повторяющий все типовые особенности вычисления - создание таблиц, индексов по ним, заполнение, редактирование, вычисление по таблицам без логирования в транзакции и пр.:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
drop procedure if exists tmp_AggregationTest;
create procedure tmp_AggregationTest()
  define i, j integer;
  define v    money(20,2);

  begin
    on exception in (-206) -- table not found
      create temp table tmp_Test (
        SomeSer   serial,
        SomeId    integer,
        SomeValue money(20,2)
      ) with no log in TempSpace;
      create unique index tmp_Test_SomeSer on tmp_Test(SomeSer) in tempspace;
      create        index tmp_Test_SomeId  on tmp_Test(SomeId)  in tempspace;
      update statistics low for table tmp_Test;
    end exception with resume;
    delete from tmp_Test;
  end;

  begin work;
  for i=1 to 10000
    insert into tmp_Test(SomeId, SomeValue) values(1,1.01);
    insert into tmp_Test(SomeId, SomeValue) values(2,2.02);
    insert into tmp_Test(SomeId, SomeValue) values(3,3.03);
    insert into tmp_Test(SomeId, SomeValue) values(4,4.04);
    insert into tmp_Test(SomeId, SomeValue) values(5,5.05);
  end for;

  foreach select t.SomeSer
          into   i
          from tmp_Test t

    update tmp_Test as tt set tt.SomeValue=6+i/100-tt.SomeValue where tt.SomeSer=i;
  end foreach;

  begin
    on exception in (-206) -- table not found
      create temp table tmp_Test_Res1 (
        SomeId    integer,
        SomeValue money(20,2)
      ) with no log in TempSpace;
      update statistics low for table tmp_Test_Res1;
    end exception with resume;
    delete from tmp_Test_Res1;
  end;

  begin
    on exception in (-206) -- table not found
      create temp table tmp_Test_Res2 (
        SomeId    integer,
        SomeValue money(20,2)
      ) with no log in TempSpace;
      update statistics low for table tmp_Test_Res2;
    end exception with resume;
    delete from tmp_Test_Res2;
  end;

  insert into tmp_Test_Res1(SomeId, SomeValue)
  select first 3 t1.SomeId, sum(t1.SomeValue)
  from tmp_Test t1
  group by 1
  order by 2 desc;

  let j=0;
  foreach select t1.SomeId, sum(t1.SomeValue)
          into   i,         v
          from tmp_Test t1
          group by 1
          order by 2 desc

    let j=j+1;
    if j>3 then exit foreach; end if;
    insert into tmp_Test_Res2(SomeId, SomeValue) values(i,v);
  end foreach;

  commit work;

  return;
end procedure;
update statistics for procedure tmp_AggregationTest;

execute procedure tmp_AggregationTest();

select * from tmp_Test_Res1 order by 1;
select * from tmp_Test_Res2 order by 1;

drop procedure tmp_AggregationTest();



Результат работы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
someid      somevalue
---------------------------------
2                      2539750.00
3                      2529750.00
5                      2509750.00
3 rows selected.
someid      somevalue
---------------------------------
1                      2549750.00
2                      2539750.00
3                      2529750.00
3 rows selected.



Как видим, результаты разные. А должны быть одинаковыми. Баг?
...
Рейтинг: 0 / 0
14.07.2017, 10:06
    #39488864
яфшуеі
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Толи косяк 12.10FC8, толи я переработал
12.10FC6 - все одинаково
Недавно біл релиз FC9, посмотрите ошибки

индекс создавать лучше после заполнения таблиці, при создании индекса собирается и статистика (если не ошибаюсь, с 11.50 уже нет той проблемі которая біла ранее с временніми таблицами - необходимость обновлять статистику. достаточно только в правильном месте создать индекс)
...
Рейтинг: 0 / 0
26.07.2017, 21:42
    #39495597
falcon111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Толи косяк 12.10FC8, толи я переработал
Проверил сегодня FC9. Точно так же. :(
...
Рейтинг: 0 / 0
26.07.2017, 21:45
    #39495598
falcon111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Толи косяк 12.10FC8, толи я переработал
Кстати, если добавить update statistics low for table tmp_Test; перед foreach - тогда все пучком.
PS: А редактировать свои сообщения тут нельзя?
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / Толи косяк 12.10FC8, толи я переработал / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]