Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Оптимизация аудита в IBExpert / 12 сообщений из 12, страница 1 из 1
17.10.2012, 05:25
    #38001580
AdmNataly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация аудита в IBExpert
Здравствуйте. Нужна помощь в оптимизации кода. База данных очень большая. Данная функция выполняется около двух минут.
Функция, которая непосредственно отвечает за формирование аудита:
Код: 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
17.10.2012, 08:43
    #38001660
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация аудита в IBExpert
AdmNatalyДанная функция
DDL таблиц имеется или ждем телепатов??
...
Рейтинг: 0 / 0
17.10.2012, 09:45
    #38001736
AdmNataly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация аудита в IBExpert
Таблица 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
17.10.2012, 11:24
    #38001947
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация аудита в IBExpert
Утомился воспроизводить. Хотя-бы процедуру-то в исходном виде стоит приводить, а не только блок между 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
18.10.2012, 04:36
    #38003507
AdmNataly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация аудита в IBExpert
wadman,
Блок такой же
...
Рейтинг: 0 / 0
18.10.2012, 04:42
    #38003508
AdmNataly
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация аудита в IBExpert
Недостающие таблицы
Таблица 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
18.10.2012, 09:00
    #38003586
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация аудита в IBExpert
AdmNatalyБлок такой же
Тогда я уже выделил жирным, где не хватает оптимизации (индексов).
...
Рейтинг: 0 / 0
18.10.2012, 11:50
    #38003898
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация аудита в IBExpert
wadmanТогда я уже выделил жирным, где не хватает оптимизации (индексов).Вы, Шариков, чепуху говорите (ц)
Во-первых, при соединении 2 таблиц одна из них вполне может перебираться натуралом, если нет дополнительных ограничений на неё, и оптимизировать здесь нечего.
Во-вторых, там где MERGE, в некоторых ситуациях может быть быстрее сортировать два потока, полученных натуралом, чем обходить их по индексу.

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

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

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

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


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