Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

group by по ключам партиций

0 views
Skip to first unread message

Denis Rudakov

unread,
May 20, 2004, 6:52:50 AM5/20/04
to
Hi All!

Есть партиционированная таблица cst_result, разбита по значению mnth.

Запрос вида
SELECT SUM(cst_value) FROM cst_result WHERE mnth='...' выполняется ~3 сек.

Запрос же
SELECT mnth, SUM(cst_value) FROM cst_result GROUP BY mnth выполняется ~200
сек, причем партиций всего 13.
План выполнения данного запроса содержит SORT GROUP BY, но в данном случае по
идее достаточно просто просуммировать все строки каждой партиции, т.е.
фактически выполнить 1-й запрос 13 раз, с общим временем выполнения примерно
3*13=99 сек.

Как заставить оракул делать именно так? Пробовал хинт no_sort(cst_result), не
помогло.

--
dannis

Zhirenkov Vitaly

unread,
May 20, 2004, 7:17:45 AM5/20/04
to
Привет!

Denis Rudakov пишет:
DR> Hi All!

DR> Есть партиционированная таблица cst_result, разбита по значению
mnth.

DR> Запрос вида
DR> SELECT SUM(cst_value) FROM cst_result WHERE mnth='...' выполняется
~3 сек.

DR> Запрос же
DR> SELECT mnth, SUM(cst_value) FROM cst_result GROUP BY mnth
выполняется ~200
DR> сек, причем партиций всего 13.
DR> План выполнения данного запроса содержит SORT GROUP BY, но в данном
случае по
DR> идее достаточно просто просуммировать все строки каждой партиции,
т.е.
DR> фактически выполнить 1-й запрос 13 раз, с общим временем выполнения
примерно
DR> 3*13=99 сек.

Я так и не понял какой метод партицирования?
И кто гарантирует, что в партишине всего 1 месяц?
Возможно это и будет работать для List, если подобный случай (когда в
каждой партиции одно значение) специальным образом обрабатывается (лень
проверять)...

--
Zhirenkov Vitaly
Oracle9i PL/SQL Developer / DBA Certified Associate
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Denis Rudakov

unread,
May 20, 2004, 9:15:21 AM5/20/04
to
ZV> Я так и не понял какой метод партицирования?

Был BY RANGE :)

ZV> И кто гарантирует, что в партишине всего 1 месяц?

Бизнес-логика, но, разумеется, более подходящим является BY LIST

ZV> Возможно это и будет работать для List, если подобный случай (когда в
ZV> каждой партиции одно значение) специальным образом обрабатывается (лень
ZV> проверять)...

К сожалению, и для BY LIST не заработало :(

--
dannis

Andrey Maximenko

unread,
May 20, 2004, 9:36:56 AM5/20/04
to
Hello, Denis!

DR> Запрос вида
DR> SELECT SUM(cst_value) FROM cst_result WHERE mnth='...' выполняется ~3
DR> сек.

А сколько выполняется SELECT SUM(cst_value) FROM cst_result (по всей базе)?

With best regards, Andrey Maximenko.
пишите сюда: AndreyMx на mail на ru


Denis Rudakov

unread,
May 20, 2004, 10:19:57 AM5/20/04
to
Thu May 20 2004 17:36, Andrey Maximenko wrote to Denis Rudakov:

AM> From: "Andrey Maximenko" <maxi...@zaporizhstal.com>

AM> Hello, Denis!

DR>> Запрос вида
DR>> SELECT SUM(cst_value) FROM cst_result WHERE mnth='...' выполняется ~3
DR>> сек.

AM> А сколько выполняется SELECT SUM(cst_value) FROM cst_result (по всей
AM> базе)?

Около 40 сек.

--
dannis

Andrey Maximenko

unread,
May 24, 2004, 4:09:00 AM5/24/04
to
Hello, Denis!

DR>>> Запрос вида
DR>>> SELECT SUM(cst_value) FROM cst_result WHERE mnth='...' выполняется ~3
DR>>> сек.

AM>> А сколько выполняется SELECT SUM(cst_value) FROM cst_result (по всей
AM>> базе)?

DR> Около 40 сек.

Денис, у тебя что-нибудь получилось?
У меня та же фигня происходит:

SELECT SUM(stbux)
FROM RASCHET - 4 сек


SELECT god, SUM(stbux)
FROM RASCHET
GROUP BY god - 40 сек

годов всего 2 - 2003 и 2004 (партиций прописано больше).
Партиции по годам
Индексы тоже по партициям, но в других tablespace

Andrey Maximenko

unread,
May 24, 2004, 4:15:36 AM5/24/04
to
Hello, Andrey!

You wrote to Denis Rudakov on Mon, 24 May 2004 08:09:00 +0000 (UTC):

DR>>>> Запрос вида
DR>>>> SELECT SUM(cst_value) FROM cst_result WHERE mnth='...' выполняется

DR>>>> ~3 сек.

AM>>> А сколько выполняется SELECT SUM(cst_value) FROM cst_result (по всей
AM>>> базе)?

DR>> Около 40 сек.

AM> Денис, у тебя что-нибудь получилось?
AM> У меня та же фигня происходит:

AM> SELECT SUM(stbux)
AM> FROM RASCHET - 4 сек

AM> SELECT god, SUM(stbux)
AM> FROM RASCHET
AM> GROUP BY god - 40 сек

AM> годов всего 2 - 2003 и 2004 (партиций прописано больше).
AM> Партиции по годам
AM> Индексы тоже по партициям, но в других tablespace

AM> With best regards, Andrey Maximenko.
AM> пишите сюда: AndreyMx на mail на ru

Такая фигня с подзапросом работает всего 8 сек:
SELECT a,
(SELECT SUM(stbux) FROM RASCHET WHERE god=a)
FROM (SELECT ROWNUM+2002 a FROM all_objects WHERE ROWNUM<4)
Но надо ли это нашему народу?

Denis Rudakov

unread,
May 24, 2004, 7:50:10 AM5/24/04
to
Mon May 24 2004 12:15, Andrey Maximenko wrote to Andrey Maximenko:


AM> Такая фигня с подзапросом работает всего 8 сек:
AM> SELECT a,
AM> (SELECT SUM(stbux) FROM RASCHET WHERE god=a)
AM> FROM (SELECT ROWNUM+2002 a FROM all_objects WHERE ROWNUM<4)
AM> Hо надо ли это нашему народу?

Я оформил в виде plsql блока:

DECLARE
CURSOR c(m DATE) IS SELECT SUM(cst_value) FROM cst_result WHERE mnth=m;
mn DATE;
s NUMBER;
BEGIN
mn:=TO_DATE('01.01.2003','dd.mm.yyyy');
WHILE mn <= TO_DATE('01.12.2003','dd.mm.yyyy')
LOOP
OPEN c(mn);
FETCH c INTO s;
CLOSE c;
dbms_output.put_line(mn||' '||s);
mn:=ADD_MONTHS(mn,1);
END LOOP;
END;

Выполняется ~50 сек.
в то время как
SELECT SUM(cst_value) FROM cst_result WHERE mnth='...' примерно 3.5 сек.


--
dannis

0 new messages