уменьшение cost в плане не дает уменьшение времени

iмеханик
Дата: 30.11.2009 16:00:23
подскажите куда копать - смотрю план первый раз:
Elapsed: 00:00:14.64

Execution Plan
----------------------------------------------------------
Plan hash value: 3958999461

-------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1479 | 232K| | 613 (1)| 00:00:08 |
| 1 | SORT ORDER BY | | 1479 | 232K| 7368K| 613 (1)| 00:00:08 |
|* 2 | FILTER | | | | | | |
|* 3 | TABLE ACCESS FULL | CARDS | 15148 | 2381K| | 71 (5)| 00:00:01 |
| 4 | NESTED LOOPS SEMI | | 1 | 122 | | 13 (0)| 00:00:01 |
|* 5 | TABLE ACCESS FULL | COMPANY_EVENTS | 1 | 11 | | 8 (0)| 00:00:01 |
|* 6 | TABLE ACCESS BY INDEX ROWID | COMMENTS | 3 | 333 | | 5 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | COMMENTS_EVENT_IDX | 1 | | | 1 (0)| 00:00:01 |
|* 8 | TABLE ACCESS BY INDEX ROWID| CARDS_LOG | 1 | 31 | | 5 (0)| 00:00:01 |
|* 9 | INDEX RANGE SCAN | IX_CARDS_LOG_LEGAL_NAME | 4 | | | 2 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------------------------------

вроде все ушло в сортироваку, убираю order by

Elapsed: 00:00:14.09

Execution Plan
----------------------------------------------------------
Plan hash value: 182477689

----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1479 | 232K| 71 (5)| 00:00:01 |
|* 1 | FILTER | | | | | |
|* 2 | TABLE ACCESS FULL | CARDS | 15148 | 2381K| 71 (5)| 00:00:01 |
| 3 | NESTED LOOPS SEMI | | 1 | 122 | 13 (0)| 00:00:01 |
|* 4 | TABLE ACCESS FULL | COMPANY_EVENTS | 1 | 11 | 8 (0)| 00:00:01 |
|* 5 | TABLE ACCESS BY INDEX ROWID | COMMENTS | 3 | 333 | 5 (0)| 00:00:01 |
|* 6 | INDEX RANGE SCAN | COMMENTS_EVENT_IDX | 1 | | 1 (0)| 00:00:01 |
|* 7 | TABLE ACCESS BY INDEX ROWID| CARDS_LOG | 1 | 31 | 5 (0)| 00:00:01 |
|* 8 | INDEX RANGE SCAN | IX_CARDS_LOG_LEGAL_NAME | 4 | | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------------------------

теперь не пойму, почему такая разница коста и отсутсвует по сути разница во времени и собственно на что уходит это время. все чтение идет из буферного кеша. выдрал кусок SQL который должен давать TABLE ACCESS FULL | CARDS - он тоже выдает менее чем за секунду. как определить куда уходит время ?
pravednik
Дата: 30.11.2009 16:04:57
_Alex_SMIRNOV_
Дата: 30.11.2009 16:05:11
для полной картины можно посмотреть в трассировку или даже в сырой трейс-файл... что бы увидить все ожидания...
Timm
Дата: 30.11.2009 16:22:13
iмеханик
и собственно на что уходит это время.

Ставлю на FILTER subquery.
statistics_level=all +iostats last покажут так ли это на самом деле.
iмеханик
Дата: 30.11.2009 16:27:22
FETCH #1:c=10831353,e=10584878,p=0,cr=846503,cu=0,mis=0,r=4,dep=0,og=1,tim=1230065623424641
STAT #1 id=1 cnt=5 pid=0 pos=1 obj=0 op='FILTER (cr=855583 pr=0 pw=0 time=138876 us)'
STAT #1 id=2 cnt=15149 pid=1 pos=1 obj=52472 op='TABLE ACCESS FULL CARDS (cr=305 pr=0 pw=0 time=15289 us)'
STAT #1 id=3 cnt=0 pid=1 pos=2 obj=0 op='NESTED LOOPS SEMI (cr=643243 pr=0 pw=0 time=10036826 us)'
STAT #1 id=4 cnt=13957 pid=3 pos=1 obj=52346 op='TABLE ACCESS FULL COMPANY_EVENTS (cr=575586 pr=0 pw=0 time=8813492 us)'
STAT #1 id=5 cnt=0 pid=3 pos=2 obj=52339 op='TABLE ACCESS BY INDEX ROWID COMMENTS (cr=67657 pr=0 pw=0 time=476848 us)'
STAT #1 id=6 cnt=13880 pid=5 pos=1 obj=52341 op='INDEX RANGE SCAN COMMENTS_EVENT_IDX (cr=25922 pr=0 pw=0 time=92228 us)'
STAT #1 id=7 cnt=3 pid=1 pos=3 obj=52486 op='TABLE ACCESS BY INDEX ROWID CARDS_LOG (cr=212035 pr=0 pw=0 time=594199 us)'
STAT #1 id=8 cnt=287757 pid=7 pos=1 obj=85360 op='INDEX RANGE SCAN IX_CARDS_LOG_LEGAL_NAME (cr=30294 pr=0 pw=0 time=116765 us)'

time=10036826 us - это 10 секунд ?
orawish
Дата: 30.11.2009 20:13:17
1/2 офф
я про сабж., собственно.

автор
уменьшение cost в плане не дает уменьшение времени

- на самом деле, это скорее норма, чем повод такому удивляться

(просто часто кажется иначе, потому, что имеем дело с ооочень хреновой хренью, где и кост и реакция - ну ооочень хреновые. ;)
iмеханик
Дата: 30.11.2009 20:27:53
orawish

я про сабж., собственно.

ладно, с сабжем осознал и смирился, но тут же выходит, что план рассчитывал, на одно, а в реальности произошло ровно противоположное (loop будет практически бесплатен и основная нагрузка - сортировка, а в реальности сортировка практически бесплатна все уперлось в loop)
получается смотреть планы вообще нет смысла ?
Shredder2003
Дата: 30.11.2009 21:54:00
чем проще SQL, тем выше вероятность, что план будет верным.
у меня на практике около 96% планов достаточно оптимальны, чтобы не обращать на них внимания.
andrey_anonymous
Дата: 30.11.2009 22:02:29
iмеханик
получается смотреть планы вообще нет смысла ?

Смотреть планы - имеет прямой и очень понятный смысл.
Смотреть косты - гораздо меньший.

Однако чтобы увидеть в плане не толко фигу из костов, придется немножко посамообразовываться.
тобобетобор
Дата: 30.11.2009 22:51:01
andrey_anonymous
Смотреть планы - имеет прямой и очень понятный смысл.
Смотреть косты - гораздо меньший.
Косты имеют так же прямой и очень понятный смысл. Для расчета коста есть простые и понятные формулы. В книжечке льюиса одна из таких формул(главная) пряма на обложке написана. Если неправильно рассчиталась cost - у вас бардак с настройкой инстанса (протухшая статистика и отсутствие системной статистики)