Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функциональные индексы, особенности использования. / 6 сообщений из 6, страница 1 из 1
31.08.2016, 04:05:05
    #39300745
ATeplov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональные индексы, особенности использования.
Добрый день

суть вопроса: в пром. системе перешли на мультибайтную кодировку хранения, разработчики системы для выдачи корректной сортировки по текстовым полям перешли на функциональные индексы вида

Код: plsql
1.
2.
3.
4.
5.
CREATE UNIQUE INDEX BAANDB.TTFGLD469106$IDX1 ON BAANDB.TTFGLD469106
(NLSSORT("T$MSCD",'nls_sort=''UCA0610_DUCET_S3_VN_BN_NY_EN_FN_HN_DN_MN'''), T$MSVS, NLSSORT("T$EGCD",'nls_sort=''UCA0610_DUCET_S3_VN_BN_NY_EN_FN_HN_DN_MN'''), T$TCMP, T$FCMP, 
T$PRIO, T$SEQN)
LOGGING
TABLESPACE BAANDB_AUTO_IDX



соответственно в запросах индексы перестали использоваться пример:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT /*+ FIRST_ROWS(5) */ a0.t$tcmp,a0.t$fcmp,a0.t$prio,a0.t$seqn 
FROM baandb.ttfgld469106 a0 ,baandb.ttfgld469106 a1  
WHERE NOT EXISTS (
SELECT 0 
FROM baandb.ttfgld469106 a2  
WHERE a2.t$mscd = :1 AND a2.t$msvs = :2 AND a2.t$egcd = :3 AND a2.t$tcmp = a1.t$tcmp AND a2.t$fcmp = a1.t$fcmp 
  AND a2.t$prio = a0.t$prio AND a2.t$seqn = a0.t$seqn) AND a1.t$fcmp = a0.t$fcmp AND a1.t$tcmp = a0.t$tcmp AND a1.t$mscd = :4 
  AND a1.t$msvs = :5 AND a1.t$egcd = :6 AND a0.t$mscd = :7 AND a0.t$msvs = :8 AND a0.t$egcd = :9 ORDER BY 1,2,3,4;



план выполнения
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  --------------------------------------------------------------------------------------
| Id  | Operation             | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |              |  2417 |   306K|   177K  (1)| 00:00:07 |
|   1 |  SORT ORDER BY        |              |  2417 |   306K|   177K  (1)| 00:00:07 |
|*  2 |   HASH JOIN RIGHT ANTI|              |  2417 |   306K|   177K  (1)| 00:00:07 |
|*  3 |    TABLE ACCESS FULL  | TTFGLD469106 |   527 | 24242 | 59321   (1)| 00:00:03 |
|*  4 |    HASH JOIN          |              |   241K|    19M|   118K  (1)| 00:00:05 |
|*  5 |     TABLE ACCESS FULL | TTFGLD469106 |   527 | 24242 | 59321   (1)| 00:00:03 |
|*  6 |     TABLE ACCESS FULL | TTFGLD469106 |   527 | 20026 | 59321   (1)| 00:00:03 |
--------------------------------------------------------------------------------------



но при этом если в запросе явно указать подсказку то индекс все таки используется

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT /*+ index(a0 TTFGLD469106$IDX1) index(a1 TTFGLD469106$IDX1) */ a0.t$tcmp,a0.t$fcmp,a0.t$prio,a0.t$seqn 
FROM baandb.ttfgld469106 a0 ,baandb.ttfgld469106 a1  
WHERE NOT EXISTS (
SELECT 0 
FROM baandb.ttfgld469106 a2  
WHERE a2.t$mscd = :1 AND a2.t$msvs = :2 AND a2.t$egcd = :3 AND a2.t$tcmp = a1.t$tcmp AND a2.t$fcmp = a1.t$fcmp 
  AND a2.t$prio = a0.t$prio AND a2.t$seqn = a0.t$seqn) AND a1.t$fcmp = a0.t$fcmp AND a1.t$tcmp = a0.t$tcmp AND a1.t$mscd = :4 
  AND a1.t$msvs = :5 AND a1.t$egcd = :6 AND a0.t$mscd = :7 AND a0.t$msvs = :8 AND a0.t$egcd = :9 ORDER BY 1,2,3,4;



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
----------------------------------------------------------------------------------------------------
| Id  | Operation                              | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                       |                   |  2417 |   306K| 59619   (1)| 00:00:03 |
|   1 |  SORT ORDER BY                         |                   |  2417 |   306K| 59619   (1)| 00:00:03 |
|*  2 |   HASH JOIN RIGHT ANTI                 |                   |  2417 |   306K| 59618   (1)| 00:00:03 |
|*  3 |    TABLE ACCESS FULL                   | TTFGLD469106      |   527 | 24242 | 59321   (1)| 00:00:03 |
|*  4 |    HASH JOIN                           |                   |   241K|    19M|   293   (2)| 00:00:01 |
|*  5 |     TABLE ACCESS BY INDEX ROWID BATCHED| TTFGLD469106      |   527 | 24242 |   145   (1)| 00:0
|*  6 |      INDEX FULL SCAN                   | TTFGLD469106$IDX1 | 32702 |       |   124   (1)| 00:00:01 |
|*  7 |     TABLE ACCESS BY INDEX ROWID BATCHED| TTFGLD469106      |   527 | 20026 |   145   (1)| 00:0
|*  8 |      INDEX FULL SCAN                   | TTFGLD469106$IDX1 | 32702 |       |   124   (1)| 00:00:01 |
---------------------------------------------------------------------------------------------------- 



Собственно вопрос, я считал что функциональный индекс может использоваться только в том случае если в условиях ограничения стоит точно такая же функция что и в конструкции индекса или это не так ?
...
Рейтинг: 0 / 0
31.08.2016, 05:28:13
    #39300748
AnSi_Sr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональные индексы, особенности использования.
ATeplovсоответственно в запросах индексы перестали использоваться
...
но при этом если в запросе явно указать подсказку то индекс все таки используется

Оптимизатор считает оптимальным другой план выполнения.
Да, если заставить использовать индекс - будет использовать.
...
Рейтинг: 0 / 0
31.08.2016, 06:51:41
    #39300759
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональные индексы, особенности использования.
alter session set nls_sort='UCA0610_DUCET_S3_VN_BN_NY_EN_FN_HN_DN_MN'
не помогает?
...
Рейтинг: 0 / 0
31.08.2016, 08:02:37
    #39300772
ATeplov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональные индексы, особенности использования.
Попробую :)
...
Рейтинг: 0 / 0
31.08.2016, 08:04:02
    #39300774
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональные индексы, особенности использования.
ATeplovно при этом если в запросе явно указать подсказку то индекс все таки используется
Код: plsql
1.
INDEX FULL SCAN 

Ну-ну.
...
Рейтинг: 0 / 0
31.08.2016, 09:16:52
    #39300803
ATeplov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функциональные индексы, особенности использования.
Без ф-ций range scan, я так понимаю без использования ф-ций в запросе по полям range scan_а добиться не получиться ?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функциональные индексы, особенности использования. / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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