Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос для FAQ: Почему мой запрос работает медленно? / 25 сообщений из 41, страница 1 из 2
06.11.2002, 10:26
    #32065237
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
Код: plaintext
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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
Вопрос: Почему мой запрос работает медленно?
 ----------------------------------------------
 
   Для того что бы понять что является причиной медленной работы запроса, можно пойти
методом от обратного, т.е. необходимо уяснить, какие условия и принципы заставляют запрос работать быстро?
И видимо несоблюдение данных принципов и условий и приводят к медленной работе запроса.
   В данном случае не рассматривается общая производительность СУБД Oracle. Будем исходить из того,
что общая производительность настроена оптимально. Уже существуют разработанные запросы, которые работают
быстро.
   Одним из распространённых и классических способов увеличения производительности запросов, являетс
использование индексов.
В отсутствие индекса, план выполнения запроса будет использовать полное сканирование таблицы (FULL SCAN),
что при использовании метода оптимизации на основе правил хуже чем поиск по индексу. Исходя из этого
определим причины по которым запрос работает медленно:
    1 .Не был создан индекс.
      Необходимо создать его.

    2 .Индекс был создан когда-то, но в последствии был случайно удалён.
      Необходимо проверить существование индекса и в случае его отсутствия создать его.

    3 .Индекс был создан, он существует, но при выполнении не задействуется планом выполнения запроса.
      Причин по которым индекс не используется, может быть несколько. Вот несколько из них:
         a) в условии запроса не указаны столбцы, которые были включены в индекс.
            Необходимо включить в запрос столбцы, указанные в индексе или создать индекс, который включает
            в себя столбцы, которые участвуют в условии запроса;
         b) для составного ключа, столбцы участвующие в запросе соединены не оператором AND, а скажем
            оператором OR. В этом случае составной индекс не будет задействован в плане выполнения;
         c)в случае использования столбца в условии, которое определяет ограниченные интервал ,
            т.е. при использовании операторов  ">[=], <[=], LIKE, BETWEEN" , столбец в составном индексе не
            вляется ведущим;
         d) при использовании указателей (хинтов), указывающих на использование индекса,
            таких как INDEX, INDEX_ASC, INDEX_DESC, была допущена ошибка. Например, неправильно указано
            имя таблицы или индекса. Или хинт в целом написан неправильно;

   В случае же использования оптимизации  на основе издержек(стоимостной оптимизатор), даже если с точки
зрения оптимизации на основе правил индекс должен использоваться -  использование индекса уже не
гарантируется. В определённых условиях оптимизатор может посчитать, что стоимость полного сканировани
таблицы меньше и не будет использовать индекс. Если же вы считаете, что при использовании оптимизации
на основе издержек, определённый запрос, должен всегда использовать оптимизацию на основе правил,
необходимо в запросе указать хинт RULE.

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

Рассмотрим другие причины медленной работы запроса, не связанные с использованием индексов:

 1 .В запросе используются несколько таблиц, но не указано условие соединения или указано неверно.
   В этом случае каждая строка одной таблицы будет соединена с каждой строкой другой таблицы.
   Это может привести к очень длительному выполнению запроса, особенно при большом количестве записей
   в таблицах
 2 . Запрос просто возвращает очень много записей.
   Попробуйте ограничить количество возвращаемых записей дополнительными условиями. Также можно
   использовать псевдостолбец ROWNUM, который в результирующем наборе данных возвращает номер каждой
   строки. Необходимо включить его в условие так:
         SELECT * FROM user_tables WHERE ROWNUM< 10 ;
   Запрос вернёт только менее  10  строк.
 3 . В запросе указано, слишком много столбцов. Попробуйте изменить символ  "*"  на конкретный список
   столбцов, который вам необходим.
 4 . В запросе много вложенных циклов. Необходимо проанализировать запрос и переписать его с уменьшением
   числа вложенных циклов.
 5 . У вас несколько баз данных на разных серверах и количество записей таблиц существенно отличается.
   Вы ошибочно подключились не к той базе,
   которой хотели и ожидаемое время выполнения  запроса показалось вам не оправдано большим.


    Здесь были перечислены не все возможности увеличения производительности запроса, такие как
использование кластеров, секционирование. Следовательно не были рассмотрены и причины, связанные
с их использованием(или не использованием), по которым ваш запрос может работать медленно.
   Но часто бывает что разработчики SQL-запросов не имеют возможности изменять физическую структуру
   данных и им приходиться довольствоваться тем что есть. Поэтому для первоначального анализа медленной
