Имеются две идентичные процедуры(текст приведен ниже) ниже. Непонятно почему в 
первой стали наблюдаться тормоза(поэтому быстро возникла вторая). Отличаются 
только текстом одного запроса(который почему то стал тормозить(не знаю может 
удалил какой то индекс из таблицы KLIENT_ACCOUNT_PROVODKI )). 

1)  SELECT MAX(DATA) FROM KLIENT_ACCOUNT_PROVODKI WHERE (SUMMA>0) AND 
(ID_ACCOUNT = :VAR_ID_ACC) into :DATE_LAST_PRIXOD;

Statement:
--------------------------------------------------------------------------------
SELECT MAX(DATA) FROM KLIENT_ACCOUNT_PROVODKI WHERE (SUMMA>0) AND (ID_ACCOUNT = 
:VAR_ID_ACC) into :DATE_LAST_PRIXOD;
Plan:
--------------------------------------------------------------------------------
(KLIENT_ACCOUNT_PROVODKI ORDER KLIENT_ACCOUNT_PROVODKI_IDX1 INDEX 
(FK_KLIENT_ACCOUNT_PROVODKI_1))

Query
------------------------------------------------
Plan
------------------------------------------------
Query Time
------------------------------------------------
Prepare       : 0,00 ms
Execute       : 21 403,00 ms
Avg fetch time: 856,12 ms


2)     SELECT ID_ACCOUNT, MAX(DATA) FROM KLIENT_ACCOUNT_PROVODKI WHERE 
(SUMMA>0) AND (ID_ACCOUNT = :VAR_ID_ACC)
    group by ID_ACCOUNT
    into :VAR_ID_ACC, :DATE_LAST_PRIXOD;

Statement:
--------------------------------------------------------------------------------
SELECT ID_ACCOUNT, MAX(DATA) FROM KLIENT_ACCOUNT_PROVODKI WHERE (SUMMA>0) AND 
(ID_ACCOUNT = :VAR_ID_ACC)
group by ID_ACCOUNT
into :VAR_ID_ACC, :DATE_LAST_PRIXOD;
Plan:
--------------------------------------------------------------------------------
(KLIENT_ACCOUNT_PROVODKI ORDER UNQ1_KLIENT_ACCOUNT_PROVODKI INDEX 
(FK_KLIENT_ACCOUNT_PROVODKI_1))

Query
------------------------------------------------
Plan
------------------------------------------------
Query Time
------------------------------------------------
Prepare       : 16,00 ms
Execute       : 78,00 ms
Avg fetch time: 3,00 ms
Memory

Вторая выполняется в гораздо быстрее первой Мистика ну в раз 10 точно.
На текущий момент на таблицу KLIENT_ACCOUNT_PROVODKI имеются следующие 
индексы(добавлял удалял) 

ALTER TABLE KLIENT_ACCOUNT_PROVODKI ADD CONSTRAINT PK_KLIENT_ACCOUNT_PROVODKI 
PRIMARY KEY (ID);

ALTER TABLE KLIENT_ACCOUNT_PROVODKI ADD CONSTRAINT FK_KLIENT_ACCOUNT_PROVODKI_1 
FOREIGN KEY (ID_ACCOUNT) REFERENCES KLIENT_ACCOUNT (ID) ON DELETE CASCADE ON 
UPDATE CASCADE;

CREATE DESCENDING INDEX KLIENT_ACCOUNT_PROVODKI_IDX1 ON KLIENT_ACCOUNT_PROVODKI 
(DATA, ID_ACCOUNT);

CREATE INDEX KLIENT_ACCOUNT_PROVODKI_IDX2 ON KLIENT_ACCOUNT_PROVODKI 
(KONTRAGENT_INN);

CREATE INDEX KLIENT_ACCOUNT_PROVODKI_IDX3 ON KLIENT_ACCOUNT_PROVODKI (DATA);

CREATE DESCENDING INDEX KLIENT_ACCOUNT_PROVODKI_IDX_DAT ON 
KLIENT_ACCOUNT_PROVODKI (DATA);






1) create procedure ACC_BLOC_AREST_SEL
returns (
    DATA_ACOUNT type of column KLIENT_ACCOUNT.DATA_ACOUNT,
    ACCOUNT type of column KLIENT_ACCOUNT.ACCOUNT,
    PRIZNAK type of column KLIENT_ACCOUNT.PRIZNAK,
    NO_ANKET type of column KLIENT.NO_ANKET,
    NAME_SHORT type of column KLIENT.NAME_SHORT,
    MENADGER type of column KLIENT.MENADGER,
    PERSON_OPEN_ACCOUNT type of column KLIENT.PERSON_OPEN_ACCOUNT,
    FIO_MENEDGER type of column PERSONAL.F,
    FIO_OPEN_ACCOUNT type of column PERSONAL.F,
    DATE_LAST_PRIXOD type of T_DATE,
    OSTATOK type of T_SUMMA)
as
declare variable VAR_ID_ACC type of column KLIENT_ACCOUNT.ID;
BEGIN
  FOR
  SELECT 
    KLIENT_ACCOUNT.DATA_ACOUNT,
    KLIENT_ACCOUNT.ACCOUNT,
    KLIENT_ACCOUNT.PRIZNAK,
    KLIENT.NO_ANKET,
    KLIENT.NAME_SHORT,
    KLIENT.MENADGER,
    KLIENT.PERSON_OPEN_ACCOUNT,
    KLIENT_ACCOUNT.ID
FROM KLIENT
   INNER JOIN KLIENT_ACCOUNT ON (KLIENT.ID = KLIENT_ACCOUNT.ID_KLIENT)
WHERE 
   (
      (KLIENT.no_anket > 0) AND (KLIENT_ACCOUNT.account STARTING WITH '40')
    AND (KLIENT_ACCOUNT.PRIZNAK <> 'О') AND (KLIENT_ACCOUNT.PRIZNAK <> 'З')
   )
INTO
    :DATA_ACOUNT, :ACCOUNT, :PRIZNAK, :NO_ANKET, :NAME_SHORT, :MENADGER,
    :PERSON_OPEN_ACCOUNT, :VAR_ID_ACC
  DO
  BEGIN
    SELECT F FROM PERSONAL WHERE PERSONAL.id = :menadger INTO :FIO_MENEDGER;
    SELECT F FROM PERSONAL WHERE PERSONAL.id = :PERSON_OPEN_ACCOUNT INTO 
:FIO_OPEN_ACCOUNT;
    SELECT SUM(summa) FROM KLIENT_ACCOUNT_PROVODKI WHERE (ID_ACCOUNT = 
:VAR_ID_ACC) into :OSTATOK;
    SELECT MAX(DATA) FROM KLIENT_ACCOUNT_PROVODKI WHERE (SUMMA>0) AND 
(ID_ACCOUNT = :VAR_ID_ACC) into :DATE_LAST_PRIXOD;
    if( OSTATOK is null) then OSTATOK = 0;
    if( DATE_LAST_PRIXOD is null) then DATE_LAST_PRIXOD = '04.08.1994';
    SUSPEND;
  END
END


Statement:
--------------------------------------------------------------------------------
SELECT MAX(DATA) FROM KLIENT_ACCOUNT_PROVODKI WHERE (SUMMA>0) AND (ID_ACCOUNT = 
:VAR_ID_ACC) into :DATE_LAST_PRIXOD;
Plan:
--------------------------------------------------------------------------------
(KLIENT_ACCOUNT_PROVODKI ORDER KLIENT_ACCOUNT_PROVODKI_IDX1 INDEX 
(FK_KLIENT_ACCOUNT_PROVODKI_1))

Query
------------------------------------------------
Plan
------------------------------------------------
Query Time
------------------------------------------------
Prepare       : 0,00 ms
Execute       : 21 403,00 ms
Avg fetch time: 856,12 ms

Memory
------------------------------------------------
Current: 137 955 384
Max    : 199 269 040
Buffers: 8 192

Operations
------------------------------------------------
Read   : 13 571
Writes : 0
Fetches: 667 485


Enchanced Info:
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
|        Table Name        |  Records  |  Indexed  | Non-Indexed | Updates | 
Deletes | Inserts |
|                          |   Total   |   reads   |    reads    |         |    
     |         |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
|                    KLIENT|         0 |       288 |           0 |       0 |    
   0 |       0 |
|            KLIENT_ACCOUNT|         0 |      4846 |           0 |       0 |    
   0 |       0 |
|   KLIENT_ACCOUNT_PROVODKI|         0 |    111363 |           0 |       0 |    
   0 |       0 |
|                  PERSONAL|         0 |       575 |           0 |       0 |    
   0 |       0 |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+




