Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Сравнение планов двух простых селектов  [new]
Непонимающий
Guest
Допустим есть таблица:

create table tmp as select 'a' as col1,'b' as col2 from dual connect by level <= 10000;

делаем индекс
create index tmp_idx on table(col1);

далее выполняем
analyze table tmp compute statistics;

Далее выполняем два запроса:
1) один просто перебором всей таблицы :
select col1,col2 from tmp where col1||'' = 'a';

Получаем вот такой план:
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer Mode=ALL_ROWS (Cost=7 Card=10 K Bytes=19 K)
1 0 TABLE ACCESS FULL ALEMAR.TEST_TMP1 (Cost=7 Card=10 K Bytes=19 K)


2) используя созданный индекс
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer Mode=ALL_ROWS (Cost=4 Card=10 K Bytes=19 K)
1 0 TABLE ACCESS BY INDEX ROWID ALEMAR.TEST_TMP1 (Cost=4 Card=10 K Bytes=19 K)
2 1 INDEX RANGE SCAN ALEMAR.TEST_TMP1_IDX (Cost=2 Card=10 K)




Как я понимаю в данном случае select который отрабатывает через обычный перебор таблицы должен отработать быстрее, т.е. cost должен быть меньше, но как видно из планов - получается наоборот ....

Может мне кто-нибудь чётко и ясно пояснить в чём тут вся "соль" ?
16 апр 08, 09:27    [5552126]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение планов двух простых селектов  [new]
Splain
Member

Откуда: Череповец
Сообщений: 924
Вопрос-то в чем?
16 апр 08, 09:45    [5552236]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение планов двух простых селектов  [new]
Непонимающий
Guest
Вопрос в том что :
Почему у select-а использующего индекс COST меньше чем у обычного перебора ? Я так понимаю что должно быть в данном случае наоборот

Обращаю внимание , что проиндексированный столбец состоит из одного значения = 'a'
16 апр 08, 09:52    [5552271]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение планов двух простых селектов  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18483
10053 ?
16 апр 08, 09:56    [5552298]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение планов двух простых селектов  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Версия какая?
16 апр 08, 10:00    [5552319]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение планов двух простых селектов  [new]
Splain
Member

Откуда: Череповец
Сообщений: 924
Непонимающий
Вопрос в том что :
Почему у select-а использующего индекс COST меньше чем у обычного перебора ? Я так понимаю что должно быть в данном случае наоборот

Обращаю внимание , что проиндексированный столбец состоит из одного значения = 'a'


Потому что есть формулы расчета стоимости. По ним посчитали и получили такие вот числа.

Предупреждая следующий вопрос, формулу расчета стоимости и обсуждение нюансов можно найти у
Jonathan Lewis CBO Fundamentals, Apress, 2006. стр. 1-115. Там же есть информация о трассировке оптимизатора событием 10053.
16 апр 08, 10:02    [5552328]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение планов двух простых селектов  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
И ещё - второй запрос у Вас хинтованный или какой? Потому как если просто такой же запрос без конкатенации соглашается брать индекс, то трабла уже здесь :)
16 апр 08, 10:02    [5552329]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение планов двух простых селектов  [new]
Непонимающий
Guest
Спасибо за подсказку на документацию - обязательно прочту.


To Jannny :
второй селект точно такой же , но без конкатенации

select col1,col2 from tmp where col1 = 'a'
В данной случае оптимизатор использует созданный индекс. И почему он его использует я понимаю, мне не ясно почему COST у данного запроса меньше, чем у обычного перебора :)
(вообще я предполагал , что в такой ситуации обычный перебор - это более удачное решение, чем использование индекса - соответственно и COST должен быть меньше у перебора...)
16 апр 08, 10:14    [5552406]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение планов двух простых селектов  [new]
х.з.
Member

Откуда:
Сообщений: 765
а у меня вот так:
system@cnv> select /*+ index(tt TI) */ c1,c2 from t TT where c1='a';

План выполнения
----------------------------------------------------------
Plan hash value: 691267586

------------------------------------------------------------------------------------
| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      | 10000 | 40000 |    36   (3)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T    | 10000 | 40000 |    36   (3)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | TI   | 10000 |       |    20   (5)| 00:00:01 |
------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("C1"='a')

system@cnv> select c1,c2 from t TT where c1='a';

План выполнения
----------------------------------------------------------
Plan hash value: 2153619298

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      | 10000 | 40000 |     4  (50)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T    | 10000 | 40000 |     4  (50)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("C1"='a')

на твоем тесткейсе. только юзал dbms_stats.gahter_table_stats(...cascade...)
все вроде согласуется.
16 апр 08, 10:26    [5552517]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение планов двух простых селектов  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Все же версия?
16 апр 08, 10:31    [5552559]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение планов двух простых селектов  [new]
Я и ёжик
Member

Откуда: СПб
Сообщений: 1815
Непонимающий


select col1,col2 from tmp where col1 = 'a'
В данной случае оптимизатор использует созданный индекс. И почему он его использует я понимаю, мне не ясно почему COST у данного запроса меньше, чем у обычного перебора :)

Например, у вас установлены "идиотские" настройки параметров оптимизатора:

SQL> select col1,col2 from tmp t where col1 = 'a';

План выполнения
----------------------------------------------------------

---------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)|
---------------------------------------------------------------
|   0 | SELECT STATEMENT  |      | 10000 | 20000 |     7  (15)|
|*  1 |  TABLE ACCESS FULL| TMP  | 10000 | 20000 |     7  (15)|
---------------------------------------------------------------

SQL> alter session set OPTIMIZER_INDEX_COST_ADJ=10;

Сеанс изменен.

SQL> select col1,col2 from tmp t where col1 = 'a';

План выполнения
----------------------------------------------------------

----------------------------------------------------------------------------
| Id  | Operation                   | Name    | Rows  | Bytes | Cost (%CPU)|
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |         | 10000 | 20000 |     4   (0)|
|   1 |  TABLE ACCESS BY INDEX ROWID| TMP     | 10000 | 20000 |     4   (0)|
|*  2 |   INDEX RANGE SCAN          | TMP_IDX | 10000 |       |     2   (0)|
----------------------------------------------------------------------------
16 апр 08, 10:32    [5552561]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить