powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Оптимизация аудита в IBExpert
12 сообщений из 12, страница 1 из 1
Оптимизация аудита в IBExpert
    #38001580
AdmNataly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Нужна помощь в оптимизации кода. База данных очень большая. Данная функция выполняется около двух минут.
Функция, которая непосредственно отвечает за формирование аудита:
Код: 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.
execute block (t1 timestamp=:t1, t2 timestamp=:t2)
returns (key_value varchar(255), namef varchar(50), classif_name varchar(512), nai varchar(120), date_time timestamp)
as
declare variable ids blob sub_type 1;
declare variable v varchar(255);
begin
ids=';';
for
    select key_value
    from V_LOG_TABLES
    where (table_name='ZAYAVL'   AND  operation='D')
  AND table_name='ZAYAVL'  and (date_time between :t1 and :t2) AND  operation='I'
    into :v
do ids=ids||v||';';
for
select Key_value, (select result from get_fio_from_tab('persons',pe.ke)) NAMEF , CLASSIF_NAME , NAI ,  date_time
from V_LOG_TABLES  vl
join zayavl za on za.ke=vl.key_value
join persons pe on  pe.login=vl.user_name
join usluga mu on mu.ke=za.usluga
join face fa on fa.ke=za.face
where position(';'||key_value||';' in :ids)=0
into :key_value,:namef,:classif_name,:nai,:date_time
do
suspend;
end;



Формирование представления V_LOG_TABLES
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE OR ALTER VIEWV_LOG_TABLES(
    ID_OPERATION,
    KEY_VALUE,
    TABLE_NAME,
    OPERATION,
    DATE_TIME,
    USER_NAME,
    OLD_VALUE,
    NEW_VALUE,
    FIELD_NAME)
AS
select lt.id,lk.key_value,lt.table_name,lt.operation,lt.date_time,lt.user_name,lb.old_blob_value old_value,lb.new_blob_value new_value, lb.field_name
from ibe$log_tables lt
join IBE$LOG_BLOB_FIELDS  lb on lb.log_tables_id=lt.id
join ibe$log_keys lk on lk.log_tables_id=lt.id
where (old_blob_value is not null and new_blob_value is not null)
union
select lt.id,lk.key_value,lt.table_name,lt.operation,lt.date_time,lt.user_name,lf.old_value,lf.new_value, lf.field_name
from ibe$log_tables lt
join IBE$LOG_FIELDS lf on   lf.log_tables_id=lt.id
join ibe$log_keys lk on lk.log_tables_id=lt.id
;



Процедура get_fio_from_tab:
Код: 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.
begin
  RESULT='';
  short=0;
  IF (KE IS NOT NULL) THEN
  BEGIN
      S = 'SELECT COUNT(*) FROM '||TABLE_NAME||' WHERE KE='||:KE;
      EXECUTE STATEMENT S INTO :N;
      IF (N > 0) THEN
      BEGIN
          S = 'SELECT NAMEF,NAMEI,NAMEO FROM '||TABLE_NAME||' WHERE KE='||:KE;
          EXECUTE STATEMENT S INTO :TEMP1,:TEMP2,:TEMP3;
          if (temp1 is not null) then
          begin
            result=temp1;
            if (temp2 is not null) then
            begin
              if (short=0) then
                result=result||' '||temp2;
              else
                result= upper(substring(temp2 from 1 for 1))||'.';
            end
            if (temp3 is not null) then
            begin
              if (short=0) then
                result=result||' '||temp3;
              else
                result= upper(substring(temp3 from 1 for 1))||'.';
            end
          end
       end
   end
  suspend;
end


Модератор: Пользуйтесь тегами
...
Рейтинг: 0 / 0
Оптимизация аудита в IBExpert
    #38001660
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AdmNatalyДанная функция
DDL таблиц имеется или ждем телепатов??
...
Рейтинг: 0 / 0
Оптимизация аудита в IBExpert
    #38001736
AdmNataly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблица zayavl
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE TABLE ZAYAVL (
    KE        INTEGER NOT NULL,
    NUM       VARCHAR(20),
    DOC_DATE  TIMESTAMP,
    ANNOTAT   VARCHAR(1024),
    MEMO      VARCHAR(1024),
    FACE      INTEGER,
    USLUGA    INTEGER,
    PARENT    INTEGER,
    DELEGATE  VARCHAR(1024)
);
ALTER TABLE ZAYAVL ADD CONSTRAINT PK_ZAYAVL PRIMARY KEY (KE);
ALTER TABLE ZAYAVL ADD CONSTRAINT FK_ZAYA_REFERENCE_FACE FOREIGN KEY (FACE) REFERENCES FACE (KE);
ALTER TABLE ZAYAVL ADD CONSTRAINT FK_ZAYA_REFERENCE_USLU FOREIGN KEY (USLUGA) REFERENCES USLUGA (KE);
ALTER TABLE ZAYAVL ADD CONSTRAINT FK_ZAYA_REFERENCE_ZAYA2 FOREIGN KEY (PARENT) REFERENCES ZAYAVL (KE);



