powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Проблема с substr?
25 сообщений из 51, страница 1 из 3
Проблема с substr?
    #35588497
2face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите разобрать с проблемой!
запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
select dmfo, dacc, cmfo, cacc, amountuak
from vpayord
where
substr(cacc, 1 , 4 ) in ( 6010 , 6011 , 6012 , 6013 , 6014 , 6015 , 6016 , 6017 , 6018 )
and cmfo=config_getkey('MFO','COMMON')
and dtend between MDY( 3 , 1 , 2008 ) and MDY( 3 , 31 , 2008 )
отрабатывает за 4 минуты. Но, если заменить substr(cacc,1,4) на cacc[1,4], т.е.
Код: plaintext
1.
2.
3.
4.
5.
6.
select dmfo, dacc, cmfo, cacc, amountuak
from vpayord
where
cacc[ 1 , 4 ] in ( 6010 , 6011 , 6012 , 6013 , 6014 , 6015 , 6016 , 6017 , 6018 )
and cmfo=config_getkey('MFO','COMMON')
and dtend between MDY( 3 , 1 , 2008 ) and MDY( 3 , 31 , 2008 )
то выборка идет 3-4 секунды. В чем может быть проблема?
...
Рейтинг: 0 / 0
Проблема с substr?
    #35588535
2face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Версия базы - 10. Тип поля cacc - varchar.
...
Рейтинг: 0 / 0
Проблема с substr?
    #35588551
Ikir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется здесь уже такое было.
Попробуйте
substr(cacc,1,4) in ('6010','6011','6012','6013','6014','6015','6016','6017','6018')
...
Рейтинг: 0 / 0
Проблема с substr?
    #35588611
2face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На сайте такой проблемы не нашел. Пробовал с кавычками - разницы никакой.
...
Рейтинг: 0 / 0
Проблема с substr?
    #35588629
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2face
...
отрабатывает за 4 минуты. Но, если заменить substr(cacc,1,4) на cacc[1,4], т.е.
...
то выборка идет 3-4 секунды. В чем может быть проблема?
А можно взглянуть на планы запросов ?
...
Рейтинг: 0 / 0
Проблема с substr?
    #35588653
2face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vasilis
А можно взглянуть на планы запросов ?
Извините, а что именно вы хотите увидеть?
...
Рейтинг: 0 / 0
Проблема с substr?
    #35588659
Фотография Тан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может есть индекс по полю cacc?
может cacc[1,4] его использует, а substr(cacc,1,4) - нет
...
Рейтинг: 0 / 0
Проблема с substr?
    #35588671
2face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть два индекса по полям, одно из которых сасс.
...
Рейтинг: 0 / 0
Проблема с substr?
    #35588697
Фотография Тан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2faceЕсть два индекса по полям, одно из которых сасс.
чтобы понять, используется ли индекс, надо посмотреть план запроса
...
Рейтинг: 0 / 0
Проблема с substr?
    #35588713
2face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С sql я мало работал, а с informix'ом еще меньше. Подскажите как мне посмотреть план запроса.
...
Рейтинг: 0 / 0
Проблема с substr?
    #35588730
Фотография Тан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2faceС sql я мало работал, а с informix'ом еще меньше. Подскажите как мне посмотреть план запроса.
Код: plaintext
1.
2.
3.
4.
5.
select {+ Explain} dmfo, dacc, cmfo, cacc, amountuak
from vpayord
where substr(cacc, 1 , 4 ) in ( 6010 , 6011 , 6012 , 6013 , 6014 , 6015 , 6016 , 6017 , 6018 )
and cmfo=config_getkey('MFO','COMMON')
and dtend between MDY( 3 , 1 , 2008 ) and MDY( 3 , 31 , 2008 )
на сервере в домашнем каталоге пользователя появится файл sqexplain.out.
в нем будет план запроса.
какая версия Informix у вас?
...
Рейтинг: 0 / 0
Проблема с substr?
    #35588736
