|
|
|
opt_estimate по индексу в отсутствие таблицы
|
|||
|---|---|---|---|
|
#18+
Есть запрос типа select /*+ OPT_ESTIMATE(INDEX_SKIP_SCAN DD IDX01 ROWS=1234) */ count(vn) cnt from Table1 DD where vn in (:p1); Кардинальность для неких нужд он выдает плохую, поэтому требуется поправить ее на 1234. Но. Поле vn находится в индексе, поэтому таблица не читается, а только индекс. Фактически нужно задать кардинальность индекса. Строка плана выглядит примерно так: ---------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ---------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 2193 (100) | | | 1 | SORT AGGREGATE | | 1 | 6 | | | |* 2 | INDEX SKIP SCAN | IDX01 | 21 | 126 | 2193 (1)| 00:00:27 | ---------------------------------------------------------------------------------------------- И, соответственно, хинт в таком случае не работает. Но как только поле vn в count заменим на поле, какого в индексе нет, то план показывает доступ к таблице и хинт работает: select /*+ OPT_ESTIMATE(INDEX_SKIP_SCAN DD IDX01 ROWS=1234) */ count(ts) cnt from Table1 DD where vn in (:p1); --------------------------------------------------------------- | Id | Operation | Name | Rows | --------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 1 | SORT AGGREGATE | | 1 | |* 2 | INDEX UNIQUE SCAN| I_PK | 21 | |* 3 | INDEX SKIP SCAN | IDX01 | 1234 | --------------------------------------------------------------- I_PK - это таблица, просто она IOT. Вопрос - как заставить хинт работать на голом индексе, без таблицы, как показано в 1 плане? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 13:59 |
|
||
|
opt_estimate по индексу в отсутствие таблицы
|
|||
|---|---|---|---|
|
#18+
avdu, потому что в первом случае берется кардиналость по таблице. Сравни с Код: plsql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 14:23 |
|
||
|
opt_estimate по индексу в отсутствие таблицы
|
|||
|---|---|---|---|
|
#18+
avdu, а вообще почему не использовать NO_INDEX_SS если хотите от него избавиться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 14:26 |
|
||
|
opt_estimate по индексу в отсутствие таблицы
|
|||
|---|---|---|---|
|
#18+
xtender, точно, вроде сработало. Все перебрал, а саму таблицу не догадался из-за отсутствия таковой в плане. А она то и требовалась, однако. В плане то ее нет, зато в жизни есть. Спасибо, сэр ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 14:34 |
|
||
|
opt_estimate по индексу в отсутствие таблицы
|
|||
|---|---|---|---|
|
#18+
xtender, от индекса не хочу, просто хочу поменять кардинальность по нему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 14:35 |
|
||
|
opt_estimate по индексу в отсутствие таблицы
|
|||
|---|---|---|---|
|
#18+
avdu, я имел ввиду не от индекса, а именно от ISS. имхо, лучше было бы использовать, что-нибудь другое... Например, еще можно сделать: Код: plsql 1. параметры подкрутить под необходимые ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2017, 14:44 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=137&tid=1884920]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 203ms |
| total: | 328ms |

| 0 / 0 |
