Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Прошу помощи с индексами и запросом / 25 сообщений из 26, страница 1 из 2
26.01.2018, 11:01
    #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
26.01.2018, 11:07
    #39591486
Прошу помощи с индексами и запросом
lYY,

версия сервера ?
...
Рейтинг: 0 / 0
26.01.2018, 11:17
    #39591493
lYY
lYY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи с индексами и запросом
10g на винде
...
Рейтинг: 0 / 0
26.01.2018, 12:57
    #39591574
Alexander_Ttl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи с индексами и запросом
lYY,
Какой-то странный like.
Должно быть не like upper('00000005935'), а like upper('%00000005935%') ?
...
Рейтинг: 0 / 0
26.01.2018, 13:09
    #39591584
шК0ДЕР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи с индексами и запросом
Alexander_Ttllike upper('%00000005935%')тогда FULL SCAN будет всегда вне зависимости от индекса
...
Рейтинг: 0 / 0
26.01.2018, 13:10
    #39591586
j2k
j2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи с индексами и запросом
lYY, А какой тип у полей shipment_nr и saledoc_nr ?
...
Рейтинг: 0 / 0
26.01.2018, 13:16
    #39591589
Alexander_Ttl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи с индексами и запросом
шК0ДЕРAlexander_Ttllike upper('%00000005935%')тогда FULL SCAN будет всегда вне зависимости от индекса
а так проще поставить знак "="
=upper('00000005935')
или это фича какая-то?
...
Рейтинг: 0 / 0
26.01.2018, 13:16
    #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
26.01.2018, 13:20
    #39591591
шК0ДЕР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи с индексами и запросом
Alexander_Ttlа так проще поставить знак "="
=upper('00000005935')
или это фича какая-то?Не исключено :)
...
Рейтинг: 0 / 0
26.01.2018, 13:21
    #39591594
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи с индексами и запросом
Брать upper от цифр и like без процентов/подчеркиваний - абсурд.
...
Рейтинг: 0 / 0
26.01.2018, 13:22
    #39591595
Alexander_Ttl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи с индексами и запросом
lYY,
а если убрать "or upper(h.saledoc_nr) like upper('00000005935')"
индекс подхватывается ?
...
Рейтинг: 0 / 0
26.01.2018, 13:27
    #39591604
Alexander_Ttl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи с индексами и запросом
AmKadБрать upper от цифр и like без процентов/подчеркиваний - абсурд.
Согласен, я поэтому и спросил про "%".
Полагаю, TC считает, что если слева от like есть upper, то и справа должен быть.
...
Рейтинг: 0 / 0
26.01.2018, 13:28
    #39591609
шК0ДЕР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи с индексами и запросом
AmKadБрать upper от цифр и like без процентов/подчеркиваний - абсурд.lYYНо из приложения upper никак не выковырять.Да тут и так все понятно, если уж запрос на клиенте находится
...
Рейтинг: 0 / 0
26.01.2018, 14:17
    #39591671
lYY
lYY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи с индексами и запросом
Alexander_TtllYY,
а если убрать "or upper(h.saledoc_nr) like upper('00000005935')"
индекс подхватывается ?
да
...
Рейтинг: 0 / 0
26.01.2018, 14:18
    #39591674
lYY
lYY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи с индексами и запросом
Alexander_TtlшК0ДЕРпропущено...
тогда FULL SCAN будет всегда вне зависимости от индекса
а так проще поставить знак "="
=upper('00000005935')
или это фича какая-то?
я не писал, я админ, я индекс могу создать или удалить)
...
Рейтинг: 0 / 0
26.01.2018, 14:36
    #39591706
lYY
lYY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи с индексами и запросом
AlexFF__|Ты после создания индексов пересобрал статистику по таблице ?
собрал, не помогло.

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

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

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

По-моему если в префиксе нет спецсимволов, оптимизатор отлично умеет в ранж скан по лайку.
...
Рейтинг: 0 / 0
26.01.2018, 17:41
    #39591836
Alexander_Ttl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи с индексами и запросом
Valergrad, ты прав.
Но что-то я засомневался, что с функциональными индексами такое проходит.
...
Рейтинг: 0 / 0
26.01.2018, 17:43
    #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
26.01.2018, 17:48
    #39591840
Alexander_Ttl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи с индексами и запросом
lYYЕсли в запросе и индексах убрать upper, то всё огонь.
Интересно бы посмотреть план с upper и без.
...
Рейтинг: 0 / 0
26.01.2018, 17:51
    #39591843
j2k
j2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи с индексами и запросом
ValergradСобственно что тут гадать?
Посмотрите сначала подхватывает ли он индекс в простейшем варианте -

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



так вроде ответили про это уже 21141780
...
Рейтинг: 0 / 0
26.01.2018, 17:52
    #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
26.01.2018, 22:28
    #39591972
lYY
lYY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прошу помощи с индексами и запросом
Простите, не на работе уже)
Я понимаю, что надо над приложением работать. Но у меня нет такой возможности. Я хотел по быстрому индекс какой нибудь прикрутить.
Запрос если переписать через instr,то идёт по индексу.
Написал разработчикам, будем подождать)

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


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