Есть партиционированная таблица 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
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
Был BY RANGE :)
ZV> И кто гарантирует, что в партишине всего 1 месяц?
Бизнес-логика, но, разумеется, более подходящим является BY LIST
ZV> Возможно это и будет работать для List, если подобный случай (когда в
ZV> каждой партиции одно значение) специальным образом обрабатывается (лень
ZV> проверять)...
К сожалению, и для BY LIST не заработало :(
--
dannis
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
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
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
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)
Но надо ли это нашему народу?
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