powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Прошу помощи с индексами и запросом
25 сообщений из 26, страница 1 из 2
Прошу помощи с индексами и запросом
    #39591482
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
Приветствую!
В приложении есть запрос:
Код: plsql
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.
select h.msg_shipment_id msg_shipment_id,
       h.created,
       (select mp_name || '(' || h.marketplace_id || ')'
          from marketplaces
         where marketplace_id = h.marketplace_id) marketplace_info,
       h.marketplace_id marketplace_id,
       h.shipment_nr,
       h.shipment_date,
       h.saledoc_nr,
       h.saledoc_date,                          
       (select id || ', ' || fullname || ' (' || addressf_text || ')'
          from firms
         where id = h.shipper_id) shipper_info,
       (select id || ', ' || fullname || ' (' || addressf_text || ')'
          from firms
         where id = h.consignee_id) consignee_info,
       (select id || ', ' || fullname || ' (' || addressf_text || ')'
          from firms
         where id = h.customer_id) customer_info,
       (select id || ', ' || fullname || ' (' || addressf_text || ')'
          from firms
         where id = h.supplier_id) supplier_info,                           
       decode(h.status,
              0,              'удален',
              1,              'вчитан, готов к отправке получателю',
              2,              'отправлен получателю',
              3,              'доставлен',
              'статус не определен') status_info,
       h.status,
       h.created_user,
       h.unloaded,
       (select mp_name || '(' || h.destmarketplace_id || ')'
          from marketplaces
         where marketplace_id = h.destmarketplace_id) destmarketplace_info,
       h.shipment_type,                           
       nvl2(shnh.created,
            to_char(shnh.created, 'dd.mm.yyyy hh24:mi:ss'),
            'нет уведомления о приеме отправки') notice_created
  from msg_shipment_headers h
  left join etalonadm.msg_shipmentnotice_headers shnh on (shnh.shipment_nr =
                                               h.shipment_nr and
                                               shnh.marketplace_id =
                                               h.destmarketplace_id)
 where (upper(h.shipment_nr) like upper('00000005935') 
        or upper(h.saledoc_nr) like upper('00000005935')
       )
   and rownum <= 50
            


Из за конструкции
Код: plsql
1.
2.
3.
(upper(h.shipment_nr) like upper('00000005935') 
        or upper(h.saledoc_nr) like upper('00000005935')
       )


идет full scan

Индексы:
Код: plsql
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.
create index ETALONADM.IX_MSG_SH_HEADERS_SHIP_NR_UP
 on ETALONADM.MSG_SHIPMENT_HEADERS (upper(SHIPMENT_NR))
  tablespace ETALON
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );  
  
create index ETALONADM.IX_MSG_SH_HEADERS_SD_NR_UP
 on ETALONADM.MSG_SHIPMENT_HEADERS (upper(SALEDOC_NR))
  tablespace ETALON
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );  


не помогают.
Если в запросе и индексах убрать upper, то всё огонь. Но из приложения upper никак не выковырять.

Что можно придумать?
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591486
lYY,

версия сервера ?
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591493
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
10g на винде
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591574
Alexander_Ttl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYY,
Какой-то странный like.
Должно быть не like upper('00000005935'), а like upper('%00000005935%') ?
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591584
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander_Ttllike upper('%00000005935%')тогда FULL SCAN будет всегда вне зависимости от индекса
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591586
j2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYY, А какой тип у полей shipment_nr и saledoc_nr ?
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591589
Alexander_Ttl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕРAlexander_Ttllike upper('%00000005935%')тогда FULL SCAN будет всегда вне зависимости от индекса
а так проще поставить знак "="
=upper('00000005935')
или это фича какая-то?
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591590
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYYИндексы:
Код: plsql
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.
create index ETALONADM.IX_MSG_SH_HEADERS_SHIP_NR_UP
 on ETALONADM.MSG_SHIPMENT_HEADERS (upper(SHIPMENT_NR))
  tablespace ETALON
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );  
  
create index ETALONADM.IX_MSG_SH_HEADERS_SD_NR_UP
 on ETALONADM.MSG_SHIPMENT_HEADERS (upper(SALEDOC_NR))
  tablespace ETALON
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );  


