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

Откуда: Москва
Сообщений: 73
Приветствую Вас, знатоки Oracle!

Возник такой вроде не сложный вопрос: что лучше использовать в запросе (что быстрее) - DISTINCT или GROUP BY, чтобы получить список уникальных значений?
15 мар 07, 13:15    [3901963]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее DISTINCT или GROUP BY  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116152
Если мне нужны уникальные значения - я делаю DISTINCT.
Если мне нужно группировать значения - я делаю GROUP BY.
15 мар 07, 13:16    [3901976]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее DISTINCT или GROUP BY  [new]
Бабичев Сергей
Member

Откуда:
Сообщений: 2498
С точки зрения здравого смысла DISTINCT нужно использовать именно для устранения дубликатов в результирующем наборе данных.
GROUP BY же нужно использовать для вычисления агрегатов.


Другое дело, если задача заключается именно в поиске дубликатов - тогда GROUP BY будет само то.
15 мар 07, 13:18    [3901988]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее DISTINCT или GROUP BY  [new]
oracletbm
Member

Откуда: Москва
Сообщений: 73
dmidek
Если мне нужны уникальные значения - я делаю DISTINCT.
Если мне нужно группировать значения - я делаю GROUP BY.


----------------------------------------------

Если есть достаточно большая выборка из тысяч записей неуникальных, то использование DISTINCT всегда связано с временными задержками,
вот и интересно может при группировке Oracle как то более оптимально подходит к вопросу отбора записей.
15 мар 07, 13:20    [3902006]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее DISTINCT или GROUP BY  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
А провести эксперимент и сообщить о результатах слабО? :-)
15 мар 07, 13:23    [3902027]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее DISTINCT или GROUP BY  [new]
oracletbm
Member

Откуда: Москва
Сообщений: 73
SQL*Plus
А провести эксперимент и сообщить о результатах слабО? :-)


--------------------------------------------------------

Пожалуйста:

1 вариант - с DISTINCT
SQL> SELECT /*+ ALL_ROWS ORDERED */ DISTINCT pt.kod_tov
  2                 FROM pri_main pm, pri_tov pt, pri_tov_sbs pts
  3                WHERE pm.n_skl   = 6000
  4                  AND pm.s_post  = 2
  5                  AND pm.tip_pri = DECODE(pm.n_skl,6000,1,pm.tip_pri)
  6                  AND pt.post    = pm.kod
  7                  AND pt.s_post  = 2
  8                  AND NVL(pt.cen_post,0)>0
  9                  AND NVL(pt.kol_ed,0)  >0
 10                  AND pt.kod_str = pts.kod_str (+)
 11                  AND NVL(pts.sbs_date,pm.data_s) BETWEEN to_date('01.01.2006','DD.MM.YYYY') AND 
to_date('31.01.2007','DD.MM.YYYY');

11892 rows selected.

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: ALL_ROWS (Cost=24 Card=62 Bytes=4836)

   1    0   SORT (UNIQUE) (Cost=24 Card=62 Bytes=4836)
   2    1     FILTER
   3    2       HASH JOIN (OUTER)
   4    3         HASH JOIN (Cost=18 Card=62 Bytes=4216)
   5    4           TABLE ACCESS (BY INDEX ROWID) OF 'PRI_MAIN' (Cost=4 Card=62 Bytes=1798)
   6    5             INDEX (RANGE SCAN) OF 'PRI_MAIN_IDX_026' (NON-UNIQUE) (Cost=2 Card=248)
   7    4           TABLE ACCESS (BY INDEX ROWID) OF 'PRI_TOV' (Cost=13 Card=1901 Bytes=74139)
   8    7             INDEX (RANGE SCAN) OF 'PRI_TOV_IDX_001' (NON-UNIQUE) (Cost=6 Card=29)
   9    3         TABLE ACCESS (FULL) OF 'PRI_TOV_SBS' (Cost=1 Card=7 Bytes=70)

