powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Снижение скорости работы на fb3.0 после fb 2.1
8 сообщений из 8, страница 1 из 1
Снижение скорости работы на fb3.0 после fb 2.1
    #39274392
mativil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По работе пользуемся firebrid 2.1
Имеем набор баз данных, в которых есть хранимые процедуры.
Сейчас у нас встал вопрос о переходе на вышедший недавно firebird 3.0

Перебэкапил базы данных из 2.1 в 3.0 с помощью gbak и стал тестировать скорость выполнения процедур.
Тестировал их через ibexpert, сделав ibeblock, который выполняет набор процедур 1000 раз и считает количество тиков между ними, по ним вычисляя скорость работы.
Заметил, что в firebird 3.0 ни одна из процедур не стала работать быстрее, а скорость некоторых так и вовсе упала раза в полтора.

Подумав, что дело может быть в ibexpert, решил перепроверить всё, написав простеньшую программу на .net с подключенным FirebirdSql.Data.FirebirdClient версии 4.6.2.0, которая так же выполняла введённый запрос 1000 раз, делая rollback после каждого выполнения.
Средние цифры для приложенного дальше запроса в вижуал студии:
fb21 ~ 54 мс
fb30 ~ 108 мс

Интересно, что в патчноутах писали про оптимизацию и ускорение работы, а на деле я столкнулся с обратным.
Приведенные ниже таблицы:

Файл schema.png поясняет связи таблиц.

Таблица test3 имеет порядка 1500 записей
Таблица test1 имеет порядка 1500 записей
Таблица test2 имеет порядка 160000 записей

Сразу огромная просьба - не критиковать, что таблицы не связаны внешними ключами, нет генераторов (получение айдишника завязано на max(id)) и есть другие неточности в логике/оптимизации запроса. Я примерно представляю, что это всё можно переделать по-человечески, вопрос сейчас именно в том, почему именно эти конструкции стали работать дольше.

Коротко о сути работы:

Процедура SP_SAVE_TEST3 либо вставляет новую запись test3, либо возвращает id существующей, если находит уже сущестующую запись по сравнению поля varchar

Последний блок (который как раз и запускается 1000 раз для тестов) по задаваемым переменным сначала получает айдишник test3 (через процедуру SP_SAVE_TEST3), далее по цепочке айдишник test2 и в конце делает вставку в test1.

Очень надеюсь, что кто-нибудь пояснит мне, с чем связано такое проседание по скорости.

Если это важно, то у меня intel core i3-4170, 8гб оперативы, windows 8.1 professional

Фаирберд 2.1 и 3.0 32 битный

Код: plsql
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.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/

CREATE TABLE TEST1 (
    ID      INTEGER NOT NULL,
    VVALUE1 VARCHAR(100),
    VVALUE2 VARCHAR(1000),
    TEST3ID INTEGER
);

CREATE TABLE TEST2 (
    ID          INTEGER NOT NULL,
    TEST1ID     INTEGER NOT NULL,
    DVALUE1     DOUBLE PRECISION,
    DVALUE2     DOUBLE PRECISION,
    DVALUE3     DOUBLE PRECISION,
    IVALUE1     INTEGER
);

CREATE TABLE TEST3 (
    ID         INTEGER NOT NULL,
    VVALUE1    VARCHAR(1000),
    DVALUE1    DOUBLE PRECISION
);

/******************************************************************************/
/***                              Primary keys                              ***/
/******************************************************************************/

ALTER TABLE TEST2 ADD CONSTRAINT PK_TEST2 PRIMARY KEY (ID);
ALTER TABLE TEST1 ADD CONSTRAINT PK_TEST1 PRIMARY KEY (ID);
ALTER TABLE TEST3 ADD CONSTRAINT PK_TEST3 PRIMARY KEY (ID);

/******************************************************************************/
/***                                Indices                                 ***/
/******************************************************************************/

CREATE INDEX TEST2_IDX2 ON TEST2 (TEST1ID);
CREATE INDEX TEST2_IDX3 ON TEST2 (IVALUE1);
CREATE INDEX TEST1_IDX1 ON TEST1 (DVALUE1);
CREATE INDEX TEST1_IDX2 ON TEST1 (TEST3ID);

create or alter procedure SP_SAVE_TEST3 (
    VVALUE1 varchar(1000),
    DVALUE1 double precision)
returns (
    ITEST3ID integer)
as
begin
  if (:VVALUE1 is null) then
    VVALUE1 = '';
  if (:DVALUE1 is null) then
    DVALUE1 = 1;

  if (exists(select *
             from TEST3
             where VVALUE1 = :VVALUE1)) then
  begin
    select first 1 ID
    from TEST3
    where VVALUE1 = :VVALUE1
    into :ITEST3ID;
  end
  else
  begin
    begin
      select max(ID) + 1
      from TEST3
      into :ITEST3ID;
      if (:ITEST3ID is null) then
        ITEST3ID = 1;
    end
    begin
      insert into TEST3
      values (:ITEST3ID, :VVALUE1, :DVALUE1);
    end
  end
  suspend;
end