2face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как говорят наши айтишники - 9.5 или 10.
...
Рейтинг: 0 / 0
Проблема с substr?
    #35588767
Фотография Тан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2faceКак говорят наши айтишники - 9.5 или 10.
значит у вас поддерживаются директивы оптимизатора, {+ Explain} будет работать
...
Рейтинг: 0 / 0
Проблема с substr?
    #35588786
2face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
QUERY:
------
select {+ Explain} dmfo, dacc, cmfo, cacc, amountuak
from vpayord
where
substr(cacc,1,4) in ('6010','6011','6012','6013','6014','6015','6016','6017','6018')
and cmfo=config_getkey('MFO','COMMON')
and status in ('+','G')
and dtend between MDY(3,1,2008) and MDY(3,31,2008)

DIRECTIVES FOLLOWED:
EXPLAIN
DIRECTIVES NOT FOLLOWED:

Estimated Cost: 341
Estimated # of Rows Returned: 14

1) informix.payord: INDEX PATH

Filters: ((informix.payord.status IN ('+' , 'G' )AND SUBSTR (informix.payord.cacc , 1 , 4 ) IN ('6010' , '6011' , '6012' , '6013' , '6014' , '6015' , '6016' , '6017' , '6018' )) AND ((EXISTS <subquery> OR EXISTS <subquery> ) OR EXISTS <subquery> ) )

(1) Index Keys: cmfo cacc currency dtend (Key-First) (Serial, fragments: ALL)
Lower Index Filter: informix.payord.cmfo = informix.config_getkey('MFO' ,'COMMON' )
Index Key Filters: (informix.payord.dtend >= 01/03/2008 ) AND
(informix.payord.dtend <= 31/03/2008 )

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

1) informix.x1: INDEX PATH

(1) Index Keys: iduser acc_mask (Key-Only) (Serial, fragments: ALL)
(fragments might be eliminated at runtime because filter contains
runtime constants)
Lower Index Filter: (informix.x1.acc_mask = 1 AND informix.x1.iduser = USER )
Index Key Filters: ((informix.x1.acc_mask = 1 OR (informix.x1.acc_mask = 2 AND informix.payord.dacclead IS NULL ) ) )

(2) Index Keys: iduser acc_mask (Key-Only) (Serial, fragments: ALL)
(fragments might be eliminated at runtime because filter contains
runtime constants)
Lower Index Filter: (informix.x1.acc_mask = 2 AND informix.x1.iduser = USER )
Index Key Filters: ((informix.x1.acc_mask = 1 OR (informix.x1.acc_mask = 2 AND informix.payord.dacclead IS NULL ) ) )

UDRs in query:
--------------
UDR id : 480
UDR name: config_getkey

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

1) informix.x5: INDEX PATH

(1) Index Keys: idpayord (Serial, fragments: ALL)
Lower Index Filter: informix.x5.idpayord = informix.payord.idpayord

2) informix.x4: INDEX PATH

(1) Index Keys: iduser acc_mask (Key-Only) (Serial, fragments: ALL)
(fragments might be eliminated at runtime because filter contains
runtime constants)
Lower Index Filter: (informix.x4.acc_mask = informix.x5.access_code AND informix.x4.iduser = USER )
NESTED LOOP JOIN

UDRs in query:
--------------
UDR id : 480
UDR name: config_getkey

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

1) informix.x2: INDEX PATH

(1) Index Keys: idacc (Serial, fragments: ALL)
Lower Index Filter: informix.x2.idacc = informix.payord.dacclead

(2) Index Keys: idacc (Serial, fragments: ALL)
Lower Index Filter: informix.x2.idacc = informix.payord.cacclead

2) informix.x3: INDEX PATH