Таблица persons
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE PERSONS (
    KE           INTEGER NOT NULL,
    NAMEF        VARCHAR(30),
    NAMEI        VARCHAR(30),
    NAMEO        VARCHAR(30),
    PERSON_ROLE  INTEGER,
    ISACTIVE     BOOLEAN_DOMAIN /* BOOLEAN_DOMAIN = SMALLINT check (value is null or (value between 0 and 1)) */,
    STATUS       VARCHAR(256),
    LOGIN        CHAR(15)
);
ALTER TABLE PERSONS ADD CONSTRAINT CKC_ISACTIVE_PERSONS check (ISACTIVE is null or (ISACTIVE between 0 and 1));
ALTER TABLE PERSONS ADD CONSTRAINT PK_PERSONS PRIMARY KEY (KE);
ALTER TABLE PERSONS ADD CONSTRAINT FK_PERSONS_REFERENCE_ROLES FOREIGN KEY (PERSON_ROLE) REFERENCES ROLES (KE);



Таблица usluga
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE TABLE USLUGA (
    KE             INTEGER NOT NULL,
    NUM            INTEGER,
    CLASSIF_NAME   VARCHAR(512),
    REGLAMENT      BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    SHABLON        BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    POLUCHATEL     VARCHAR(512),
    PRICE          VARCHAR(512),
    PERIOD         INTEGER,
    RESULT         VARCHAR(512),
    NPA            VARCHAR(4096),
    DELETED        INTEGER,
    DUE            VARCHAR(64),
    DOGROUP_INDEX  VARCHAR(20),
    DEPARTMENT     INTEGER,
    DESCRIPTION    VARCHAR(1024),
    CLASSIF        VARCHAR(80)
);
ALTER TABLE USLUGA ADD CONSTRAINT PK_USLUGA PRIMARY KEY (KE);
ALTER TABLE USLUGA ADD CONSTRAINT FK_USLU_REFERENCE_DEPA FOREIGN KEY (DEPARTMENT) REFERENCES DEPARTMENT (KE);



Таблица face
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE TABLE FACE (
    KE           INTEGER NOT NULL,
    NAI          VARCHAR(120),
    ADDRESS      VARCHAR(120),
    PHONE        VARCHAR(30),
    SEX          INTEGER,
    DOCUM_SERIA  VARCHAR(10),
    DOCUM_NUM    VARCHAR(64),
    GIVEN        VARCHAR(120),
    WHEN_GIVEN   DATE,
    E_MAIL       VARCHAR(50),
    MEMO         VARCHAR(500),
    INN          VARCHAR(12),
    OKPO         VARCHAR(30),
    DELETED      NUMERIC(1,0),
    FACE_TYPE    INTEGER,
    DOCUM        INTEGER,
    BORN         DATE,
    BORNIN       VARCHAR(100)
);
ALTER TABLE FACE ADD CONSTRAINT PK_FACE PRIMARY KEY (KE);
ALTER TABLE FACE ADD CONSTRAINT FK_FACE_1 FOREIGN KEY (DOCUM) REFERENCES B_DOCUMS (KE);
...
Рейтинг: 0 / 0
Оптимизация аудита в IBExpert
    #38001947
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Утомился воспроизводить. Хотя-бы процедуру-то в исходном виде стоит приводить, а не только блок между begin-end;

Код: 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.
SET TERM ^ ;

create or alter procedure GET_FIO_FROM_TAB (
    TABLE_NAME varchar(64),
    KE bigint)
returns (
    RESULT varchar(128))
as
declare variable SHORT integer;
declare variable S varchar(1024);
declare variable N integer;
declare variable TEMP1 varchar(128);
declare variable TEMP2 varchar(128);
declare variable TEMP3 varchar(128);
begin
RESULT='';
short=0;
IF (KE IS NOT NULL) THEN
BEGIN
S = 'SELECT COUNT(*) FROM '||TABLE_NAME||' WHERE KE='||:KE;
EXECUTE STATEMENT S INTO :N;
IF (N > 0) THEN
BEGIN
S = 'SELECT NAMEF,NAMEI,NAMEO FROM '||TABLE_NAME||' WHERE KE='||:KE;
EXECUTE STATEMENT S INTO :TEMP1,:TEMP2,:TEMP3;
if (temp1 is not null) then
begin
result=temp1;
if (temp2 is not null) then
begin
if (short=0) then
result=result||' '||temp2;
else
result= upper(substring(temp2 from 1 for 1))||'.';
end
if (temp3 is not null) then
begin
if (short=0) then
result=result||' '||temp3;
else
result= upper(substring(temp3 from 1 for 1))||'.';
end
end
end
end
suspend;
end
^

SET TERM ; ^



Далее, несколько таблиц отсутствует, хотя фк на них есть...

