Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Нарастающий итог / 10 сообщений из 10, страница 1 из 1
14.05.2003, 10:22
    #32159191
RiliR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нарастающий итог
Может, кто нибудь знает, как ускорить выполнение запроса.
В упрощенном виде задача выглядит следующим образом.
Таблица содержит два поля id и vl (некоторое числовое значение).
Для каждого значения id нужно посчитать сумму всех vl, для которых id меньше или равно этого значения.

Код: plaintext
1.
2.
3.
4.
select p2.id, sum(p1.vl)
from table1 t1, table1 t2
where t1.id <= t2.id
group by t2.id


Проблема в том, что запрос работает порядка 20 сек., хотя таблица содержит порядка 500 записей. Правда она содержит множество других полей, но этот факт вроде не должен оказавать большого воздействия на время выполнения запроса.
Заранее спасибо.
...
Рейтинг: 0 / 0
14.05.2003, 11:14
    #32159295
RiliR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нарастающий итог
Наверное, я легкомысленно ошибся при выборе названия топика,
следовало бы написать что-то типа "Погите новичку..." :)
На самом деле я с Ораклом знаком очень и очень поверхностно.
И все же надеюсь на вашу снисходительность.
Может быть, у кого-нибудь есть какие-то косвенные мысли по поводу запроса?
...
Рейтинг: 0 / 0
14.05.2003, 11:16
    #32159299
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нарастающий итог
План выполнения запроса в студию, пожалста
...
Рейтинг: 0 / 0
14.05.2003, 11:20
    #32159306
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нарастающий итог
Какая версия Оракла? На Oracle 9.2 Enterprise Edition (может быть и на 8i) нарастающий итог:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
drop table test;
create table test (
    test_id number( 9 )
  , value number( 9 )
  , constraint pk_test primary key (test_id)
)
/
exec dbms_random.seed(sysdate);

 -- softbuilder, привет;)
 
insert into test(test_id, value)
  select rownum,  trunc(dbms_random.value *  10 ) from all_objects where rownum <  50 
/

commit;

select test_id
     , value
     , sum(value) over (order by test_id) growing
from test
/

...
Рейтинг: 0 / 0
14.05.2003, 11:27
    #32159320
RiliR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нарастающий итог
2 softbuilder@inbox.ru

В жизни несколько отличаются названия таблиц и полей:
Код: plaintext
1.
2.
3.
4.
5.
select p2.objkey, max(p2.wes), sum(p1.wes)
from sd_portf p1, sd_portf p2
where 
p1.objkey <= p2.objkey
group by p2.objkey

План (не знаю в силу собственного ламерства как его красивее отобразить):
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT STATEMENT, GOAL = CHOOSE				
 SORT GROUP BY				
  NESTED LOOPS				
   TABLE ACCESS FULL	                        SD_PORTF	
   TABLE ACCESS BY INDEX ROWID	               SD_PORTF	
    INDEX RANGE SCAN	                        I_SD_PORTF_OBJKEY
...
Рейтинг: 0 / 0
14.05.2003, 11:33
    #32159336
RiliR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нарастающий итог
2 Denis Popov
Oracle 8i EE 8.1.6.3.0

И еще (и да не прогневаются на меня продвинутые девелоперы и гуру),
что значит кусок
Код: plaintext
1.
... over (order by test_id) growing ...
?
...
Рейтинг: 0 / 0
14.05.2003, 11:40
    #32159357
RiliR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нарастающий итог
2 Denis Popov

Большое человеческое спасибо! Действительно работает.
Только я все равно не въехал, в эту синтаксическую конструкцию.
...
Рейтинг: 0 / 0
14.05.2003, 11:40
    #32159358
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нарастающий итог
growing - просто пользовательское название колонки, а все остальное:

Oracle8i Data Warehousing Guide
SQL for Analysis
Windowing Functions
http://download-west.oracle.com/docs/cd/A87860_01/doc/server.817/a76994/analysis.htm#14924
...
Рейтинг: 0 / 0
14.05.2003, 12:10
    #32159423
raven13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нарастающий итог
1)
select p2.id, sum(p1.vl)
from table1 t1, table1 t2
where t1.id <= t2.id
group by t2.id

Че за алиасы p2 и p1? Вы их даже не объявили.

2) не уверен что индексы здесь будут использоваться (см. план выполнения запроса) если он есть по id. А так для каждой строки из табле1 выполняется запрос
select t2.id, sum(t1.vl)
from table1 t1, table1 t2
where t1.id <= t2.id
group by t2.id


Выводы делайте сами.
...
Рейтинг: 0 / 0
14.05.2003, 12:48
    #32159486
RiliR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нарастающий итог
2 raven13

1) действительно с p1 и p2 - это я погорячился, на самом деле я имел ввиду t1 и t2:

Код: plaintext
1.
2.
3.
4.
select t2.id, sum(t1.vl)
from table1 t1, table1 t2
where t1.id <= t2.id
group by t2.id


Приношу извинения.

2) насчет индексов, насколько я понимаю план выполнения запроса (а я, к сожалению, очень немного в нем понимаю) один индекс I_SD_PORTF_OBJKEY все таки отрабатывает, но тем не менее от времени выполнения запроса становится совсем грустно.
Вариант, который предложил Denis Popov работает на ура (т. е. вместо 20 сек. - ~0,5). На нем, пожалуй, и остановлюсь.

3) Всем спасибо.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Нарастающий итог / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]