execute block
                    as
                    declare variable ITEST1ID integer;
                    declare variable ITEST3ID integer;
                    declare variable ITEST2ID integer;
                    declare variable VVALUE1 varchar(100);
                    declare variable VVALUE2 varchar(1000);
                    declare variable VVALUE3 varchar(1000);
                    declare variable DPVALUE1 double precision;
                    declare variable DPVALUE2 double precision;
                    declare variable DPVALUE3 double precision;
                    declare variable DPVALUE4 double precision;
                    declare variable IVALUE1 integer;
                    begin
                    VVALUE1 = '';
                    VVALUE2 = '';
                    VVALUE3 = '';
                    DPVALUE1 = 0;
                    DPVALUE2 = 0;
                    DPVALUE3 = 0;
                    DPVALUE4 = 0;
                    IVALUE1 = 0;                  

                      /* Табличка test3 */
                      select ITEST3ID
                      from SP_SAVE_TEST3(:VVALUE3, :DPVALUE1)
                      into :ITEST3ID;

                      /*Проверяем наличие такой же записи TEST1 */
                      if (exists(select *
                                 from TEST1 M
                                 left join TEST3 U on (M.TEST3ID = U.ID)
                                 where M.VVALUE1 = :VVALUE1 and
                                       M.VVALUE2 = :VVALUE2 and
                                       U.VVALUE1 = :VVALUE3)) then
                      begin
                        select first 1 M.ID
                        from TEST1 M
                        left join TEST3 U on (M.TEST3ID = U.ID)
                        where M.VVALUE1 = :VVALUE1 and
                              M.VVALUE2 = :VVALUE2 and
                              U.VVALUE1 = :VVALUE3
                        into :ITEST1ID;
                      end
                      else
                      begin
                        begin
                          select max(ID) + 1
                          from TEST1
                          into :ITEST1ID;
                          if (:ITEST1ID is null) then
                            ITEST1ID = 1;
                        end
                        begin
                          insert into TEST1
                          values (:ITEST1ID, :VVALUE1, :VVALUE2, :ITEST3ID);
                        end
                      end
                        select max(ID) + 1
                        from TEST2
                        into :ITEST2ID;
                        if (:ITEST2ID is null) then
                          ITEST2ID = 1;

                        insert into TEST2
                        values (:ITEST2ID, :ITEST1ID, :DPVALUE2, :DPVALUE3, :DPVALUE4, :IVALUE1);

                    end



Надеюсь на вашу помощь и разъяснение.
При необходимости докину какие-нибудь дополнительные данные.
...
Рейтинг: 0 / 0
Снижение скорости работы на fb3.0 после fb 2.1
    #39274414
mativil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Версии серверов
2.1.6.18547
3.0.0.32483
Классик сервера, 32 битные
...
Рейтинг: 0 / 0
Снижение скорости работы на fb3.0 после fb 2.1
    #39274417
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mativil,

не внимательно читал где и что оптимизировано.

1. Увеличение скорости можно заметить лишь на многопользовательском доступе, также значительно улучшены свип, сборка мусора, инкрементный бекап. В одном потоке будет примерно на 20% медленнее.
2. В 3.0.0 найдена регресия в индексах. Рекомендую попробовать текущий снапшот.
3. Ты ничего не сказал в о конфигурации и используемой архитектуре. Надеюсь ты не сравнивал сладкое с кислым (CS vs SS).
4. Оптимизатор в 3.0 был изменён. По отдельным запросам внутри ХП надо сравнивать планы. На самом деле в ряде случаев лучше, но иногда может серьёзно промахиваться.
5. В 3.0 есть множество нововведений SQL, переписав ваши запросы/ХП с их использованием можно добится значительного увеличения производительности.
6. Другие регресии связанные с быстродействием сейчас изучаются и скорее всего к 3.0.1 будут исправлены. Что в прочем как всегда вспомните 2.5.0.
...
Рейтинг: 0 / 0
Снижение скорости работы на fb3.0 после fb 2.1
    #39274423
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mativil,

В 3.0 на многопользовательском доступе классик сливает суперу конкретно.
...
Рейтинг: 0 / 0
Снижение скорости работы на fb3.0 после fb 2.1
    #39274424
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисРекомендую попробовать текущий снапшот.+1
...
Рейтинг: 0 / 0
Снижение скорости работы на fb3.0 после fb 2.1
    #39274441
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladСимонов ДенисРекомендую попробовать текущий снапшот.+1
Я так понимаю совет по поводу снепшота 4.0?
Потому как CORE-5302 не бекпортирована.
...
Рейтинг: 0 / 0
Снижение скорости работы на fb3.0 после fb 2.1
    #39274453
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgmhvladпропущено...
+1
Я так понимаю совет по поводу снепшота 4.0?
Потому как CORE-5302 не бекпортирована.Гм, да, совсем про это забыл. Жду подтверждения от Таблоида, что этот патч не сломал CORE-4914.
...
Рейтинг: 0 / 0
Снижение скорости работы на fb3.0 после fb 2.1
    #39274469
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

я прогонял его тест в 4.0 на 200 коннектах. База осталась целой. Хотя пусть он сам подтвердит.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Снижение скорости работы на fb3.0 после fb 2.1
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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