И вот такой план у блока:
PLAN JOIN (V_LOG_TABLES LT NATURAL , V_LOG_TABLES LB INDEX (IBE$LOG_BLOB_FIELDS_IDX1), V_LOG_TABLES LK INDEX (IBE$LOG_KEYS_IDX1))
PLAN JOIN (V_LOG_TABLES LT NATURAL , V_LOG_TABLES LF INDEX (IBE$LOG_FIELDS_IDX1), V_LOG_TABLES LK INDEX (IBE$LOG_KEYS_IDX1))
PLAN (GET_FIO_FROM_TAB NATURAL)
PLAN MERGE (SORT (PE NATURAL ), SORT (JOIN (JOIN (JOIN (VL LT NATURAL , VL LB INDEX (IBE$LOG_BLOB_FIELDS_IDX1), VL LK INDEX (IBE$LOG_KEYS_IDX1))
PLAN JOIN (VL LT NATURAL , VL LF INDEX (IBE$LOG_FIELDS_IDX1), VL LK INDEX (IBE$LOG_KEYS_IDX1)), ZA INDEX (PK_ZAYAVL), MU INDEX (PK_USLUGA)), FA INDEX (PK_FACE))))


Похож на тот, что и у вас в ibexpert?
...
Рейтинг: 0 / 0
Оптимизация аудита в IBExpert
    #38003507
AdmNataly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadman,
Блок такой же
...
Рейтинг: 0 / 0
Оптимизация аудита в IBExpert
    #38003508
AdmNataly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Недостающие таблицы
Таблица log_tables
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE IBE$LOG_TABLES (
    ID          NUMERIC(18,0) NOT NULL,
    TABLE_NAME  VARCHAR(67) NOT NULL,
    OPERATION   VARCHAR(1) NOT NULL,
    DATE_TIME   TIMESTAMP NOT NULL,
    USER_NAME   VARCHAR(67) NOT NULL
);
ALTER TABLE IBE$LOG_TABLES ADD PRIMARY KEY (ID);


Таблица log_blob_fields
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE IBE$LOG_BLOB_FIELDS (
    LOG_TABLES_ID   NUMERIC(18,0) NOT NULL,
    FIELD_NAME      VARCHAR(67) NOT NULL,
    OLD_CHAR_VALUE  VARCHAR(500),
    NEW_CHAR_VALUE  VARCHAR(500),
    OLD_BLOB_VALUE  VARCHAR(1000),
    NEW_BLOB_VALUE  VARCHAR(1000)
);
CREATE INDEX IBE$LOG_BLOB_FIELDS_IDX1 ON IBE$LOG_BLOB_FIELDS (LOG_TABLES_ID);


Таблица log_keys
Код: plsql
1.
2.
3.
4.
5.
6.
CREATE TABLE IBE$LOG_KEYS (
    LOG_TABLES_ID  NUMERIC(18,0) NOT NULL,
    KEY_FIELD      VARCHAR(67) NOT NULL,
    KEY_VALUE      VARCHAR(255)
);
CREATE INDEX IBE$LOG_KEYS_IDX1 ON IBE$LOG_KEYS (LOG_TABLES_ID);


Таблица log_fields
Код: plsql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE IBE$LOG_FIELDS (
    LOG_TABLES_ID  NUMERIC(18,0) NOT NULL,
    FIELD_NAME     VARCHAR(67) NOT NULL,
    OLD_VALUE      VARCHAR(255),
    NEW_VALUE      VARCHAR(255)
);
CREATE INDEX IBE$LOG_FIELDS_IDX1 ON IBE$LOG_FIELDS (LOG_TABLES_ID);
...
Рейтинг: 0 / 0
Оптимизация аудита в IBExpert
    #38003586
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AdmNatalyБлок такой же
Тогда я уже выделил жирным, где не хватает оптимизации (индексов).
...
Рейтинг: 0 / 0
Оптимизация аудита в IBExpert
    #38003898
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanТогда я уже выделил жирным, где не хватает оптимизации (индексов).Вы, Шариков, чепуху говорите (ц)
Во-первых, при соединении 2 таблиц одна из них вполне может перебираться натуралом, если нет дополнительных ограничений на неё, и оптимизировать здесь нечего.
Во-вторых, там где MERGE, в некоторых ситуациях может быть быстрее сортировать два потока, полученных натуралом, чем обходить их по индексу.

ЗЫ: Запросы автора не смотрел, нет времени и желания.
...
Рейтинг: 0 / 0
Оптимизация аудита в IBExpert
    #38004584
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryЗапросы автора не смотрел, нет времени и желания.
Тут полный тест только поможет на месте, потому я лишь подкинул идею.
...
Рейтинг: 0 / 0
Оптимизация аудита в IBExpert
    #38004682
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Идея фуфло, лучше б не подкидывал.
...
Рейтинг: 0 / 0
Оптимизация аудита в IBExpert
    #38004838
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery,

лучше, чем неаргументированное недовольство.
...
Рейтинг: 0 / 0
Оптимизация аудита в IBExpert
    #38004862
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Иногда лучше молчать, чем говорить. Мой ответ аргументирован.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Оптимизация аудита в IBExpert
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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