(1) Index Keys: iduser acc_mask (Key-Only) (Serial, fragments: ALL)
(fragments might be eliminated at runtime because filter contains
runtime constants)
Lower Index Filter: (informix.x2.access_code = informix.x3.acc_mask AND informix.x3.iduser = USER )
NESTED LOOP JOIN

UDRs in query:
--------------
UDR id : 480
UDR name: config_getkey

UDRs in query:
--------------
UDR id : 480
UDR name: config_getkey
...
Рейтинг: 0 / 0
Проблема с substr?
    #35588817
2face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кто-нибудь может мне объяснить, как по плану запроса определить причину моей проблемы.
...
Рейтинг: 0 / 0
Проблема с substr?
    #35588822
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2faceКто-нибудь может мне объяснить, как по плану запроса определить причину моей проблемы.а план запроса cacc[1,4] in где?
...
Рейтинг: 0 / 0
Проблема с substr?
    #35588840
2face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
select {+ Explain} dmfo, dacc, cmfo, cacc, amountuak
from vpayord
where
cacc[1,4] in (6010,6011,6012,6013,6014,6015,6016,6017,6018)
--substr(cacc,1,4) in ('6010','6011','6012','6013','6014','6015','6016','6017','6018')
and cmfo=config_getkey('MFO','COMMON')
and status in ('+','G')
and dtend between MDY(3,1,2008) and MDY(3,31,2008)

DIRECTIVES FOLLOWED:
EXPLAIN
DIRECTIVES NOT FOLLOWED:

Estimated Cost: 21
Estimated # of Rows Returned: 1

1) informix.payord: INDEX PATH

Filters: (informix.payord.status IN ('+' , 'G' )AND ((EXISTS <subquery> OR EXISTS <subquery> ) OR EXISTS <subquery> ) )

(1) Index Keys: cmfo cacc currency dtend (Key-First) (Serial, fragments: ALL)
Lower Index Filter: (informix.payord.cacc[1,4] = '6010' AND informix.payord.cmfo = informix.config_getkey('MFO' ,'COMMON' ))
Index Key Filters: (informix.payord.dtend >= 01/03/2008 ) AND
(informix.payord.dtend <= 31/03/2008 )

(2) Index Keys: cmfo cacc currency dtend (Key-First) (Serial, fragments: ALL)
Lower Index Filter: (informix.payord.cacc[1,4] = '6011' AND informix.payord.cmfo = informix.config_getkey('MFO' ,'COMMON' ))
Index Key Filters: (informix.payord.dtend >= 01/03/2008 ) AND
(informix.payord.dtend <= 31/03/2008 )

(3) Index Keys: cmfo cacc currency dtend (Key-First) (Serial, fragments: ALL)
Lower Index Filter: (informix.payord.cacc[1,4] = '6012' AND informix.payord.cmfo = informix.config_getkey('MFO' ,'COMMON' ))
Index Key Filters: (informix.payord.dtend >= 01/03/2008 ) AND
(informix.payord.dtend <= 31/03/2008 )

(4) Index Keys: cmfo cacc currency dtend (Key-First) (Serial, fragments: ALL)
Lower Index Filter: (informix.payord.cacc[1,4] = '6013' AND informix.payord.cmfo = informix.config_getkey('MFO' ,'COMMON' ))
Index Key Filters: (informix.payord.dtend >= 01/03/2008 ) AND
(informix.payord.dtend <= 31/03/2008 )

(5) Index Keys: cmfo cacc currency dtend (Key-First) (Serial, fragments: ALL)
Lower Index Filter: (informix.payord.cacc[1,4] = '6014' AND informix.payord.cmfo = informix.config_getkey('MFO' ,'COMMON' ))
Index Key Filters: (informix.payord.dtend >= 01/03/2008 ) AND
(informix.payord.dtend <= 31/03/2008 )