Statistics
----------------------------------------------------------
         28  recursive calls
          0  db block gets
    1679375  consistent gets
      41833  physical reads
          0  redo size
     204189  bytes sent via SQL*Net to client
       9215  bytes received via SQL*Net from client
        794  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
      11892  rows processed


2 вариант с GROUP BY
SQL> SELECT /*+ ALL_ROWS ORDERED */
  2                      pt.kod_tov
  3                 FROM pri_main pm, pri_tov pt, pri_tov_sbs pts
  4                WHERE pm.n_skl   = 6000
  5                  AND pm.s_post  = 2
  6                  AND pm.tip_pri = DECODE(pm.n_skl,6000,1,pm.tip_pri)
  7                  AND pt.post    = pm.kod
  8                  AND pt.s_post  = 2
  9                  AND NVL(pt.cen_post,0)>0
 10                  AND NVL(pt.kol_ed,0)  >0
 11                  AND pt.kod_str = pts.kod_str (+)
 12                  AND NVL(pts.sbs_date,pm.data_s) BETWEEN to_date('01.01.2006','DD.MM.YYYY') AND to_date('31.01.2006','DD.MM.YYYY')
 13                GROUP BY pt.kod_tov;

1840 rows selected.

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: ALL_ROWS (Cost=24 Card=62 Bytes=4836)
   1    0   SORT (GROUP BY) (Cost=24 Card=62 Bytes=4836)
   2    1     FILTER
   3    2       HASH JOIN (OUTER)
   4    3         HASH JOIN (Cost=18 Card=62 Bytes=4216)
   5    4           TABLE ACCESS (BY INDEX ROWID) OF 'PRI_MAIN' (Cost=4 Card=62 Bytes=1798)
   6    5             INDEX (RANGE SCAN) OF 'PRI_MAIN_IDX_026' (NON-UNIQUE) (Cost=2 Card=248)
   7    4           TABLE ACCESS (BY INDEX ROWID) OF 'PRI_TOV' (Cost=13 Card=1901 Bytes=74139)
   8    7             INDEX (RANGE SCAN) OF 'PRI_TOV_IDX_001' (NON-UNIQUE) (Cost=6 Card=29)
   9    3         TABLE ACCESS (FULL) OF 'PRI_TOV_SBS' (Cost=1 Card=7 Bytes=70)

Statistics
----------------------------------------------------------
         28  recursive calls
          0  db block gets
    1679375  consistent gets
      41903  physical reads
          0  redo size
      30608  bytes sent via SQL*Net to client
       1845  bytes received via SQL*Net from client
        124  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
       1840  rows processed

автор
Как видно различия в плане в секции
SORT (UNIQUE) и SORT (GROUP BY) 

Какие выводы? Может какой хинт имеется для ускорения ?
15 мар 07, 13:48    [3902235]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее DISTINCT или GROUP BY  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18347
oracletbm
1 вариант - с DISTINCT
11892 rows selected.

2 вариант с GROUP BY
1840 rows selected.

[quot автор]Как видно различия

Как видно, мощность результирующего множества различается почти на порядок, что делает сравнение времени выполнения бессмысленным.
15 мар 07, 13:53    [3902293]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее DISTINCT или GROUP BY  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8131
andrey_anonymous
oracletbm
1 вариант - с DISTINCT
11892 rows selected.

2 вариант с GROUP BY
1840 rows selected.

[quot автор]Как видно различия

Как видно, мощность результирующего множества различается почти на порядок, что делает сравнение времени выполнения бессмысленным.
Все от того, что в первом случае было
AND to_date('31.01.2007','DD.MM.YYYY');
а во втором
AND to_date('31.01.2006','DD.MM.YYYY');
15 мар 07, 13:58    [3902333]     Ответить | Цитировать Сообщить модератору
 Re: Что быстрее DISTINCT или GROUP BY  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18347
SQL*Plus
Все от того, что

А это неважно - условия эксперимента не выдержаны, прямое сравнение времени выполнения смысла не имеет.
15 мар 07, 14:16    [3902511]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить