powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Нарастающий итог
10 сообщений из 10, страница 1 из 1
Нарастающий итог
    #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
Нарастающий итог
    #32159295
RiliR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное, я легкомысленно ошибся при выборе названия топика,
следовало бы написать что-то типа "Погите новичку..." :)
На самом деле я с Ораклом знаком очень и очень поверхностно.
И все же надеюсь на вашу снисходительность.
Может быть, у кого-нибудь есть какие-то косвенные мысли по поводу запроса?
...
Рейтинг: 0 / 0
Нарастающий итог
    #32159299
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
План выполнения запроса в студию, пожалста
...
Рейтинг: 0 / 0
Нарастающий итог
    #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
Нарастающий итог
    #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
Нарастающий итог
    #32159336
RiliR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Denis Popov
Oracle 8i EE 8.1.6.3.0

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

Большое человеческое спасибо! Действительно работает.
Только я все равно не въехал, в эту синтаксическую конструкцию.
...
Рейтинг: 0 / 0
Нарастающий итог
    #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
Нарастающий итог
    #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
Нарастающий итог
    #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
10 сообщений из 10, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Нарастающий итог
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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