2)  create procedure ACC_BLOC_AREST_SEL
returns (
    DATA_ACOUNT type of column KLIENT_ACCOUNT.DATA_ACOUNT,
    ACCOUNT type of column KLIENT_ACCOUNT.ACCOUNT,
    PRIZNAK type of column KLIENT_ACCOUNT.PRIZNAK,
    NO_ANKET type of column KLIENT.NO_ANKET,
    NAME_SHORT type of column KLIENT.NAME_SHORT,
    MENADGER type of column KLIENT.MENADGER,
    PERSON_OPEN_ACCOUNT type of column KLIENT.PERSON_OPEN_ACCOUNT,
    FIO_MENEDGER type of column PERSONAL.F,
    FIO_OPEN_ACCOUNT type of column PERSONAL.F,
    DATE_LAST_PRIXOD type of T_DATE,
    OSTATOK type of T_SUMMA)
as
declare variable VAR_ID_ACC type of column KLIENT_ACCOUNT.ID;
BEGIN
  FOR
  SELECT 
    KLIENT_ACCOUNT.DATA_ACOUNT,
    KLIENT_ACCOUNT.ACCOUNT,
    KLIENT_ACCOUNT.PRIZNAK,
    KLIENT.NO_ANKET,
    KLIENT.NAME_SHORT,
    KLIENT.MENADGER,
    KLIENT.PERSON_OPEN_ACCOUNT,
    KLIENT_ACCOUNT.ID
FROM KLIENT
   INNER JOIN KLIENT_ACCOUNT ON (KLIENT.ID = KLIENT_ACCOUNT.ID_KLIENT)
WHERE 
   (
      (KLIENT.no_anket > 0) AND (KLIENT_ACCOUNT.account STARTING WITH '40')
    AND (KLIENT_ACCOUNT.PRIZNAK <> 'О') AND (KLIENT_ACCOUNT.PRIZNAK <> 'З')
   )
INTO
    :DATA_ACOUNT, :ACCOUNT, :PRIZNAK, :NO_ANKET, :NAME_SHORT, :MENADGER,
    :PERSON_OPEN_ACCOUNT, :VAR_ID_ACC
  DO
  BEGIN
    SELECT F FROM PERSONAL WHERE PERSONAL.id = :menadger INTO :FIO_MENEDGER;
    SELECT F FROM PERSONAL WHERE PERSONAL.id = :PERSON_OPEN_ACCOUNT INTO 
:FIO_OPEN_ACCOUNT;
    SELECT SUM(summa) FROM KLIENT_ACCOUNT_PROVODKI WHERE (ID_ACCOUNT = 
:VAR_ID_ACC) into :OSTATOK;
    SELECT ID_ACCOUNT, MAX(DATA) FROM KLIENT_ACCOUNT_PROVODKI WHERE (SUMMA>0) 
AND (ID_ACCOUNT = :VAR_ID_ACC)
    group by ID_ACCOUNT
    into :VAR_ID_ACC, :DATE_LAST_PRIXOD;
    if( OSTATOK is null) then OSTATOK = 0;
    if( DATE_LAST_PRIXOD is null) then DATE_LAST_PRIXOD = '04.08.1994';
    SUSPEND;
  END
END

Statement:
--------------------------------------------------------------------------------
SELECT ID_ACCOUNT, MAX(DATA) FROM KLIENT_ACCOUNT_PROVODKI WHERE (SUMMA>0) AND 
(ID_ACCOUNT = :VAR_ID_ACC)
group by ID_ACCOUNT
into :VAR_ID_ACC, :DATE_LAST_PRIXOD;
Plan:
--------------------------------------------------------------------------------
(KLIENT_ACCOUNT_PROVODKI ORDER UNQ1_KLIENT_ACCOUNT_PROVODKI INDEX 
(FK_KLIENT_ACCOUNT_PROVODKI_1))

Query
------------------------------------------------
Plan
------------------------------------------------
Query Time
------------------------------------------------
Prepare       : 16,00 ms
Execute       : 78,00 ms
Avg fetch time: 3,00 ms
Memory
------------------------------------------------
Current: 137 964 352
Max    : 199 269 040
Buffers: 8 192

Operations
------------------------------------------------
Read   : 11 415
Writes : 0
Fetches: 566 616


Enchanced Info:
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
|        Table Name        |  Records  |  Indexed  | Non-Indexed | Updates | 
Deletes | Inserts |
|                          |   Total   |   reads   |    reads    |         |    
     |         |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+
|                    KLIENT|         0 |       288 |           0 |       0 |    
   0 |       0 |
|            KLIENT_ACCOUNT|         0 |      4846 |           0 |       0 |    
   0 |       0 |
|   KLIENT_ACCOUNT_PROVODKI|         0 |    219618 |           0 |       0 |    
   0 |       0 |
|                  PERSONAL|         0 |       575 |           0 |       0 |    
   0 |       0 |
+--------------------------+-----------+-----------+-------------+---------+---------+---------+

Ответить