Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Informix [игнор отключен] [закрыт для гостей] / оптимизация процедуры / 6 сообщений из 6, страница 1 из 1
03.12.2007, 16:11
    #34982776
alexey_mas1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация процедуры
Добрый день!

Подскажите где у меня узкой место в запросе (запрос выполняется в процедуре)
запрос в процедуре :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT   sum(incom) INTO vAmount  
                               FROM saldo s1,account a    
                               WHERE s1.idacc=a.idacc AND s1.currency='980' and 
                               ((a.acc[ 1 , 4 ] in ('2512','2513','2520','2523','2526','2530','2531','2541','2542','2544','2545','2552', 
                               '2554','2555','2560','2561','2562','2565','2600','2601','2602','2603','2604','2605','2606', 
                               '2655','2553','2650') or a.acc[ 1 , 3 ] in ('264','257')  )                                     
                               and a.currency =vCurrency                                                               
                               and s1.dtend = (SELECT MIN(dtend) FROM saldo                                                                  
                               WHERE idacc = s1.idacc AND currency = s1.currency AND dtend >=vDTcalc3 )                         
                               and EXISTS(SELECT * FROM accdate WHERE idacc=a.idacc and status<>'C' and date(accdt)<vDTcalc3)             
                               and NOT EXISTS(SELECT * FROM accdate WHERE idacc=a.idacc and status='C' and date(accdt)<vDTcalc3) )         
                               and s1.incom> 0  and a.idsubunit in ( 0 , 1 ,- 1 );

Кусок плана запроса

Код: plaintext
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.
51.
52.
53.
54.
----------
Procedure: informix.mas_finrep_subunit
select sum(x0.incom ) from "informix".saldo x0 ,"informix".account x1 ,"informix".accdate x2 where ((((((x0.idacc = x1.idacc ) AND (x0.currency =  980  ) ) AND (((((x1.acc [ 1 , 4 ] IN ('2512' ,'2513' ,'2520' ,'2523' ,'2526' ,'2530' ,'2531' ,'2541' ,'2542' ,'2544' ,'2545' ,'2552' ,'2554' ,'2555' ,'2560' ,'2561' ,'2562' ,'2565' ,'2600' ,'2601' ,'2602' ,'2603' ,'2604' ,'2605' ,'2606' ,'2655' ,'2553' ,'2650' )) OR (x1.acc [ 1 , 3 ] IN ('264' ,'257' )) ) AND (x1.currency NOT IN ( 980  , 840  , 978  , 643  , 826  , 756  )) ) AND (x0.dtend = (select min(x3.dtend ) from "informix".saldo x3 where (((x3.idacc = x0.idacc ) AND (x3.currency =  980  ) ) AND (x3.dtend >= ? ) ) ) ) ) AND NOT EXISTS (select x4.idacc ,x4.status ,x4.iduser ,x4.accdt from "informix".accdate x4 where (((x4.idacc = x1.idacc ) AND (x4.status = 'C' ) ) AND (DATE (x4.accdt ) < ? ) ) ) ) ) AND (x0.incom > '0.00' ) ) AND (x1.idsubunit = ? ) ) AND (((x2.idacc = x1.idacc ) AND (x2.status != 'C' ) ) AND (DATE (x2.accdt ) < ? ) ) )

QUERY:
------


Estimated Cost:  24617 
Estimated # of Rows Returned:  1 

   1 ) informix.a: SEQUENTIAL SCAN

        Filters: ((((informix.a.acc[ 1 , 4 ] IN ('2512' , '2513' , '2520' , '2523' , '2526' , '2530' , '2531' , '2541' , '2542' , '2544' , '2545' , '2552' , '2554' , '2555' , '2560' , '2561' , '2562' , '2565' , '2600' , '2601' , '2602' , '2603' , '2604' , '2605' , '2606' , '2655' , '2553' , '2650' )OR informix.a.acc[ 1 , 3 ] IN ('264' , '257' )) AND informix.a.idsubunit = '<VAR>' ) AND informix.a.currency NOT IN ( 980  ,  840  ,  978  ,  643  ,  826  ,  756  )) AND NOT EXISTS <subquery> ) 

   2 ) informix.s1: INDEX PATH

        Filters: ((informix.s1.incom >  0 . 00  AND informix.s1.currency =  980  ) AND informix.s1.dtend = <subquery> ) 

    ( 1 ) Index Keys: idacc 
        Lower Index Filter: informix.s1.idacc = informix.a.idacc 
NESTED LOOP JOIN

   3 ) informix.accdate: INDEX PATH  (First Row)

        Filters: (DATE (informix.accdate.accdt ) < '<VAR>' AND informix.accdate.status != 'C' ) 

    ( 1 ) Index Keys: idacc   (Serial, fragments: ALL)
        Lower Index Filter: informix.accdate.idacc = informix.a.idacc 