работы запроса, выше перчисленных причин вполне достаточно.
...
Рейтинг: 0 / 0
06.11.2002, 10:56
    #32065261
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
не в обиду, но "баба-яга против" :-)
слишком много неточностей и сам вопрос слишком обширен для фака, это скорее тянет на статью.
...
Рейтинг: 0 / 0
06.11.2002, 11:01
    #32065265
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
Ну так давай замечания по поводу неточностей. Для этого я и опубликовал. А по поводу широты, то я смотрел в FAQ MSSQL, там достаточно большие есть ответы на вопрос.
Просто тот так попытался осветить вопрос .dba мне кажется отвечает не этот вопрос, а отвечает на вопрос, "как мне посмотреть план выполнения?"
...
Рейтинг: 0 / 0
06.11.2002, 11:27
    #32065285
none
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
Еще бы хорошо было пробежаться по методам объединения таблиц. Скорее даже отдельным пунктом фака. Например, в какойто ветке форума пробежала фраза: используйте HASH JOIN-ы вместо NESTED LOOP-ов. Мол это ВСЕГДА дает лучшую производительность. Хотелось бы, чтобы корифеи местного форума прокомментировали это.
...
Рейтинг: 0 / 0
06.11.2002, 11:57
    #32065297
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
Пункты 1-2.
Скрытая предпосылка "индекс эффективнее полного табличного сканирования" неверна. Очень часто преимущества мультиблочного чтения недооценены в плане настройки экземпляра. Прочитав такой фак, человек будет лепить индексы везде где можно и где нельзя. Я насмотрелся таких ситуаций выше крыши, когда работал консультантом.

п. 3а
Не учитывает ситуацию покрывающего индекса

3b
Может быть задействован ведущий(ие) столбцы индекса


см. index skip scanning в 9i

3d
Хинт - это подсказка (не указатель)

4. Посыл неверен.


новый п.3.
Не имеет смысла за исключением long/lob полей.

п.4 Абстракция. Что такое "много вложенных циклов" ? Nested Loops ??? Если это имелось ввиду, то при RULE такая ситуация будет возникать с 99% вероятности.


В целом слишком большой вопрос, который подразумевает знания слишком большого кол-ва деталей для одного вопроса FAQ'a
...
Рейтинг: 0 / 0
06.11.2002, 12:48
    #32065326
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
Не совсем согласен по замечаниям.

"Пункты 1-2. Скрытая предпосылка "индекс эффективнее полного табличного сканирования" неверна. "

Естественно, что в определённых случаях полное сканирование эффективнее, чем использование индекса. Это как раз можно включить отдельным пунктом, что запрос может выполняться медленно, потомучто индекс неэффективен, о чём в частности сказано в п.4.

Можно включить для спраки правила для оптимизации, использующиеся при регулярном подходе.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Пути доступа

        г======T=======================================================¬
        ¦ Ранг ¦ Путь доступа                                          ¦
        ¦======+=======================================================¦
        ¦    1   ¦ Одна строка через ROWID                               ¦
        ¦    2   ¦ Одна строка через кластерное соединение               ¦
        ¦    3   ¦ Одна строка через ключ хэш-кластера с уникальным      ¦
        ¦      ¦ или первичным ключом                                  ¦
        ¦    4   ¦ Одна строка через уникальный или первичный ключ       ¦
        ¦    5   ¦ Кластерное соединение                                 ¦
        ¦    6   ¦ Ключ хэш-кластера                                     ¦
        ¦    7   ¦ Ключ индексированного кластера                        ¦
        ¦    8   ¦ Составной индекс                                      ¦
        ¦    9   ¦ Одностолбцовые индексы                                ¦
        ¦   10   ¦ Ограниченный интервал по индексированным столбцам     ¦
        ¦   11   ¦ Неограниченный интервал по индексированным столбцам   ¦
        ¦   12   ¦ Соединение через сортировку-слияние                   ¦
        ¦   13   ¦ MAX или MIN по индексированному столбцу               ¦
        ¦   14   ¦ ORDER BY по индексированным столбцам                  ¦
        ¦   15   ¦ Полный просмотр таблицы                               ¦
        L======¦=======================================================-


Теперь по поводу же п.4: Привожу текст фирменного руководства "Руководство разработчикаприложений Oracle 7":
Код: plaintext
1.
2.
3.
4.
5.
             *  Если составной индекс  должен использоваться в  запросах,
               базирующихся   на   значениях   нескольких   столбцов, то
               упорядочение этих столбцов от более селективного к  менее
               селективному  в  предложении  CREATE  INDEX  лучше  всего
               повышает производительность запросов.