(6) Index Keys: cmfo cacc currency dtend (Key-First) (Serial, fragments: ALL)
Lower Index Filter: (informix.payord.cacc[1,4] = '6015' AND informix.payord.cmfo = informix.config_getkey('MFO' ,'COMMON' ))
Index Key Filters: (informix.payord.dtend >= 01/03/2008 ) AND
(informix.payord.dtend <= 31/03/2008 )

(7) Index Keys: cmfo cacc currency dtend (Key-First) (Serial, fragments: ALL)
Lower Index Filter: (informix.payord.cacc[1,4] = '6016' AND informix.payord.cmfo = informix.config_getkey('MFO' ,'COMMON' ))
Index Key Filters: (informix.payord.dtend >= 01/03/2008 ) AND
(informix.payord.dtend <= 31/03/2008 )

(8) Index Keys: cmfo cacc currency dtend (Key-First) (Serial, fragments: ALL)
Lower Index Filter: (informix.payord.cacc[1,4] = '6017' AND informix.payord.cmfo = informix.config_getkey('MFO' ,'COMMON' ))
Index Key Filters: (informix.payord.dtend >= 01/03/2008 ) AND
(informix.payord.dtend <= 31/03/2008 )

(9) Index Keys: cmfo cacc currency dtend (Key-First) (Serial, fragments: ALL)
Lower Index Filter: (informix.payord.cacc[1,4] = '6018' AND informix.payord.cmfo = informix.config_getkey('MFO' ,'COMMON' ))
Index Key Filters: (informix.payord.dtend >= 01/03/2008 ) AND
(informix.payord.dtend <= 31/03/2008 )

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

1) informix.x1: INDEX PATH

(1) Index Keys: iduser acc_mask (Key-Only) (Serial, fragments: ALL)
(fragments might be eliminated at runtime because filter contains
runtime constants)
Lower Index Filter: (informix.x1.acc_mask = 1 AND informix.x1.iduser = USER )
Index Key Filters: ((informix.x1.acc_mask = 1 OR (informix.x1.acc_mask = 2 AND informix.payord.dacclead IS NULL ) ) )

(2) Index Keys: iduser acc_mask (Key-Only) (Serial, fragments: ALL)
(fragments might be eliminated at runtime because filter contains
runtime constants)
Lower Index Filter: (informix.x1.acc_mask = 2 AND informix.x1.iduser = USER )
Index Key Filters: ((informix.x1.acc_mask = 1 OR (informix.x1.acc_mask = 2 AND informix.payord.dacclead IS NULL ) ) )

UDRs in query:
--------------
UDR id : 480
UDR name: config_getkey

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

1) informix.x5: INDEX PATH

(1) Index Keys: idpayord (Serial, fragments: ALL)
Lower Index Filter: informix.x5.idpayord = informix.payord.idpayord

2) informix.x4: INDEX PATH

(1) Index Keys: iduser acc_mask (Key-Only) (Serial, fragments: ALL)
(fragments might be eliminated at runtime because filter contains
runtime constants)
Lower Index Filter: (informix.x4.acc_mask = informix.x5.access_code AND informix.x4.iduser = USER )
NESTED LOOP JOIN

UDRs in query:
--------------
UDR id : 480
UDR name: config_getkey

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

1) informix.x2: INDEX PATH

(1) Index Keys: idacc (Serial, fragments: ALL)
Lower Index Filter: informix.x2.idacc = informix.payord.dacclead

(2) Index Keys: idacc (Serial, fragments: ALL)
Lower Index Filter: informix.x2.idacc = informix.payord.cacclead

2) informix.x3: INDEX PATH

(1) Index Keys: iduser acc_mask (Key-Only) (Serial, fragments: ALL)
(fragments might be eliminated at runtime because filter contains
runtime constants)
Lower Index Filter: (informix.x2.access_code = informix.x3.acc_mask AND informix.x3.iduser = USER )
NESTED LOOP JOIN

UDRs in query:
--------------
UDR id : 480
UDR name: config_getkey

UDRs in query:
--------------
UDR id : 480
UDR name: config_getkey
...
Рейтинг: 0 / 0
Проблема с substr?
    #35588851
2face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Судя по этим файлам substr не использует индекс. А почему?
...
Рейтинг: 0 / 0
Проблема с substr?
    #35588875
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2faceСудя по этим файлам substr не использует индекс. А почему?потому что это функция, все субд так делают. Нужен функуциональный индекс substr(cacc,1,4)
вообще я думаю что надо начинать с индекса по dtend (between MDY(3,1,2008) and MDY(3,31,2008)) если нет индексов фрагментированных по dtend.
...
Рейтинг: 0 / 0
Проблема с substr?
    #35590602
Фотография Daugava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конкретно для данного случая правильнее было бы написать
cacc LIKE '601%'

6019 счета все равно нет, ну а если появится, то наверняка потребуется. Я в таких случаях предпочитаю выносить все в настроечную табличку.
Кстати, если это процедура, то имеет смысл использовать просто payord, вьюха все таки тяжелее и для разных пользователей будет выдавать разные результаты, в зависимости от их доступов.
...
Рейтинг: 0 / 0
Проблема с substr?
    #35590674
2face
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблицу payord я не могу использовать, т.к. наши айтишники не рекомендуют мне этого делать. Мне просто очень интересно, почему substr так убого работает. До этого работал с ораклом и там все было нормально, даже при работе с таблицами с большим количеством записей.
...
Рейтинг: 0 / 0
Проблема с substr?
    #35590727
zaiets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну работает оно так - ниче не поделаешь.
Типичный вопрос ораклистов - почему не так как в оракле?
Ну реализовали в информикс вот таким макаром.

Дао прав по поводу лайк - тогда тоже берется индекс и все фильтры идут по индексу.
Estimated Cost: 437
Estimated # of Rows Returned: 649

1) informix.payord: INDEX PATH

(1) Index Keys: cmfo cacc currency dtend (Key-First) (Serial, fragments: ALL)
Lower Index Filter: (informix.payord.cmfo = informix.config_getkey('MFO' ,'COMMON' )AND informix.payord.cacc LIKE '601
%' )
Index Key Filters: (informix.payord.dtend >= 01/03/2008 ) AND
(informix.payord.dtend <= 31/10/2008 )

От того - представление это или нет - план для указанного фильтра не изменяется(я сделал для таблицы).

А собственно почему - Денис уже ответил.
Хотя, в данном случае было бы логично чтобы фильтр substr, если нчинается с первого символа, ганладывался на индекс.

Ну а если вы считаете что это неправильно - делайте запрос в IBM и настаивайте.
Как оформить запрос - думаю ваш разработчик вам поможет.
...
Рейтинг: 0 / 0
Проблема с substr?
    #35590739
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2faceДо этого работал с ораклом и там все было нормально, даже при работе с таблицами с большим количеством записей.В этом месте информикс лучше оракла в несколько раз.
...
Рейтинг: 0 / 0
Проблема с substr?
    #35590767
Фотография Евгений Фадеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис2faceДо этого работал с ораклом и там все было нормально, даже при работе с таблицами с большим количеством записей.В этом месте информикс лучше оракла в несколько раз.Речь про форум или про большие таблицы?
Если первое - то не в несколько раз, а в принципе. Если про второе - спорно :))
...
Рейтинг: 0 / 0
Проблема с substr?
    #35590787
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений ФадеевЖуравлев Денис2faceДо этого работал с ораклом и там все было нормально, даже при работе с таблицами с большим количеством записей.В этом месте информикс лучше оракла в несколько раз.Речь про форум или про большие таблицы?
Если первое - то не в несколько раз, а в принципе. Если про второе - спорно :))про where substr(field)=

http://dil.livejournal.com/712512.html#t4415296
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 1 из 3
Форумы / Informix [игнор отключен] [закрыт для гостей] / Проблема с substr?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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