NESTED LOOP JOIN  (Semi Join)

    Subquery:
    ---------
    Estimated Cost:  4 
    Estimated # of Rows Returned:  1 

       1 ) informix.saldo: INDEX PATH

        ( 1 ) Index Keys: idacc currency dtend   (Key-Only)  (Aggregate)
            Lower Index Filter: ((informix.saldo.idacc = informix.s1.idacc AND informix.saldo.dtend >= '<VAR>' ) AND informix.saldo.currency =  980  ) 


    Subquery:
    ---------
    Estimated Cost:  1 
    Estimated # of Rows Returned:  1 

       1 ) informix.accdate: INDEX PATH

            Filters: DATE (informix.accdate.accdt ) < '<VAR>' 

        ( 1 ) Index Keys: idacc status 
            Lower Index Filter: (informix.accdate.idacc = informix.a.idacc AND informix.accdate.status = 'C' ) 


Запрос выполняется достаточно медленно.
имеется 3 таблицы saldo (остатки),account(счета),accdate(инфор-я о закрытии - открытии счетов)

Как смотреть план запроса ? на что обратить внимание? Заранее благодарен.
...
Рейтинг: 0 / 0
03.12.2007, 16:53
    #34982944
onstat-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация процедуры
alexey_mas1Добрый день!

Подскажите где у меня узкой место в запросе (запрос выполняется в процедуре)
запрос в процедуре :




IMHO смотреть здесь:

Код: plaintext
1.
2.
3.
4.
5.
 1 ) informix.a: SEQUENTIAL SCAN

        Filters: ((((informix.a.acc[ 1 , 4 ] IN ('2512' , '2513' , '2520' , '2523' , '2526' , '2530' , '2531' , '2541' , '2542' , '2544' , '2545' , '2552' , '2554' , '2555' , '2560' , '2561' , '2562' , '2565' , '2600' , '2601' , '2602' , '2603' , '2604' , '2605' , '2606' , '2655' , '2553' , '2650' )OR informix.a.acc[ 1 , 3 ] IN ('264' , '257' )) AND informix.a.idsubunit = '<VAR>' ) AND informix.a.currency NOT IN ( 980  ,  840  ,  978  ,  643  ,  826  ,  756  )) AND NOT EXISTS <subquery> ) 

   2 ) informix.s1: INDEX PATH

Особенно на NOT EXISTS

А вообще то телепаты переквалифицировались на другие СУБД ( Informix слишком предсказуемый). :)


1. Нужно смотреть на Filters:
Если в условиии которое туда попадает есть индексированные поля, нужно смотреть на статистику или директивы оптимизатора.
Какие индексы уже есть ?
как давно собирали статистику?

2. Нужно смотреть на обьем таблиц.
сколько записей?

3.Нужно смотреть на индексированные поля, при необходимости оценив все за и против строить новые индексы.

4. Нужно смотреть на параметры
OPTCOMPIND
DIRECTIVES
PDQPRIORITY и все что с ним связано.
.........


И еще моного на что.

p.s. Индексный поиск не всегда лучше полного сканирования.
...
Рейтинг: 0 / 0
03.12.2007, 17:20
    #34983028
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация процедуры
запрос надо переписывать
Код: plaintext
1.
2.
       and EXISTS(SELECT * FROM accdate WHERE idacc=a.idacc and status<>'C' and date(accdt)<vDTcalc3)             
and NOT EXISTS(SELECT * FROM accdate WHERE idacc=a.idacc and status='C' and date(accdt)<vDTcalc3)      
...
Рейтинг: 0 / 0
03.12.2007, 17:49
    #34983143
alexey_mas1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация процедуры
ок спасибо.
попробую выбирать счета в темповую таблицу и в запросе уже работать с ней.
...
Рейтинг: 0 / 0
05.12.2007, 19:05
    #34989431
Daugava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация процедуры
Как человек, видимо знакомый со структурой данной базы, могу предположить что:
- использовать accdate ни к чему вообще. Если счет закрыт или не был открыт на интерсную Вам дату, то записей в saldo не будет и суммы тоже;
- мучить таблицу saldo на предмет MIN(dtend) по каждому счету тоже не зачем. Достаточно это сделать один раз, причем ИМХО, в этой базе более 10 лет назад существовала табличка типа календаря с выходными и праздничными днями, сомневаюсь, чтобы она исчезла.
...
Рейтинг: 0 / 0
05.12.2007, 20:03
    #34989525
cpr
cpr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация процедуры
крутой запрос - наверное мышкой рисовали ;-)
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / оптимизация процедуры / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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