Оптимизация distinct

Serg_2004

Новичок
Оптимизация distinct

Hi all !!!

есть горизонтальная таблица, содержащая 9 полей,
7 полей содержат некую инфу , 2 последних год и месяц.

мне нужно выбрать уникальные года и количество уникальных месяцев в этом году.
Делаю запрос:

SELECT distinct(year), count(distinct(mon)) from table group by year

этот запрос выполняется 2,5 секунды (в базе ~600 000 записей)
результат запроса:


2004 12
2005 12
2006 2

помоему это долго ... для такой выборки, делал индекс по полям year и mon - НИКАКОГО изменения по скорости выборки не получил.
Мож кто подскажет как оптимизировать выборку или построить правильно индексы

Спасибо !
 

Falc

Новичок
Во-первых не понятно зачем: distinct(year) ?

Во-вторых план запрос в студию.
 

Serg_2004

Новичок
Во-первых : в принципе distinct(year) можно не писать а написать просто year (т.к.) group by есть (на время запроса это не влияет)

Во-вторых: ...план запрос ??? (что имелось в виду)
 

Falc

Новичок
Serg_2004
>>Во-вторых: ...план запрос ??? (что имелось в виду)

Имеется ввиду план исполнения запроса, например его умеет показывать PL/SQL Developer или SQL plus.
 

Serg_2004

Новичок
STATEMENT_ID OPERATION OPTIONS OBJECT_NODE PARTITION_START OBJECT_INSTANCE

C7D1383B SELECT STATEMENT -
C7D1383B SORT GROUP BY
C7D1383B TABLE ACCESS FULL 1


=====>


OPTIMIZER PARTITION_STOP SEARCH_COLUMNS PARTITION_ID ID OTHER PARENT_ID POSITION

CHOOSE 0
1 0 1
2 1 1


вро усё
 

Falc

Новичок
Настройка AUTOTRACE в SQL*Plus
Средство AUTOTRACE
можно настроить несколькими способами. Я практикую следующую последовательность
действий:
• перехожу в каталог [ORACLE_HOME]/rdbms/admin;
• регистрируюсь в SQL*Plus от имени SYSTEM;
• запускаю сценарий @utlxplan;
• выполняю оператор CREATE PUBLIC SYNONYM PLAN_TABLE FOR PLAN_TABLE;
• выполняю оператор GRANT ALL ON PLAN_TABLE TO PUBLIC.
Если хотите, можете заменить GRANT ... ТО PUBLIC оператором GRANT для конкретного пользователя. Предоставляя привилегию роли PUBLIC, вы фактически разрешаете трассировать операторы в SQL*Pius любому пользователю. По-моему это неплохо — пользователи могут не устанавливать собственные таблицы планов. Альтернатива этому — запуск сценария @UTLXPLAN в каждой схеме, где необходимо использовать
средство AUTOTRACE.
Следующий шаг — создание и предоставление всем роли PLUSTRACE:
• переходим в каталог [ORACLE_HOME]/sqlplus/admin;
• регистрируемся в SQL*Plus от имени SYS;
• запускаем сценарий @plustrce;
• выполняем оператор GRANT PLUSTRACE TO PUBLIC.
И в этом случае, если хотите, можете заменить PUBLIC в операторе GRANT именем конкретного пользователя.
Т.Кайт "Oracle для профессионалов" том 1.
 

Serg_2004

Новичок
в предидущем посте получилось криво, повторю:

STATEMENT_ID
C7D1383B
C7D1383B
C7D1383B

OPERATION
SELECT STATEMENT
SORT
TABLE ACCESS

OPTIONS
пусто
GROUP BY
FULL

OBJECT_NODE
пусто

PARTITION_START
пусто

OBJECT_INSTANCE
пусто
пусто
1

OPTIMIZER
CHOOSE
пусто
пусто

ID
0
1
2

PARENT_ID
пусто
0
1

POSITION
пусто
1
1

-~{}~ 24.03.06 17:40:

только что всё это значит ?
 

Falc

Новичок
Сори, не все запостил, вот продолжение:
Управление отчетом о плане выполнения
Управлять информацией, выдаваемой в отчете о плане выполнения, можно с помощью установки системной переменной AUTOTRACE.

SET AUTOTRACE OFF - Отчет AUTOTRACE не генерируется. Так
происходит по умолчанию.
SET AUTOTRACE ON EXPLAIN - В отчете AUTOTRACE показывается только выбранный оптимизатором план.
SET AUTOTRACE ON STATISTICS - В отчете AUTOTRACE показывается только статистическая информация о выполнении
оператора SQL
SET AUTOTRACE ON - В отчет AUTOTRACE включается как выбранный оптимизатором план, так и статистическая
информация о выполнении оператора SQL.
SET AUTOTRACE TRACEONLY - Аналогично SET AUTOTRACE ON, но подавляет выдачу результатов выполнения запроса.
Т.Кайт "Oracle для профессионалов" том 1.

Наиболее удобным вариантом является SET AUTOTRACE ON

Т.е. нужно в SQL plus настроить трасировку, если она не настроена, установить переменую SET AUTOTRACE ON и выполнить запрос, результат запостить сюда.
 

Serg_2004

Новичок
мой предидущий пост это результат EXPLAIN в SQL plus,
только там таблица была а запостил это в извращённом виде )))
 

Falc

Новичок
Serg_2004
Нужно сделать, то что я написал в последней фразе своего предыдущего поста.
 

Serg_2004

Новичок
сделал :
Следующий шаг — создание и предоставление всем роли PLUSTRACE:
• переходим в каталог [ORACLE_HOME]/sqlplus/admin;
• регистрируемся в SQL*Plus от имени SYS;
• запускаем сценарий @plustrce;
• выполняем оператор GRANT PLUSTRACE TO PUBLIC.
только вместо PUBLIC вставил своего юзера.
где устанавливается AUTOTRACE в SQL*Plus не нашёл, при выполнении запроса результа трассировки нет.
Если нажать на кнопку "Explain Plan tool" - появляется окно с моим запросом и предложение создать таблицу SQLN_EXPLAIN_plan её результат я пытался нарисовать постом выше.

...чё-то я наверно не то делаю ((
 

Falc

Новичок
Serg_2004
>>где устанавливается AUTOTRACE в SQL*Plus не нашёл

Просто пишешь в строке ввода:
SET AUTOTRACE ON
 

Falc

Новичок
Serg_2004
>>SQL plus сказал : command ignored.

Заначит что-то не верно сделано при настройке.


Должно быть примерно следующее:

Код:
SQL> set autotrace on
SQL> select * from dual;

D
-
X


План выполнения
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   TABLE ACCESS (FULL) OF 'DUAL'




Статистика
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          3  consistent gets
          0  physical reads
          0  redo size
        326  bytes sent via SQL*Net to client
        491  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
 
Сверху