Проблема настройки SQL - PullRequest
       5

Проблема настройки SQL

3 голосов
/ 01 декабря 2010

У меня есть запрос:

select count(1) CNT
from file_load_params a
where a.doc_type = (select b.doc_type
                    from file_load_header b
                    where b.indicator = 'XELFASI')
 order by a.line_no

Какой план объяснения:

-----------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name                | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                     |     1 |     7 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE               |                     |     1 |     7 |            |          |
|*  2 |   TABLE ACCESS FULL           | FILE_LOAD_PARAMS    |    15 |   105 |     2   (0)| 00:00:01 |
|   3 |    TABLE ACCESS BY INDEX ROWID| FILE_LOAD_HEADER    |     1 |    12 |     1   (0)| 00:00:01 |
|*  4 |     INDEX UNIQUE SCAN         | FILE_LOAD_HEADER_UK |     1 |       |     0   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------

Я подумал, что мог бы оптимизировать этот запрос и написать этот:

select count(1) CNT
from file_load_params a,file_load_header b
where  b.indicator = 'XELFASI'
and a.doc_type = b.doc_type
order by a.line_no

План объяснения:

-----------------------------------------------------------------------------------------------------
| Id  | Operation                     | Name                | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |                     |     1 |    19 |     3   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE               |                     |     1 |    19 |            |          |
|   2 |   NESTED LOOPS                |                     |    15 |   285 |     3   (0)| 00:00:01 |
|   3 |    TABLE ACCESS BY INDEX ROWID| FILE_LOAD_HEADER    |     1 |    12 |     1   (0)| 00:00:01 |
|*  4 |     INDEX UNIQUE SCAN         | FILE_LOAD_HEADER_UK |     1 |       |     0   (0)| 00:00:01 |
|*  5 |    TABLE ACCESS FULL          | FILE_LOAD_PARAMS    |    15 |   105 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------

Это хорошо?Я думаю, что нет, но я ожидал лучшего результата ... Есть идеи?

Ответы [ 3 ]

3 голосов
/ 01 декабря 2010

Из планов объяснения они представляются крошечными таблицами, и стоимость запроса незначительна.Как долго они бегут и как быстро они нужны?

Но удалите ORDER BY.Поскольку вы выбираете агрегат COUNT из одной строки, это бессмысленно.

2 голосов
/ 01 декабря 2010

Одной из возможных оптимизаций, которые я вижу из вашего плана объяснения, является

TABLE ACCESS FULL           | FILE_LOAD_PARAMS  

Кажется, это указывает на то, что таблица file_load_params, возможно, не имеет индекса для doc_type

в этом случае вы можете добавить индекс для doc_type.Если у вас уже есть индексы, вы можете опубликовать схему таблицы для file_load_params

1 голос
/ 01 декабря 2010

Результат не совпадает для двух запросов.Оператор IN автоматически также применяет DISTINCT к внутреннему запросу.И в этом случае это, вероятно, не тот ключ, к которому вы присоединяетесь (если он есть, то сделайте его уникальным ключом), поэтому его нельзя оптимизировать.

Что касается оптимизации запроса, то действуйте как InSane.говорит, добавить индекс на Doc_Type в FILE_LOAD_PARAMS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...