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

Откуда:
Сообщений: 888
пожалуйста объясните, как избавится от сортировки в плане.
select s0.task_id
from (select s1.task_id, s1.complexity, s1.due_date
      from job_task s1
      where 1 = 1
      and s1.state = 'ENABLED'
      and not exists ( select 1
            from job_cond r2, job_task s2
            where r2.task_id = s1.task_id
            and s2.task_id = r2.prev_task_id
            group by s2.task_id
            having max(case when s2.state = r2.prev_task_state then 1 else 0 end) = 0
            )
      order by s1.due_date, s1.complexity
      ) s0
where rownum <= 1;
План выглядит так
Execution Plan
----------------------------------------------------------
Plan hash value: 3843032176
 
---------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |              |     1 |    13 |  4517  (34)| 00:00:55 |
|*  1 |  COUNT STOPKEY                     |              |       |       |            |          |
|   2 |   VIEW                             |              |  3009 | 39117 |  4517  (34)| 00:00:55 |
|*  3 |    SORT ORDER BY STOPKEY           |              |  3009 | 69207 |  4517  (34)| 00:00:55 |
|*  4 |     INDEX RANGE SCAN               | JOB_TASK_I01 |   150 |  3450 |     2   (0)| 00:00:01 |
|*  5 |      FILTER                        |              |       |       |            |          |
|   6 |       HASH GROUP BY                |              |     1 |    32 |     3  (34)| 00:00:01 |
|   7 |        NESTED LOOPS                |              |     2 |    64 |     2   (0)| 00:00:01 |
|*  8 |         INDEX RANGE SCAN           | JOB_COND_P   |     2 |    38 |     1   (0)| 00:00:01 |
|   9 |         TABLE ACCESS BY INDEX ROWID| JOB_TASK     |     1 |    13 |     1   (0)| 00:00:01 |
|* 10 |          INDEX UNIQUE SCAN         | JOB_TASK_PK  |     1 |       |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter(ROWNUM<=1)
   3 - filter(ROWNUM<=1)
   4 - access("S1"."STATE"='ENABLED')
       filter( NOT EXISTS (SELECT /*+ */ 0 FROM "JOB_TASK" "S2","JOB_COND" "R2" WHERE
              "R2"."TASK_ID"=:B1 AND "R2"."PREV_TASK_ID"="S2"."TASK_ID" GROUP BY "S2"."TASK_ID" HAVING
              MAX(CASE "S2"."STATE" WHEN "R2"."PREV_TASK_STATE" THEN 1 ELSE 0 END )=0))
   5 - filter(MAX(CASE "S2"."STATE" WHEN "R2"."PREV_TASK_STATE" THEN 1 ELSE 0 END )=0)
   8 - access("R2"."TASK_ID"=:B1)
  10 - access("R2"."PREV_TASK_ID"="S2"."TASK_ID")

Индекс выглядит вот так:
CREATE INDEX JOB_TASK_I01 ON JOB_TASK (STATE, TASK_ID, DUE_DATE, COMPLEXITY)
Мне не понятно, зачем оракл выполняет сортировку резултата (3) для поиска первого елемента, а не исполцзует первый найденый елемент, хотя подходящий индекс исползуется в плане.
17 фев 09, 11:29    [6827952]     Ответить | Цитировать Сообщить модератору
 Re: "Вредная" сортировка  [new]
Relogin
Member

Откуда: Abhasia
Сообщений: 594
order by s1.due_date, s1.complexity
Э... как бы сказать. Если есть указание order, что ты ожидал-то?
17 фев 09, 11:32    [6827981]     Ответить | Цитировать Сообщить модератору
 Re: "Вредная" сортировка  [new]
miksoft
Member

Откуда:
Сообщений: 38535
mikron
Мне не понятно, зачем оракл выполняет сортировку резултата (3) для поиска первого елемента, а не исполцзует первый найденый елемент, хотя подходящий индекс исползуется в плане.
См. комментарий к строке 4. Индекс используется только для выборки по s1.state = 'ENABLED', но не используется и не может быть использован для сортировки.
17 фев 09, 11:34    [6827994]     Ответить | Цитировать Сообщить модератору
 Re: "Вредная" сортировка  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
mikron
..Мне не понятно, зачем оракл выполняет сортировку резултата (3) для поиска первого елемента, а не исполцзует первый найденый елемент, хотя подходящий индекс исползуется в плане.

потому, что доктор сказал в морг
ой.. не доктор, а автор запроса и не в морг, а сортировать..
17 фев 09, 11:34    [6827996]     Ответить | Цитировать Сообщить модератору
 Re: "Вредная" сортировка  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
курить .. keep (dense_rank ..
17 фев 09, 11:37    [6828018]     Ответить | Цитировать Сообщить модератору
 Re: "Вредная" сортировка  [new]
SysOper
Member

Откуда: M
Сообщений: 9760
select min(s1.task_id)
      from job_task s1
      where 1 = 1
      and s1.state = 'ENABLED'
      and not exists ( select 1
            from job_cond r2, job_task s2
            where r2.task_id = s1.task_id
            and s2.task_id = r2.prev_task_id
            group by s2.task_id
            having max(case when s2.state = r2.prev_task_state then 1 else 0 end) = 0
            )
      GROUP BY s1.task_id
17 фев 09, 11:37    [6828019]     Ответить | Цитировать Сообщить модератору
 Re: "Вредная" сортировка  [new]
Relogin
Member

Откуда: Abhasia
Сообщений: 594
orawish
mikron
..Мне не понятно, зачем оракл выполняет сортировку резултата (3) для поиска первого елемента, а не исполцзует первый найденый елемент, хотя подходящий индекс исползуется в плане.

потому, что доктор сказал в морг
ой.. не доктор, а автор запроса и не в морг, а сортировать..

во-во
17 фев 09, 11:37    [6828022]     Ответить | Цитировать Сообщить модератору
 Re: "Вредная" сортировка  [new]
miksoft
Member

Откуда:
Сообщений: 38535
а если попробовать индекс (STATE, DUE_DATE, COMPLEXITY, TASK_ID) ?
17 фев 09, 11:39    [6828039]     Ответить | Цитировать Сообщить модератору
 Re: "Вредная" сортировка  [new]
mikron
Member

Откуда:
Сообщений: 888
@miksoft,

Спасибо, вопрос снимается. И почему я был уверен что ИД нужен рансше. вах вах вах.
17 фев 09, 11:52    [6828150]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить