Гость
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / Ещё раз о планах выполнения / 11 сообщений из 11, страница 1 из 1
26.04.2012, 16:34
    #37772709
Leonid Vorontsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё раз о планах выполнения
Доброго времени суток!

Нормально ли, что один и тот же запрос выполняется напрямую по одному плану:

Код: 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.
QUERY: (OPTIMIZATION TIMESTAMP: 04-26-2012 15:24:23)
------
insert into csdddg ( iddg )
SELECT
                dg.id_dg
from dg, preces
where   preces.preceskods[1,2] IN ('87','89')
                and ((upper(preces.precnos) like trim(UPPER('')) || '%') or ('' is null) or ('' = '') )
                and preces.id_dg = dg.id_dg 
                and dg.vad_numurs like '0211/4-400038%'
                and dg.kadgalkontr >= MDY(05,01,2004)               
                and dg.kadgalkontr <= mdy(05,10,2009)
                and dg.kadgalkontr >= MDY(05,01,2004)
                and ((dg.dekl1 IN ('IM','COM') and dg.dekl2 IN ('4','5'))
                or (preces.procedura[1,2] IN ('40', '41', '48', '49', '61', '53') and dg.kadgalkontr >= MDY(01,01,2007)))
                and dg.aktuals='1'
                and (dg.statuss <> 'A' or dg.statuss is null)
Estimated Cost: 11
Estimated # of Rows Returned: 5
  1) informix.dg: INDEX PATH
        Filters: (((informix.dg.kadgalkontr >= datetime(2004-05-01 00:00:00.00000) year to fraction(5) AND informix.dg.aktuals = 1 ) AND (informix.dg.statuss != 'A' OR informix.dg.statuss IS NULL ) ) AND informix.dg.kadgalkontr <= datetime(2009-05-10 00:00:00.00000) year to fraction(5) ) 
    (1) Index Name: informix.xie42dg
        Index Keys:  vad_numurs    (Serial, fragments: 0, 1)
        Fragments Scanned: (0) cmisexpl_dg1, (1) cmisexpl_dg2
        Lower Index Filter: informix.dg.vad_numurs LIKE '0211/4-400038%' 
  2) informix.preces: INDEX PATH
        Filters: (informix.preces.preceskods[1,2] IN ('87' , '89' )AND ((informix.dg.dekl2 IN ('4' , '5' )AND informix.dg.dekl1 IN ('IM' , 'COM' )) OR (informix.dg.kadgalkontr >= datetime(2007-01-01 00:00:00.00000) year to fraction(5) AND informix.preces.procedura[1,2] IN ('40' , '41' , '48' , '49' , '61' , '53' )) ) ) 
    (1) Index Name: informix. 885_2465
        Index Keys: id_dg 
        Lower Index Filter: informix.preces.id_dg = informix.dg.id_dg 
NESTED LOOP JOIN
Query statistics:
-----------------
  Table map :
  ----------------------------
  Internal name     Table name
  ----------------------------
  t1                dg
  t2                preces
  t3                csdddg
  type     table  rows_prod  est_rows  rows_scan  time       est_cost
  -------------------------------------------------------------------
  scan     t1     1          1          1          00:00.00    7       
  type     table  rows_prod  est_rows  rows_scan  time       est_cost
  -------------------------------------------------------------------
  scan     t2     4          758724    4          00:00.00   1       
  type     rows_prod  est_rows  time       est_cost
  -------------------------------------------------
  nljoin   4          1         00:00.00   9       
  type     table  rows_ins   time
  -----------------------------------
  insert   t3     4          00:00.00

, а из процедуры по другому:

Код: 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.
Procedure: informix.ttt
Statement id: 0
        insert into "informix".csdddg (iddg) select x0.id_dg from "informix".dg x0 ,"informix".preces x1 where (((((((((x1.preceskods [1,2] IN ('87' ,'89' )) AND (x1.id_dg = x0.id_dg ) ) AND (x0.vad_numurs LIKE '0211/4-400038%' ) ) AND (x0.kadgalkontr >= MDY (5 ,1 ,2004 ) ) ) AND (x0.kadgalkontr <= MDY (5 ,10 ,2009 ) ) ) AND (x0.kadgalkontr >= MDY (5 ,1 ,2004 ) ) ) AND (((x0.dekl1 IN ('IM' ,'COM' )) AND (x0.dekl2 IN ('4' ,'5' )) ) OR ((x1.procedura [1,2] IN ('40' ,'41' ,'48' ,'49' ,'61' ,'53' )) AND (x0.kadgalkontr >= MDY (1 ,1 ,2007 ) ) ) ) ) AND (x0.aktuals = 1. ) ) AND ((x0.statuss != 'A' ) OR (x0.statuss IS NULL ) ) )
