Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Разница в скорости выпрлнения SP и execute block / 10 сообщений из 10, страница 1 из 1
17.03.2021, 12:17
    #40054507
Alex Truhin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разница в скорости выпрлнения SP и execute block
Столкнулся с такой проблемой. Есть небольшая SP, не устраивала скорость работы:
--->>> stored proc
План
PLAN (TMP_GOODS_FOR_CASH NATURAL)(DL_CASHREGISTER_GETMACRO NATURAL)JOIN (T NATURAL, GS OB0 INDEX (PK_GOODS), GS OB1 INDEX (PK_DIRECTORY), GS OB2 S_OBJECTS INDEX (PK_S_OBJECTS), BC OB2 S_OBJECTS INDEX (FK_S_OBJECTS_PARENT_ID), BC OB0 INDEX (PK_BARCODES), BC OB1 INDEX (PK_DIRECTORY))
------ Информация о производительности ------
Время подготовки запроса = 16ms
Время выполнения запроса = 593ms
Current memory = 36 139 460
Max memory = 39 192 080
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 226 353
начал разбираться, внутренние запросы выполняются быстро. Решил попробовать с execute block
План
PLAN (TMP_GOODS_FOR_CASH NATURAL)
PLAN JOIN (CASHREGISTER OB2 S_OBJECTS INDEX (PK_S_OBJECTS), CASHREGISTER OB0 INDEX (PK_CASHREGISTER), CASHREGISTER OB1 INDEX (PK_DIRECTORY))(MACRO_GET_DATA NATURAL)
PLAN JOIN (BC OB1 INDEX (CL_DIRECTORY_NAME), BC OB0 INDEX (PK_BARCODES), BC OB2 S_OBJECTS INDEX (PK_S_OBJECTS), T INDEX (PK_TMP_GOODS_FOR_CASH), GS OB0 INDEX (PK_GOODS), GS OB1 INDEX (PK_DIRECTORY), GS OB2 S_OBJECTS INDEX (PK_S_OBJECTS))
------ Информация о производительности ------
Время подготовки запроса = 47ms
Время выполнения запроса = 32ms
Current memory = 36 198 556
Max memory = 39 192 080
Memory buffers = 2 048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 7 178

Т.е. время было 593ms - стало 32ms. Процедуру перекомпилировал - эффекта нет. Откуда такая разница по времени.
...
Рейтинг: 0 / 0
17.03.2021, 12:22
    #40054510
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разница в скорости выпрлнения SP и execute block
Alex Truhin,

не верю что процедура и блок эквивалентны. У тебя даже планы слишком разные
...
Рейтинг: 0 / 0
17.03.2021, 12:25
    #40054511
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разница в скорости выпрлнения SP и execute block
Alex Truhin,

очевидно - разные планы.

Версия и архитектура FB ?
...
Рейтинг: 0 / 0
17.03.2021, 12:35
    #40054520
Alex Truhin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разница в скорости выпрлнения SP и execute block
Версия 2.5
sp и eb эквивалентны. На планы обратил внимание, почему так не знаю
Код: 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.
create or alter procedure DL_GOODS_GETONBARCODE (
  SEARCHSTR type of column CL_DIRECTORY.NAME,
  CASHREGISTER integer,
  IS_REMAINS_ONLINE integer = 0)
returns (
  ID integer,
  FLAGS integer,
  ABBR varchar(10),
  NAME type of column GOODS.MENUNAME,
  PRICE MONEY,
  BCCOUNTS COUNTS,
  REMAINS COUNTS)
AS
  declare GS_CLASS INTEGER;
  declare R_SHOUSE REFERENCE;
begin
  if (not exists(select first 1 ID from TMP_GOODS_FOR_CASH))
    then execute procedure DL_GOODS_FILL_CASH(:CASHREGISTER);

  --
  select O_DT_REFERENCE
  from DL_CASHREGISTER_GETMACRO(:CASHREGISTER, 'Разное\Расчет остатков по складу')
  into :R_SHOUSE;

  SEARCHSTR = Upper(:SEARCHSTR);
  for select GS.ID, 1, GS.CLASS_ID, GS.ABBR, GS.NAME, T.PRICE, GS.BARCODECOUNTS
      from GOODS GS
        join TMP_GOODS_FOR_CASH T on GS.ID = T.ID
        join BARCODES BC on GS.ID = BC.PARENT_ID
      where GS.STATUS > 0 and BIN_AND(GS.FLAGS, 32) = 0
            and BC.NAME = :SEARCHSTR
     -- order by NAME
      into :ID, :FLAGS, :GS_CLASS, :ABBR, :NAME, :PRICE, :BCCOUNTS
  do begin
    REMAINS = 0;
    if ((IS_REMAINS_ONLINE > 0) and (GS_CLASS = 3000 /* PRODUCE */)) then begin
      execute procedure REMAINS_ONLINE (:ID, :R_SHOUSE)
      returning_values :REMAINS;
    end
    suspend;
  end
end


execute block
Код: 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.
execute block  (
  SEARCHSTR varchar(300) = :SEARCHSTR,
  CASHREGISTER integer = :CASHREGISTER,
  IS_REMAINS_ONLINE integer = :IS_REMAINS_ONLINE)
returns (
  ID integer,
  FLAGS integer,
  ABBR varchar(10),
  NAME type of column GOODS.MENUNAME,
  PRICE MONEY,
  BCCOUNTS COUNTS,
  REMAINS COUNTS)