Теперь по поводу 3b:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Путь  8 : Составной индекс

        Этот путь возможен, если фраза WHERE предложения использует  все
        столбцы  составного  индекса  в  условиях равенства, соединенных
        операторами AND. Для выполнения предложения ORACLE  осуществляет
        интервальный  просмотр   по  индексу,   чтобы  извлечь   ROWID'ы
        выбираемых строк,  а затем  осуществляет доступ  к таблице через
        эти ROWID'ы.


И про 3a хотелось бы подробнее
...
Рейтинг: 0 / 0
06.11.2002, 13:08
    #32065343
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
по поводу пункта 4

Я конечно понимаю, что документация это почти библия...

Прежде всего замечу, что этому нелегальному переводу уже много-много лет. Если размышлять логично, тогда уж для 7ки ведущим полем для составного индекса нужно выбирать, то , которое используется в _большинстве_ запросов (для запросов как по всем столбцам индекса, так и по одиночным полям). Значит в приведенном отрывке речь идет только о тех запросах, которые используют _все_ поля индекса. Это подразумевается. В этом случае никакой разницы какой селективностью обладает ведущее поле индекса НЕТ. По определению деревянного индекса B*Tree дерево всегда сбалансировано.
...
Рейтинг: 0 / 0
06.11.2002, 13:16
    #32065349
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
по поводу 3b

вы не учли того, что CBO вообще не знает о каких-то там рангах. Он работает _по_другому_

Исходя из этого я давал ответ по этому пункту.
Но если речь в нем идет об RBO (что не было указано), то в принципе то какая разница будет ранг 8 или ранг 10 в этом случае. Не надо на это ссылаться, людей запутаете. Человек прочтет просто "составной индекс не будет использоваться" а это не всегда так.
...
Рейтинг: 0 / 0
06.11.2002, 13:19
    #32065353
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
по поводу 3а

Покрывающий индекс содержит весь перечень столбцов, указанных в кляузе SELECT. Поэтому нет необходимости идти за данными в таблицу. В кляузе WHERE не обязательно указание индексных столбцов. Стоимостной оптимизатор сам разберется. Доступ будет через FAST FULL INDEX SCAN
...
Рейтинг: 0 / 0
06.11.2002, 13:28
    #32065362
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
Хорошо, можно рассмотреть простой пример.
Допустим торговая фирма имеет много клиентов, допустим 10000, которые делают покупки. Каждый отдельный клиент, делает закупки редко, но за каждый день кол-во покупок клиентами в целом состовляет достаточно много, скажем 1000 в день. Один клиент может сделать несколько покупок в один день.
Таблица, описывающая покупки:
Клиент, дата, номер покупки
Необходимо создать индекс позваляющий выбрать клиента за указанный период.
Мне кажется достаточно очевидно, что кол-во покупок конкретного клиента за конкретный день, значительно меньше чем общее количество покупок для отдельного дня.

И было бы более логичным и эффективным указать в индексе такую последовательность:
CREATE INDEX i1_orders ON orders(client, date_pay)
чем
CREATE INDEX i1_orders ON orders(date_pay, client)

Поиск дней входящих в интервал в пределах одного клиента будет быстрее чем поиск клиента в пределах всех заказов кадого дня.
...
Рейтинг: 0 / 0
06.11.2002, 13:38
    #32065369
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
to killed:
по поводу последних замечаний - все эти пункты относятся к оптимизации на основе правил, я же конкретно пишу в тексте, перед перечислением. А чуть ниже пришу про стоимостной подход.
...
Рейтинг: 0 / 0
06.11.2002, 14:06
    #32065391
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
зачем вы приводите какой-то субьективный пример с массой условностей, который вцелом мало о чем говорит?

Тем не менее если в кляузе WHERE будет client = :a1 and pay_date = :a2

По поводу ФАК'a : По-моему у вас там все в кучу намешано , либо просто невнятно написано что к чему.

Пример: пункты 3b, 3c относятся к RULE-оптимизации (как выяснилось), тогда как в пункте 3d вы почему-то начинаете рассуждать о хинтах.
...
Рейтинг: 0 / 0
06.11.2002, 14:11
    #32065397
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
Тем не менее если в кляузе WHERE будет client = :a1 and pay_date = :a2 , то разницы нет никакой.

>Мне кажется достаточно очевидно, что кол-во покупок конкретного клиента за конкретный день, значительно меньше чем общее количество покупок для отдельного дня.

Вы действительно думаете, чтобы найти кол-во покупок для конкретного клиента за конкретный день, Оракл будет перелопачивать все покупки за этот день?
...
Рейтинг: 0 / 0
06.11.2002, 14:21
    #32065401
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
Пример по поводу 3b:
Код: plaintext
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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
create table orders2
(
 client NUMBER( 16 ),
 orders NUMBER( 16 ),
 date_pay DATE
);

insert into orders2 values( 1 , 1 ,to_date('04.11.2002','dd.mm.yyyy'));
insert into orders2 values( 1 , 2 ,to_date('04.11.2002','dd.mm.yyyy'));
insert into orders2 values( 1 , 3 ,to_date('04.11.2002','dd.mm.yyyy'));
insert into orders2 values( 2 , 4 ,to_date('04.11.2002','dd.mm.yyyy'));
insert into orders2 values( 3 , 5 ,to_date('04.11.2002','dd.mm.yyyy'));
insert into orders2 values( 4 , 6 ,to_date('04.11.2002','dd.mm.yyyy'));
insert into orders2 values( 2 , 7 ,to_date('05.11.2002','dd.mm.yyyy'));
insert into orders2 values( 3 , 8 ,to_date('05.11.2002','dd.mm.yyyy'));
insert into orders2 values( 4 , 9 ,to_date('06.11.2002','dd.mm.yyyy'));
insert into orders2 values( 4 , 10 ,to_date('06.11.2002','dd.mm.yyyy'));
commit;

create index i1_orders2 on orders2(client, date_pay);


          "b) для составного ключа, столбцы участвующие в запросе соединены не оператором AND," :         

EXPLAIN PLAN SET STATEMENT_ID = 'Поиск по индексу' FOR
select
  *
  from
   orders2
  where
   client= 4  and
   date_pay = to_date('04.11.2002','dd.mm.yyyy');

 "а скажем
            оператором OR. В этом случае составной индекс не будет задействован в плане выполнения;" :

EXPLAIN PLAN SET STATEMENT_ID = 'Поиск не по индексу' FOR
select
  *
  from
   orders2
  where
   client= 4  or
   date_pay = to_date('04.11.2002','dd.mm.yyyy');



SQLWKS> select 
      2 >   statement_id,
      3 >   operation,
      4 >   options
      5 >  from plan_table;
STATEMENT_ID                   OPERATION                      OPTIONS                       
 ------------------------------ ------------------------------ ------------------------------
 
Поиск по индексу               SELECT STATEMENT                                             
Поиск по индексу               TABLE ACCESS                   BY INDEX ROWID                
Поиск по индексу               INDEX                          RANGE SCAN                    
Поиск не по индексу            SELECT STATEMENT                                             
Поиск не по индексу            TABLE ACCESS                   FULL                          
Выбрано  5  строк.

Мне казалось, этот вопрос не должен был вызывать сомнений
...
Рейтинг: 0 / 0
06.11.2002, 14:34
    #32065412
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
"Пример: пункты 3b, 3c относятся к RULE-оптимизации (как выяснилось), тогда как в пункте 3d вы почему-то начинаете рассуждать о хинтах."

Ну вот, приехали. А кто сказал, что использование хинтов возможно только в стоимостной оптимизации???

Если я уже в самом хинте могу указать способ оптимизации RULE, это уже говорит о том, что я могу использовать хинты при регулярной оптимизации.

Потом, если я правильно написал хинт и он не нарушает никаких правил оптимизатора, то он будет конкретно использовать этот индекс, а не просчитывать какие это варианты.

select /*+ RULE INDEX_DESC(test_for_find i1_test_for_find) */
min(serial_key)
from
test_for_find
where
serial_key is not null and
rownum<4;

SQLWKS> select /*+ RULE INDEX_DESC(test_for_find i1_test_for_find) */
2> min(serial_key)
3> from
4> test_for_find
5> where
6> serial_key is not null and
7> rownum<4;
MIN(SERIAL
----------
5
Выбрана 1 строка.

SQLWKS> select operation, options, object_name, optimizer from plan_table
2>
OPERATION OPTIONS OBJECT_NAME OPTIMIZER
------------------------------ ------------------------------ ------------------------------ --------------------------------------------------------------------------------
SELECT STATEMENT HINT: RULE
SORT AGGREGATE
COUNT STOPKEY
INDEX FULL SCAN DESCENDING I1_TEST_FOR_FIND
Выбрано 4 строк.
...
Рейтинг: 0 / 0
06.11.2002, 14:39
    #32065413
ora600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
Наверное, надо совершенно разделить ответы на CBO и RBO

2softbuilder
Ваш пример не вызывает никаких сомнений сомнений только потому, что по-другому нельзя НИКАК. Если сделать индекс с ведущим date_pay, то при определенных условиях
выбор плана будет совершенно неочевиден.
...
Рейтинг: 0 / 0
06.11.2002, 14:40
    #32065414
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
прежде чем писать FAQ, вам нужно почитать документацию про хинты. Любой хинт кроме RULE означает стоимостную оптимизацию. Хинт RULE _включает_ режим оптимизации по правилам. Сам RBO ничего не знает о хинтах.

PS В вашем примере работает стоимостной оптимизатор
...
Рейтинг: 0 / 0
06.11.2002, 14:51
    #32065422
ora600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
2killed
Везде, где отказались от CBO, обычно вовсю используют хинты. Это обычно набор из ordered, index(index_desc), use_nl(...merge,hash).
Пример - заставить RBO использовать составной индекс ,если в запросе только ведущая колонка. Или отказаться от приоретности "<что-то>=<константа>", что нередко бывает выгодным
...
Рейтинг: 0 / 0
06.11.2002, 14:57
    #32065427
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
Ладно, ребята не хотите как хотите.
На примерах доказываешь - не убеждает.
Я считал, что это помогло бы народу, хотя бы тем кто только начинает и пока еще не готов окунаться в тонкости.
...
Рейтинг: 0 / 0
06.11.2002, 15:00
    #32065429
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
2ora600

Еще раз, там где хинты - там работает CBO. Т.е. ни от чего вы не отказались. Как он работал - так он и работает с хинтами. Единственная разница - в последнем случае из всего множества возможных планов, рассматриваются только те, которые удовлетворяют условием хинтов.
...
Рейтинг: 0 / 0
06.11.2002, 15:06
    #32065434
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
я не против FAQ'a , но он должен быть хорошим. Каждый вопрос - маленький кирпичик, заложенный в общую стену и закрепленный перекрестными ссылками на такие же маленькие кирпичики (вопросы).

PS Все ИМХО
...
Рейтинг: 0 / 0
06.11.2002, 15:30
    #32065450
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
Я лично не против замечаний и указаний, на ошибки. Просто хочется иметь аргументацию, причём на примерах.
И на последок такой вопрос, вот запрос, без указания RULE в хинте:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select  /*+ INDEX_DESC(test_for_find i1_test_for_find) */ 
  min(serial_key)
 from
  test_for_find
 where
   serial_key is not null and
   rownum< 4 ;

Смотрим план:
OPERATION                      OPTIONS                        OBJECT_NAME                    OPTIMIZER                                                                       
 ------------------------------ ------------------------------ ------------------------------ --------------------------------------------------------------------------------
 
SELECT STATEMENT                                                                             RULE                                                                            
SORT                           AGGREGATE                                                                                                                                     
COUNT                          STOPKEY                                                                                                                                       
INDEX                          FULL SCAN DESCENDING           I1_TEST_FOR_FIND                                                                                               
Выбрано  4  строк.


Обьясните мне, почему я не должен верить плану, в котором написано, что OPTIMIZER = RULE?

Наверно это будет последний вопрос по этой теме с моей стороны.
...
Рейтинг: 0 / 0
06.11.2002, 15:32
    #32065453
ora600
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
2killed
Да, я неправильно написАл. Вместо "заставить RBO использовать составной индекс " читать "заставить CBO с дефолтной статистикой использовать составной индекс ".
Другое дело, что CBO с дефолтной статистикой - это гораздо хуже RBO во многих случаях: тогда народ пишет /*+ rule*/ и на первое время все счастливы :-)

2softbuilder
Не обижайтесь :-). Ну просто краткость faq-а будет неизбежно конфликтовать с его качеством и корректностью. Скажем,
> 1.Не был создан индекс.
> Необходимо создать его.
А вдруг мне ОЧЕНЬ важна скорость DML на этих таблицах ? :-)
...
Рейтинг: 0 / 0
06.11.2002, 15:48
    #32065467
killed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
2sofbuilder

а у вас режим какой выставлен в файле параметров?
...
Рейтинг: 0 / 0
06.11.2002, 16:22
    #32065494
gminter
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос для FAQ: Почему мой запрос работает медленно?
OPTIMIZER GOAL = FIRST_ROWS
Это единственный рулез для избежания TABLE FULL SCAN в общем случае для SELECT-ов с ORDER BY.

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


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