QUERY: (OPTIMIZATION TIMESTAMP: 04-26-2012 15:24:26)
------
Estimated Cost: 10
Estimated # of Rows Returned: 9
  1) informix.dg: INDEX PATH
        Filters: (informix.dg.vad_numurs LIKE '0211/4-400038%' AND (informix.dg.statuss != 'A' OR informix.dg.statuss IS NULL ) ) 
    (1) Index Name: informix.dg_kadgalkontr
        Index Keys:  kadgalkontr aktuals    (Key-First)  (Serial, fragments: 0, 1)
        Fragments Scanned: (0) cmisexpl_dg1, (1) cmisexpl_dg2
        Lower Index Filter: informix.dg.kadgalkontr >= MDY (5 , 1 , 2004 ) AND (informix.dg.aktuals = 1 ) 
        Upper Index Filter: informix.dg.kadgalkontr <= MDY (5 , 10 , 2009 ) 
        Index Key Filters:  (informix.dg.kadgalkontr >= MDY (5 , 1 , 2004 ) ) AND
                            (informix.dg.aktuals = 1 )
  2) informix.preces: INDEX PATH
        Filters: (informix.preces.preceskods[1,2] IN ('87' , '89' )AND ((informix.dg.dekl2 IN ('4' , '5' )AND informix.dg.dekl1 IN ('IM' , 'COM' )) OR (informix.dg.kadgalkontr >= MDY (1 , 1 , 2007 ) AND informix.preces.procedura[1,2] IN ('40' , '41' , '48' , '49' , '61' , '53' )) ) ) 
    (1) Index Name: informix. 885_2465
        Index Keys: id_dg 
        Lower Index Filter: informix.preces.id_dg = informix.dg.id_dg 
NESTED LOOP JOIN
----------
Procedure: informix.ttt
Statement id: 0
Query statistics:
-----------------
  Table map :
  ----------------------------
  Internal name     Table name
  ----------------------------
  t1                dg
  t2                preces
  t3                csdddg
  type     table  rows_prod  est_rows  rows_scan  time       est_cost
  -------------------------------------------------------------------
  scan     t1     1          1          1328451    32:27.55    7       
  type     table  rows_prod  est_rows  rows_scan  time       est_cost
  -------------------------------------------------------------------
  scan     t2     4          758724    4          00:00.00   1       
  type     rows_prod  est_rows  time       est_cost
  -------------------------------------------------
  nljoin   4          1         32:27.55   9       
  type     table  rows_ins   time
  -----------------------------------
  insert   t3     4          32:27.55

? Может в суппорт обратиться...

P.S. В данном случае эксперимент проводился на 11.50.UC7W1 под Linux.
...
Рейтинг: 0 / 0
26.04.2012, 16:52
    #37772751
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё раз о планах выполнения
и где в первом :

((upper(preces.precnos) like trim(UPPER('')) || '%') or
('' is null) or ('' = ''))


???
...
Рейтинг: 0 / 0
26.04.2012, 16:55
    #37772759
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё раз о планах выполнения
точнее во втором
...
Рейтинг: 0 / 0
26.04.2012, 17:11
    #37772792
Leonid Vorontsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё раз о планах выполнения
автори где upper?

Без понятия. Так он пишет планы. В оригинале было:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create procedure ttt()
insert into csdddg ( iddg )
SELECT
                dg.id_dg
from dg, preces
where   preces.preceskods[1,2] IN ('87','89')
                and ((upper(preces.precnos) like trim(UPPER('')) || '%') or ('' is null) or ('' = '') )
                and preces.id_dg = dg.id_dg 
                and dg.vad_numurs like '0211/4-400038%'
                and dg.kadgalkontr >= MDY(05,01,2004)               
                and dg.kadgalkontr <= mdy(05,10,2009)
                and dg.kadgalkontr >= MDY(05,01,2004)
                and ((dg.dekl1 IN ('IM','COM') and dg.dekl2 IN ('4','5'))
                or (preces.procedura[1,2] IN ('40', '41', '48', '49', '61', '53') and dg.kadgalkontr >= MDY(01,01,2007)))
                and dg.aktuals='1'
                and (dg.statuss <> 'A' or dg.statuss is null);
end procedure;
execute procedure ttt()



То есть, если выделяю от insert до ; - план первый, если execute procedure - второй...
...
Рейтинг: 0 / 0
27.04.2012, 12:38
    #37773950
Leonid Vorontsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё раз о планах выполнения
Журавлев Дениси где ((upper(preces.precnos) like trim(UPPER('')) || '%') or ('' is null) or ('' = ''))
А, ну наверное оптимизатор исключил это условие из рассмотрения, потому что оно всегда даёт true.
...
Рейтинг: 0 / 0
27.04.2012, 15:54
    #37774522
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё раз о планах выполнения
Leonid Vorontsov? Может в суппорт обратиться...

Обратиться можно. И забыть, пока не поправят.
А самим добиться желаемого результата другими методами - вплоть до указания индекса (если уж у вас запросы в процедурах с такими жёсткими константами живут :) ).
...
Рейтинг: 0 / 0
28.04.2012, 15:06
    #37776033
Leonid Vorontsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё раз о планах выполнения
Ага, значит, всё-таки подтверждается, что это - глюк? Хорошо...

Нет, конечно, константы я дал для наглядности, на самом деле там переменные. Но вот не получается у меня добиться нужного результата - указал я ему, какой индекс использовать - но вместо ожидаемого Lower Index Filter увидел в плане Index Key Filters. Получше, конечно, стало, но всё равно недостаточно, статистика подтверждает:

Код: 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.
Procedure: informix.ttt
Statement id: 0
        insert into "informix".csdddg (iddg) select  {+  INDEX(x0 "xie42dg" ) } 
x0.id_dg from "informix".dg x0 ,"informix".preces x1 where ((((((((((x1.preceskods [1,2] IN ('87' ,'89' )) AND (((UPPER(x1.precnos )
 LIKE (TRIM ( BOTH  ' ' FROM UPPER(? ) ) || '%' ) ) OR (? IS NULL ) ) OR (? = '' ) ) ) AND (x1.id_dg = x0.id_dg ) ) AND
 (x0.vad_numurs LIKE (? || '%' ) ) ) AND (x0.kadgalkontr >= ? ) ) AND (x0.kadgalkontr <= ? ) ) AND (x0.kadgalkontr >= 
MDY (5 ,1 ,2004 ) ) ) AND (((x0.dekl1 IN ('IM' ,'COM' )) AND (x0.dekl2 IN ('4' ,'5' )) ) 
OR ((x1.procedura [1,2] IN ('40' ,'41' ,'48' ,'49' ,'61' ,'53' )) AND (x0.kadgalkontr >= MDY (1 ,1 ,2007 ) ) ) ) ) AND (x0.aktuals = 1. ) )
 AND ((x0.statuss != 'A' ) OR (x0.statuss IS NULL ) ) )
