powered by simpleCommunicator - 2.0.44     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle Optimizer
13 сообщений из 38, страница 2 из 2
Oracle Optimizer
    #32052056
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первое утверждение неверное

Остальное на примере:

Код: 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.
scott@DEEP.SISTEMA.RU>; select * from v$version;

BANNER
 ----------------------------------------------------------------
 
Oracle9i Enterprise Edition Release  9 . 2 . 0 . 1 . 0  - Production
PL/SQL Release  9 . 2 . 0 . 1 . 0  - Production
CORE     9 . 2 . 0 . 1 . 0        Production
TNS for Linux: Version  9 . 2 . 0 . 1 . 0  - Production
NLSRTL Version  9 . 2 . 0 . 1 . 0  - Production


scott@DEEP.SISTEMA.RU>; create table t1(id number, name varchar2( 30 ) not null);

Table created.

scott@DEEP.SISTEMA.RU>; insert into t1 values( 1 , 'Vasya');

 1  row created.

scott@DEEP.SISTEMA.RU>; insert into t1 values( 2 , 'Petya');

 1  row created.

scott@DEEP.SISTEMA.RU>; insert into t1 values( 3 , 'Masha');

 1  row created.

scott@DEEP.SISTEMA.RU>; commit;

Commit complete.

scott@DEEP.SISTEMA.RU>; create index t1_ix on t1(name);

Index created.

scott@DEEP.SISTEMA.RU>; analyze table t1 compute statistics;

Table analyzed.

scott@DEEP.SISTEMA.RU>; set autotrace on exp
scott@DEEP.SISTEMA.RU>; 
scott@DEEP.SISTEMA.RU>; 
scott@DEEP.SISTEMA.RU>; select  /*+ INDEX(t1 t1_ix) */  * from t1 order by name;

        ID NAME
 ---------- -------------------------
 
          3  Masha
          2  Petya
          1  Vasya


Execution Plan
 ----------------------------------------------------------
 
    0       SELECT STATEMENT Optimizer=CHOOSE (Cost= 2  Card= 3  Bytes= 21 )
    1      0    TABLE ACCESS (BY INDEX ROWID) OF 'T1' (Cost= 2  Card= 3  Bytes
          = 21 )

    2      1      INDEX (FULL SCAN) OF 'T1_IX' (NON-UNIQUE) (Cost= 1  Card= 3 
          )



Попробуйте пошагово, если получится другой результат, я буду сильно удивлен. Видимо у меня Оракл лучше ;-)
...
Рейтинг: 0 / 0
Oracle Optimizer
    #32052064
buzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=3 Bytes=21)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'T1' (Cost=2 Card=3 Bytes
=21)

2 1 INDEX (FULL SCAN) OF 'T1_IX' (NON-UNIQUE) (Cost=1 Card=3
)

Другой.

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=3 Bytes=21)
1 0 SORT (ORDER BY) (Cost=4 Card=3 Bytes=21)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'T1' (Cost=2 Card=3 Byt
es=21)

3 2 INDEX (FULL SCAN) OF 'T1_IX' (NON-UNIQUE) (Cost=1 Card
=3)

У вас нет доп сортировки. У меня есть. И статистика выполнения показывает что таки да он результат отсортировал прежде чем мне выдать.
Откель у нас такая разница в выполнениях?

ЗЫ. Кстати что вы имели в виду под "Первое утверждение неверное"?
...
Рейтинг: 0 / 0
Oracle Optimizer
    #32052072
Фотография killed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, вот этого я пока понять не могу :(
А что говорит select * from v$version; ??

Утверждение относительно сортировки. Единств. проблема может возникнуть если у таблицы задран HWM.
...
Рейтинг: 0 / 0
Oracle Optimizer
    #32052089
vskv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
В общем плохо это. Наглядно можно сравнивать результаты выполнения 

Select * From Table1 order by ID 
Скорость исполнения  2 . 3  сек. 

Select  /*+ FIRST_ROWS*/  * From Table1 order by ID 
Скорость исполнения  0 . 07  сек. 

На  54000  записей. Второй случай практически не зависит от количества полей в выборке. В первом все очень сильно зависит от того сколько в этой самой звездочке. 
Результаты совершенно не удивительные. Удивительно что никакими силами не удается заставить оракл работать по варианту  2  в случае ордера с полями не входящими в первичный ключ.


Сравниваем время и убеждаемся, что во втором случае время 0.07 сек не есть время полной работы запроса, а только время до получения первый строк выборки . У вас же в момент тестирования "fetch all records" не стоял, did it?
...
Рейтинг: 0 / 0
Oracle Optimizer
    #32052097
buzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, вот этого я пока понять не могу :(
А что говорит select * from v$version; ??

Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
TNS for Linux: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - Production

Утверждение относительно сортировки. Единств. проблема может возникнуть если у таблицы задран HWM.

Помедленней. Я в оракле не копенгаген пока что. Что есть HWM?
...
Рейтинг: 0 / 0
Oracle Optimizer
    #32052101
buzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сравниваем время и убеждаемся, что во втором случае время 0.07 сек не есть время полной работы запроса, а только время до получения первый строк выборки. У вас же в момент тестирования "fetch all records" не стоял, did it?

Конечно не стоял. При полном фетче

1) Без индекса
Select * From myprobtovar order by ID
20.048 сек

2)
Select /*+ FIRST_ROWS*/ * From myprobtovar order by ID
19.358 сек

Все равно запрос по индексу быстрей. Даже при полном фетче. И еще надо учесть что его скорость практически не зависит от количества полей. Так что он предпочтительней даже в случае фетч олл. Правда тут разница минимальна.