AS
  declare GS_CLASS INTEGER;
  declare R_SHOUSE REFERENCE;
begin
  if (not exists(select first 1 ID from TMP_GOODS_FOR_CASH))
    then execute procedure DL_GOODS_FILL_CASH(:CASHREGISTER);

  --
  select O_DT_REFERENCE
  from DL_CASHREGISTER_GETMACRO(:CASHREGISTER, 'Разное\Расчет остатков по складу')
  into :R_SHOUSE;

  SEARCHSTR = Upper(:SEARCHSTR);
  for select GS.ID, 1, GS.CLASS_ID, GS.ABBR, GS.NAME, T.PRICE, GS.BARCODECOUNTS
      from GOODS GS
        join TMP_GOODS_FOR_CASH T on GS.ID = T.ID
        join BARCODES BC on GS.ID = BC.PARENT_ID
      where GS.STATUS > 0 and BIN_AND(GS.FLAGS, 32) = 0
            and BC.NAME = :SEARCHSTR
     -- order by NAME
      into :ID, :FLAGS, :GS_CLASS, :ABBR, :NAME, :PRICE, :BCCOUNTS
  do begin
    REMAINS = 0;
    if ((IS_REMAINS_ONLINE > 0) and (GS_CLASS = 3000 /* PRODUCE */)) then begin
      execute procedure REMAINS_ONLINE (:ID, :R_SHOUSE)
      returning_values :REMAINS;
    end
    suspend;
  end
end


т.е. отличие в 1 4 строках заголовка
...
Рейтинг: 0 / 0
17.03.2021, 12:39
    #40054523
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разница в скорости выпрлнения SP и execute block
hvlad
Версия и архитектура FB ?

Alex Truhin
Версия 2.5
Обычно в таких случаях я прекращаю задавать вопросы
...
Рейтинг: 0 / 0
17.03.2021, 12:40
    #40054525
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разница в скорости выпрлнения SP и execute block
Alex Truhin,

Код: sql
1.
2.
3.
4.
5.
create or alter procedure DL_GOODS_GETONBARCODE (
  SEARCHSTR type of column CL_DIRECTORY.NAME,
...
execute block  (
  SEARCHSTR varchar(300) = :SEARCHSTR,

Это может быть важным отличием
...
Рейтинг: 0 / 0
17.03.2021, 12:42
    #40054528
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разница в скорости выпрлнения SP и execute block
типы BARCODES.NAME и CL_DIRECTORY.NAME не разные часом?
...
Рейтинг: 0 / 0
17.03.2021, 12:54
    #40054540
Alex Truhin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разница в скорости выпрлнения SP и execute block
Сделал одинаково, ни чего не изменилось
SEARCHSTR varchar(300),
NAME varchar(300),

SP/
Вызываю
select ID, FLAGS, ABBR, NAME, PRICE, BCCOUNTS, REMAINS from DL_GOODS_GETONBARCODE('15912621591262', 1591262, 0)

План
PLAN (TMP_GOODS_FOR_CASH NATURAL)(DL_CASHREGISTER_GETMACRO NATURAL)JOIN (T NATURAL, GS OB0 INDEX (PK_GOODS), GS OB1 INDEX (PK_DIRECTORY), GS OB2 S_OBJECTS INDEX (PK_S_OBJECTS), BC OB2 S_OBJECTS INDEX (FK_S_OBJECTS_PARENT_ID), BC OB0 INDEX (PK_BARCODES), BC OB1 INDEX (PK_DIRECTORY))
------ Информация о производительности ------
Время подготовки запроса = 15ms
Время выполнения запроса = 594ms

EB
План
PLAN (TMP_GOODS_FOR_CASH NATURAL)
PLAN JOIN (CASHREGISTER OB2 S_OBJECTS INDEX (PK_S_OBJECTS), CASHREGISTER OB0 INDEX (PK_CASHREGISTER), CASHREGISTER OB1 INDEX (PK_DIRECTORY))(MACRO_GET_DATA NATURAL)
PLAN JOIN (BC OB1 INDEX (CL_DIRECTORY_NAME), BC OB0 INDEX (PK_BARCODES), BC OB2 S_OBJECTS INDEX (PK_S_OBJECTS), T INDEX (PK_TMP_GOODS_FOR_CASH), GS OB0 INDEX (PK_GOODS), GS OB1 INDEX (PK_DIRECTORY), GS OB2 S_OBJECTS INDEX (PK_S_OBJECTS))

------ Информация о производительности ------
Время подготовки запроса = 16ms
Время выполнения запроса = 16ms
...
Рейтинг: 0 / 0
17.03.2021, 13:05
    #40054545
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разница в скорости выпрлнения SP и execute block
ты понимаешь, что varchar-параметры в процедуре имеют чарсет базы, а в EXECUTE BLOCKе - чарсет коннекта? Так что нифига там не "одинаково".
...
Рейтинг: 0 / 0
17.03.2021, 13:11
    #40054547
Alex Truhin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разница в скорости выпрлнения SP и execute block
dimitr
ты понимаешь, что varchar-параметры в процедуре имеют чарсет базы, а в EXECUTE BLOCKе - чарсет коннекта? Так что нифига там не "одинаково".

Нет это не знал. Интересная информация.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Разница в скорости выпрлнения SP и execute block / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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