|
Oracle Optimizer
|
|||
---|---|---|---|
#18+
Первое утверждение неверное Остальное на примере: Код: 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.
Попробуйте пошагово, если получится другой результат, я буду сильно удивлен. Видимо у меня Оракл лучше ;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2002, 16:51 |
|
Oracle Optimizer
|
|||
---|---|---|---|
#18+
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) У вас нет доп сортировки. У меня есть. И статистика выполнения показывает что таки да он результат отсортировал прежде чем мне выдать. Откель у нас такая разница в выполнениях? ЗЫ. Кстати что вы имели в виду под "Первое утверждение неверное"? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2002, 17:02 |
|
Oracle Optimizer
|
|||
---|---|---|---|
#18+
Да, вот этого я пока понять не могу :( А что говорит select * from v$version; ?? Утверждение относительно сортировки. Единств. проблема может возникнуть если у таблицы задран HWM. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2002, 17:12 |
|
Oracle Optimizer
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Сравниваем время и убеждаемся, что во втором случае время 0.07 сек не есть время полной работы запроса, а только время до получения первый строк выборки . У вас же в момент тестирования "fetch all records" не стоял, did it? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2002, 17:40 |
|
Oracle Optimizer
|
|||
---|---|---|---|
#18+
Да, вот этого я пока понять не могу :( А что говорит 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? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2002, 17:47 |
|
Oracle Optimizer
|
|||
---|---|---|---|
#18+
Сравниваем время и убеждаемся, что во втором случае время 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) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2002, 18:02 |
|
Oracle Optimizer
|
|||
---|---|---|---|
#18+
Для VSKV. Дык беда в чем - когда мы видим первый результат, то выкладываем его в сетку, и пользователь счаслив, так как он ждал всего 0.07 секунды. Ежели мы работаем 1.5 секунды, то пользователь уже ждет и нервничает. В любом случае финальный фетч на клиента идет одинаково долго, но он то нам НЕ НУЖЕН СРАЗУ ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2002, 18:11 |
|
Oracle Optimizer
|
|||
---|---|---|---|
#18+
Эа, ну нельзя же так ставить вопросы... Если вам нужно это в сеть, юзверю, то так и декларируйте, что вам нужно "побыстрее добыть первые записи, а потом, как получится". Тогда вам в первых же строках документации (глава про оптимизатор) скажут, что вам нужны FIRST_ROWS. Хотя странно, обычно CBO под FIRST_ROWS и оптимизирует. У вас случаем нигде не стоит чего-нибудь типа set optimizer mode=all_rows ? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2002, 19:45 |
|
Oracle Optimizer
|
|||
---|---|---|---|
#18+
Эа, ну нельзя же так ставить вопросы... Если вам нужно это в сеть, юзверю, то так и декларируйте, что вам нужно "побыстрее добыть первые записи, а потом, как получится". Тогда вам в первых же строках документации (глава про оптимизатор) скажут, что вам нужны FIRST_ROWS. Хотя странно, обычно CBO под FIRST_ROWS и оптимизирует. У вас случаем нигде не стоит чего-нибудь типа set optimizer mode=all_rows? Конечно сорри, но... вроде ж не раз было сказано что запрос запускался в том числе и с прямым указанием индекса и с хинтом FIRST_ROWS . Беда в том что оракл на эти указания ... с высокой колокольни короче. Вопрос был именно в том что именно могло привести к такому его поведению. set optimizer mode завтра гляну. Но как по моему это не должно оказывать влияние на реакцию на прямые хинты в запросе. Я неправ? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.09.2002, 20:10 |
|
Oracle Optimizer
|
|||
---|---|---|---|
#18+
Может проблема в параметре 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. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2002, 02:45 |
|
Oracle Optimizer
|
|||
---|---|---|---|
#18+
NLS_SORT очень близко к теме.По крайней мере очень похоже. Я не могу взять в толк две вещи. 1. Почему этот параметр должен влиять на ордер по нумерик полям. 2. Зачем собственно ALTER SESSION NLS_SORT=.... По второму пункту. Если индекс уже построен по каким-то правилам, то как изменение флага внутри сессии может повлиять на то можно использовать этот индекс или нет? Ну и напоследок вопрос бывалым. Как обычно вы настраиваете все эти NLS ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2002, 11:00 |
|
Oracle Optimizer
|
|||
---|---|---|---|
#18+
К GDI Таки помогло ))) Но все же если мы имеем сорт по какому-то number-у, отличному от первичного ключа, но так же с индексом, то проблема остается. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2002, 13:29 |
|
Oracle Optimizer
|
|||
---|---|---|---|
#18+
Огромное человеческое спасибо GDI. Без всяких демагогий ткнул носом туда куда нужно. Теперь маленькое промежуточное резюме. Суть проблемы сводилась к тому что NLS_SORT сессии не совпадал с NLS_SORT индекса. Посему оракл просто был уверен, что индекс для ордера не подходит никак. Выхода два. Либо для сессии установить NLS_SORT=BINARY, либо создать индекс с NLS_SORT=Russian . После чего Оракл без всяких дополнительных хинтов начинает юзать этот индекс в полный рост. Остается вопрос с нестринговыми полями. Для всяких интегеров этот финт не проходит. К тому же мне совершенно неясно почему NLS_SORT вообще должен влиять на не стринговые поля. Куды глядеть еще? ЗЫ. Срывать мне крышу сказками о том что вычитать хаотически все и потом отсортировать, будет дешевле чем сразу читать по индексу первые записи.. не надо. Если мои аргументы идут мимо кассы, то примите во внимание что оракл тоже так считает. Когда ему дают правильный индекс , то он с него слазит крайне неохотно. Даже когда ему говоришь чтоб оптимайзил под выдачу всех записей а не первых, он совершенно правильно продолжает юзать индекс. Но все-таки... какой индекс будет ему правильным для нестринговых полей? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.09.2002, 10:49 |
|
|
start [/forum/topic.php?fid=52&gotonew=1&tid=1993055]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
27ms |
get topic data: |
9ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 260ms |
total: | 388ms |
0 / 0 |