powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Разница в скорости выпрлнения SP и execute block
10 сообщений из 10, страница 1 из 1
Разница в скорости выпрлнения SP и execute block
    #40054507
Alex Truhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Столкнулся с такой проблемой. Есть небольшая 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
Разница в скорости выпрлнения SP и execute block
    #40054510
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Truhin,

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

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

Версия и архитектура FB ?
...
Рейтинг: 0 / 0
Разница в скорости выпрлнения SP и execute block
    #40054520
Alex Truhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия 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
Разница в скорости выпрлнения SP и execute block
    #40054523
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad
Версия и архитектура FB ?

Alex Truhin
Версия 2.5
Обычно в таких случаях я прекращаю задавать вопросы
...
Рейтинг: 0 / 0
Разница в скорости выпрлнения SP и execute block
    #40054525
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Разница в скорости выпрлнения SP и execute block
    #40054528
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
типы BARCODES.NAME и CL_DIRECTORY.NAME не разные часом?
...
Рейтинг: 0 / 0
Разница в скорости выпрлнения SP и execute block
    #40054540
Alex Truhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал одинаково, ни чего не изменилось
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
Разница в скорости выпрлнения SP и execute block
    #40054545
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты понимаешь, что varchar-параметры в процедуре имеют чарсет базы, а в EXECUTE BLOCKе - чарсет коннекта? Так что нифига там не "одинаково".
...
Рейтинг: 0 / 0
Разница в скорости выпрлнения SP и execute block
    #40054547
Alex Truhin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr
ты понимаешь, что varchar-параметры в процедуре имеют чарсет базы, а в EXECUTE BLOCKе - чарсет коннекта? Так что нифига там не "одинаково".

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


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