QUERY: (OPTIMIZATION TIMESTAMP: 04-28-2012 14:13:29)
------
Estimated Cost: 1731476
Estimated # of Rows Returned: 2
DIRECTIVES FOLLOWED: 
INDEX ( dg xie42dg )
DIRECTIVES NOT FOLLOWED: 
  1) informix.dg: INDEX PATH
        Filters: ((((informix.dg.kadgalkontr >= MDY (5 , 1 , 2004 ) AND informix.dg.kadgalkontr >= datetime(2004-05-01 00:00:00.00000) year to fraction(5) ) 
AND informix.dg.aktuals = 1 ) AND (informix.dg.statuss != 'A' OR informix.dg.statuss IS NULL ) ) AND informix.dg.kadgalkontr <= datetime(2009-05-10 23:59:59.00000) year to fraction(5) ) 
    (1) Index Name: informix.xie42dg
        Index Keys:  vad_numurs    (Key-First)  (Serial, fragments: ALL)
         Index Key Filters :  (informix.dg.vad_numurs LIKE ('0211/4-400038' || '%' ))
  2) informix.preces: INDEX PATH
        Filters: ((informix.preces.preceskods[1,2] IN ('87' , '89' )AND ((informix.dg.dekl2 IN ('4' , '5' )AND informix.dg.dekl1 IN ('IM' , 'COM' )) OR (informix.dg.kadgalkontr >= 
MDY (1 , 1 , 2007 ) AND informix.preces.procedura[1,2] IN ('40' , '41' , '48' , '49' , '61' , '53' )) ) ) AND ((UPPER(informix.preces.precnos ) LIKE (TRIM ( BOTH ' ' FROM UPPER('' ) ) || '%' )OR '' IS NULL ) OR '' = '' ) ) 
    (1) Index Name: informix. 885_2465
        Index Keys: id_dg 
        Lower Index Filter: informix.preces.id_dg = informix.dg.id_dg 
NESTED LOOP JOIN
----------
Procedure: informix.ttt
Statement id: 0
Query statistics:
-----------------
  Table map :
  ----------------------------
  Internal name     Table name
  ----------------------------
  t1                dg
  t2                preces
  t3                csdddg
  type     table  rows_prod  est_rows  rows_scan  time       est_cost
  -------------------------------------------------------------------
  scan     t1     1          1          7146388    01:13.68    1731474 
  type     table  rows_prod  est_rows  rows_scan  time       est_cost
  -------------------------------------------------------------------
  scan     t2     4          267071    4          00:00.00   1       
  type     rows_prod  est_rows  time       est_cost
  -------------------------------------------------
  nljoin   4          1         01:13.68   1731475 
  type     table  rows_ins   time
  -----------------------------------
  insert   t3     4          01:13.68

И что делать?
...
Рейтинг: 0 / 0
28.04.2012, 16:33
    #37776196
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё раз о планах выполнения
Leonid VorontsovАга, значит, всё-таки подтверждается, что это - глюк? Хорошо...

Если "подтверждается" - это в смысле, что сугубо мои знания, опыт, степень понимания логики работы Informix и т.д. и т.п. тоже не помогли выявить к чему придраться в твоей постановке вопроса - то да, "подтверждается" :).

А во втором запросе ты "махлюешь":
1) мало того, что форматирование отдал нам без особого уважения,
2) так ещё и внешний вид условия поменял:
было в 1-ом случае:
Код: sql
1.
      dg.vad_numurs like '0211/4-400038%'

во 2-ом
Код: sql
1.
     (x0.vad_numurs LIKE (? || '%' )


Вывод: если вы в ХП используете входной параметр p_vad_numurs,
сделайте в ХП поиск не
Код: sql
1.
(x0.vad_numurs LIKE (p_vad_numurs || '%' )

а
Код: sql
1.
2.
3.
4.
LET p_vad_numurs_like = p_vad_numurs || '%';
INSERT ....
(x0.vad_numurs LIKE p_vad_numurs_like)
...
...
Рейтинг: 0 / 0
28.04.2012, 16:39
    #37776206
АнатоЛой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё раз о планах выполнения
И оптимизатор сообразит, что перед ним не выражение, в котором нужно разбираться (а значит сложнее реализовать оптимизатор), а константа, с маскировочными символами в конце...
...
Рейтинг: 0 / 0
03.05.2012, 09:24
    #37779906
Daugava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё раз о планах выполнения
Leonid Vorontsov,

именно из-за переменных оптимизатор зачастую и глючит. Я стараюсь в таких случаях переписать запрос на несколько более простых. В некоторых случаях помогает запихать значения переменных во временную таблицу и использовать потом ее.
...
Рейтинг: 0 / 0
03.05.2012, 12:42
    #37780271
Leonid Vorontsov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё раз о планах выполнения
Ну, если я где и смухлевал, то не нарочно - кто ж мог подумать, что это не одно и то же? Тем более, что в первом посте оба запроса абсолютно одинаковы... В любом случае, спасибо за подсказку - заработало.
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / Ещё раз о планах выполнения / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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