В статистике разница.
1)
Name,Last,Total
CPU used by this session,37
physical reads,437
physical writes,423
session logical reads,1578
sorts (disk),1
sorts (memory),0
sorts (rows),54210
table fetch by rowid,0
table scan blocks gotten,1566
table scan rows gotten,54210
table scans (long tables),1
table scans (short tables),0


2)
Name,Last,Total
CPU used by this session,43
physical reads,0
physical writes,0
session logical reads,73889
sorts (disk),0
sorts (memory),0
sorts (rows),0
table fetch by rowid,54210
table scan blocks gotten,0
table scan rows gotten,0
table scans (long tables),0
table scans (short tables),0

Кардинальная разница в
session logical reads и
sorts (rows)
...
Рейтинг: 0 / 0
Oracle Optimizer
    #32052105
gminter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для VSKV.
Дык беда в чем - когда мы видим первый результат, то выкладываем его в сетку, и пользователь счаслив, так как он ждал всего 0.07 секунды. Ежели мы работаем 1.5 секунды, то пользователь уже ждет и нервничает.
В любом случае финальный фетч на клиента идет одинаково долго, но он то нам НЕ НУЖЕН СРАЗУ
...
Рейтинг: 0 / 0
Oracle Optimizer
    #32052132
vskv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эа, ну нельзя же так ставить вопросы...

Если вам нужно это в сеть, юзверю, то так и декларируйте,
что вам нужно "побыстрее добыть первые записи, а потом, как получится".
Тогда вам в первых же строках документации (глава про оптимизатор) скажут, что вам нужны FIRST_ROWS.

Хотя странно, обычно CBO под FIRST_ROWS и оптимизирует. У вас случаем нигде не стоит чего-нибудь типа set optimizer mode=all_rows ?
...
Рейтинг: 0 / 0
Oracle Optimizer
    #32052134
buzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эа, ну нельзя же так ставить вопросы...

Если вам нужно это в сеть, юзверю, то так и декларируйте,
что вам нужно "побыстрее добыть первые записи, а потом, как получится".
Тогда вам в первых же строках документации (глава про оптимизатор) скажут, что вам нужны FIRST_ROWS.

Хотя странно, обычно CBO под FIRST_ROWS и оптимизирует. У вас случаем нигде не стоит чего-нибудь типа set optimizer mode=all_rows?

Конечно сорри, но... вроде ж не раз было сказано что запрос запускался в том числе и с прямым указанием индекса и с хинтом FIRST_ROWS . Беда в том что оракл на эти указания ... с высокой колокольни короче. Вопрос был именно в том что именно могло привести к такому его поведению.
set optimizer mode завтра гляну. Но как по моему это не должно оказывать влияние на реакцию на прямые хинты в запросе. Я неправ?
...
Рейтинг: 0 / 0
Oracle Optimizer
    #32052149
gdi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gdi
Гость
Может проблема в параметре NLS_SORT?


If the value is a named linguistic sort, sorting is based on the order of the
defined linguistic sort. Most (but not all) languages supported by the NLS_LANGUAGE parameter also support a linguistic sort with the same name.


Note: Setting NLS_SORT to anything other than BINARY causes a sort to use a full table scan, regardless of the path chosen by the optimizer. BINARY is the exception because indexes are built according to a binary order of keys. Thus the optimizer can use an index to satisfy the ORDER BY clause when NLS_SORT is set to BINARY. If NLS_SORT is set to any linguistic sort, the optimizer must include a full table scan and a full sort in the execution plan.
...
Рейтинг: 0 / 0
Oracle Optimizer
    #32052153
buzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
NLS_SORT очень близко к теме.По крайней мере очень похоже.

Я не могу взять в толк две вещи.
1. Почему этот параметр должен влиять на ордер по нумерик полям.
2. Зачем собственно ALTER SESSION NLS_SORT=....

По второму пункту. Если индекс уже построен по каким-то правилам, то как изменение флага внутри сессии может повлиять на то можно использовать этот индекс или нет?
Ну и напоследок вопрос бывалым.
Как обычно вы настраиваете все эти NLS ?
...
Рейтинг: 0 / 0
Oracle Optimizer
    #32052161
gminter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К GDI

Таки помогло ))) Но все же если мы имеем сорт по какому-то number-у, отличному от первичного ключа, но так же с индексом, то проблема остается.
...
Рейтинг: 0 / 0
Oracle Optimizer
    #32052288
buzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное человеческое спасибо GDI. Без всяких демагогий ткнул носом туда куда нужно.

Теперь маленькое промежуточное резюме.

Суть проблемы сводилась к тому что NLS_SORT сессии не совпадал с NLS_SORT индекса. Посему оракл просто был уверен, что индекс для ордера не подходит никак. Выхода два. Либо для сессии установить NLS_SORT=BINARY, либо создать индекс с NLS_SORT=Russian . После чего Оракл без всяких дополнительных хинтов начинает юзать этот индекс в полный рост.

Остается вопрос с нестринговыми полями. Для всяких интегеров этот финт не проходит. К тому же мне совершенно неясно почему NLS_SORT вообще должен влиять на не стринговые поля. Куды глядеть еще?

ЗЫ. Срывать мне крышу сказками о том что вычитать хаотически все и потом отсортировать, будет дешевле чем сразу читать по индексу первые записи.. не надо. Если мои аргументы идут мимо кассы, то примите во внимание что оракл тоже так считает. Когда ему дают правильный индекс , то он с него слазит крайне неохотно. Даже когда ему говоришь чтоб оптимайзил под выдачу всех записей а не первых, он совершенно правильно продолжает юзать индекс.
Но все-таки... какой индекс будет ему правильным для нестринговых полей?
...
Рейтинг: 0 / 0
13 сообщений из 38, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle Optimizer
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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