не помогают
Ты после создания индексов пересобрал статистику по таблице ?
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591591
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander_Ttlа так проще поставить знак "="
=upper('00000005935')
или это фича какая-то?Не исключено :)
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591594
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Брать upper от цифр и like без процентов/подчеркиваний - абсурд.
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591595
Alexander_Ttl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYY,
а если убрать "or upper(h.saledoc_nr) like upper('00000005935')"
индекс подхватывается ?
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591604
Alexander_Ttl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadБрать upper от цифр и like без процентов/подчеркиваний - абсурд.
Согласен, я поэтому и спросил про "%".
Полагаю, TC считает, что если слева от like есть upper, то и справа должен быть.
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591609
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadБрать upper от цифр и like без процентов/подчеркиваний - абсурд.lYYНо из приложения upper никак не выковырять.Да тут и так все понятно, если уж запрос на клиенте находится
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591671
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
Alexander_TtllYY,
а если убрать "or upper(h.saledoc_nr) like upper('00000005935')"
индекс подхватывается ?
да
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591674
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
Alexander_TtlшК0ДЕРпропущено...
тогда FULL SCAN будет всегда вне зависимости от индекса
а так проще поставить знак "="
=upper('00000005935')
или это фича какая-то?
я не писал, я админ, я индекс могу создать или удалить)
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591706
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
AlexFF__|Ты после создания индексов пересобрал статистику по таблице ?
собрал, не помогло.

Написал, в общем, разработчикам. Пусть переделывают.
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591828
Alexander_Ttl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYYAlexander_TtllYY,
а если убрать "or upper(h.saledoc_nr) like upper('00000005935')"
индекс подхватывается ?
да
То есть, индекс, в принципе, работает.
Похоже, оптимизатор считает, что один раз просканировать всю таблицу дешевле, чем пройтись по двум разным индексам от начала и до конца, а потом еще выбрать необходимые данные из таблицы. Использование like вместо равенства не позволяет задействовать index range scan.
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591833
lYY,

что показывает запрос:
Код: plsql
1.
select * from v$parameter where name like 'query_rewrite%' 
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591834
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander_TtllYYпропущено...

да
Использование like вместо равенства не позволяет задействовать index range scan.

По-моему если в префиксе нет спецсимволов, оптимизатор отлично умеет в ранж скан по лайку.
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591836
Alexander_Ttl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valergrad, ты прав.
Но что-то я засомневался, что с функциональными индексами такое проходит.
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591837
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно что тут гадать?
Посмотрите сначала подхватывает ли он индекс в простейшем варианте -

Код: plsql
1.
select * from IX_MSG_SH_HEADERS_SHIP_NR_UP where upper(h.shipment_nr) like upper('00000005935')



Если не подхватывает - то нужно выяснять почему и в чем проблема с индексом.
Если подхватывает - то значит оптимизатор просто рассчитал для сложного запроса что ему будет быстрей фулл-сканом чем по двум индексам джойнить и создавать. Здесь я бы начал с просмотра плана запроса. Можно дописать принудительно хинты на использование индексов и index_combine и сравнить cost с исходной - действительно ли она больше, если да - то почему.
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591840
Alexander_Ttl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lYYЕсли в запросе и индексах убрать upper, то всё огонь.
Интересно бы посмотреть план с upper и без.
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591843
j2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValergradСобственно что тут гадать?
Посмотрите сначала подхватывает ли он индекс в простейшем варианте -

Код: plsql
1.
select * from IX_MSG_SH_HEADERS_SHIP_NR_UP where upper(h.shipment_nr) like upper('00000005935')



так вроде ответили про это уже 21141780
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591844
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можете сюда выложить планы через dbms_xplan четырех запросов:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select * from IX_MSG_SH_HEADERS_SHIP_NR_UP where upper(h.shipment_nr) like upper('00000005935')

select /*+ index(t IX_MSG_SH_HEADERS_SHIP_NR_UP) */ * from IX_MSG_SH_HEADERS_SHIP_NR_UP t where upper(h.shipment_nr) like upper('00000005935')

select * from IX_MSG_SH_HEADERS_SHIP_NR_UP where (upper(h.shipment_nr) like upper('00000005935') 
        or upper(h.saledoc_nr) like upper('00000005935')       )

select /*+ index_combine(t IX_MSG_SH_HEADERS_SHIP_NR_UP IX_MSG_SH_HEADERS_SD_NR_UP) */ * from IX_MSG_SH_HEADERS_SHIP_NR_UP t where (upper(h.shipment_nr) like upper('00000005935') 
        or upper(h.saledoc_nr) like upper('00000005935')       )
...
Рейтинг: 0 / 0
Прошу помощи с индексами и запросом
    #39591972
lYY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lYY
Гость
Простите, не на работе уже)
Я понимаю, что надо над приложением работать. Но у меня нет такой возможности. Я хотел по быстрому индекс какой нибудь прикрутить.
Запрос если переписать через instr,то идёт по индексу.
Написал разработчикам, будем подождать)

Всем спасибо и выходных!
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Прошу помощи с индексами и запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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