Кладовые данных. Rollup

Flukky
Дата: 06.06.2006 23:11:33
Ознакамливаюсь с написанием запросов для кладовых данных.
С CUBE разобрался, а вот с Grouping и Rollup не могу понять.

Что делает сочитание функций grouping и rollup?

SELECT Time, Region, Department, SUM(Profit) AS Profit, 
  GROUPING (Time) as T, 
  GROUPING (Region) as R, 
  GROUPING (Department) as D
  FROM Sales
GROUP BY ROLLUP (Time, Region, Department)
andrey_anonymous
Дата: 06.06.2006 23:58:16
GROUPING и прочие GROUPING_ID позволяют Вам понять, к какой части свертки относится конкретная строка, т.е. понять, какие именно группировки дали текущий результат.
Сам результат образуется классически - посредством групповых функций.
Что-то путанно объясняю...
Что такое rollup?

пусть есть некая выборка R: (select rownum r1, -rownum r2 from dual connect by level < 5);

Тогда

-- запрос
SQL> with R as (select rownum r1, -rownum r2 from dual connect by level < 5)
select grouping(r1) gr1, grouping(r2) gr2, grouping_id(r1,r2) g_id
,r1,r2,sum(r1) sum_r1, sum(r2) sum_r2 from R
group by rollup(r1,r2)
order by 1,2,3
;

  GR1   GR2  G_ID    R1    R2 SUM_R SUM_R
----- ----- ----- ----- ----- ----- -----
    0     0     0     1    -1     1    -1
    0     0     0     2    -2     2    -2
    0     0     0     4    -4     4    -4
    0     0     0     3    -3     3    -3
    0     1     1     1           1    -1
    0     1     1     2           2    -2
    0     1     1     4           4    -4
    0     1     1     3           3    -3
    1     1     3                10   -10

9 rows selected

-- эквивалентен запросу
SQL> with R as (select rownum r1, -rownum r2 from dual connect by level < 5)
select 0 gr1, 0 gr2, 0 g_id, r1, r2, r1 sum_r1, r2 sum_r2 from R
union all
select 0 gr1, 1 gr2, 1 g_id, r1, NULL as r2, r1 sum_r1, sum(r2) sum_r2 from R group by r1
union all
select 1 gr1, 1 gr2, 3 g_id, NULL as r1, NULL as r2, sum(r1) sum_r1, sum(r2) sum_r2 from R;

  GR1   GR2  G_ID    R1    R2 SUM_R SUM_R
----- ----- ----- ----- ----- ----- -----
    0     0     0     1    -1     1    -1
    0     0     0     2    -2     2    -2
    0     0     0     3    -3     3    -3
    0     0     0     4    -4     4    -4
    0     1     1     1           1    -1
    0     1     1     2           2    -2
    0     1     1     3           3    -3
    0     1     1     4           4    -4
    1     1     3                10   -10

9 rows selected

SQL> 
andrey_anonymous
Дата: 07.06.2006 00:01:37
Тьфу, блин.
Эквивалентом rollup будет такой запрос:
with R as (select rownum r1, -rownum r2 from dual connect by level < 5)
select 0 gr1, 0 gr2, 0 g_id, r1, r2, r1 sum_r1, r2 sum_r2 from R group by r1,r2
union all
select 0 gr1, 1 gr2, 1 g_id, r1, NULL as r2, r1 sum_r1, sum(r2) sum_r2 from R group by r1
union all
select 1 gr1, 1 gr2, 3 g_id, NULL as r1, NULL as r2, sum(r1) sum_r1, sum(r2) sum_r2 from R;
dmidek
Дата: 07.06.2006 00:28:55
Мне очень понравилась эта статья.
ИМХО очень просто и наглядно

Introduction ROLLUP, CUBE and GROUPING
Flukky
Дата: 07.06.2006 12:30:52
Больше спасибо!
Разобрался
Flukky
Дата: 07.06.2006 12:36:15
Хотел спросить про Bitmap инднексы для кладовых. В таблице фактов у меня 180 тыс. записей. В дименсионных таблицах есть primary key, в таблице фактов - foreign key.
После создания bitmap индекса время выполнения запроса не изменилось (от 1 до 3 сек., взависимости от сложности запроса). Но ведь теортерически после добавления bitmap индекса время должно было уменьшиться? Из этого следует, что при таком маленьком объёме данных bitmap индексы бесполезны?
Владимор Конев
Дата: 07.06.2006 12:42:03
Flukky
Хотел спросить про Bitmap инднексы для кладовых. В таблице фактов у меня 180 тыс. записей. В дименсионных таблицах есть primary key, в таблице фактов - foreign key.
После создания bitmap индекса время выполнения запроса не изменилось (от 1 до 3 сек., взависимости от сложности запроса). Но ведь теортерически после добавления bitmap индекса время должно было уменьшиться? Из этого следует, что при таком маленьком объёме данных bitmap индексы бесполезны?
А ты уверен, что Оракл использует твои индексы?
Кроме того, индексы и самый эффективный способ получения результата - вещи разные и в общем случае взаимонезависимые.
Sergey M
Дата: 07.06.2006 12:44:46
Bitmap индексы полезны в случае когда в индексированном поле очень мало различных значений. Во всех остальных случаях, они скорее вредны, так например при изменении одной строки с некоторым значением, блокируются все остальные строки, содержащие это же значение в этом поле.
В общем, RTFM Using Bitmap Indexes
Flukky
Дата: 07.06.2006 12:48:48
Sergey M, это мы знаем. Тут именно такая ситуация, когда они полезны.

Владимор Конев
А ты уверен, что Оракл использует твои индексы?

Теперь уверен, что НЕ ИСПОЛЬЗУЕТ. Если в запросе явно указать использовать bitmap индекс, то запрос становиться намного быстрее (доли секунды). Но сам оптимизатор его не берёт, без подсказки.
Владимор Конев
Дата: 07.06.2006 12:50:37
Sergey M
Bitmap индексы полезны в случае когда в индексированном поле очень мало различных значений. Во всех остальных случаях, они скорее вредны, так например при изменении одной строки с некоторым значением, блокируются все остальные строки, содержащие это же значение в этом поле.
В общем, RTFM Using Bitmap Indexes
У человека хранилище данных. Думаю ему изменения информации - вещь не актуальная.
А вообще, вот статья на русском про битмап-индексы:
Тынц