Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Оптимизация запроса. Выгрузка данных в файл.  [new]
Anton M.
Member

Откуда:
Сообщений: 193
Господа, вопрос старожилам.
Выгружаю данные из таблицы в обычный текстовый файл.
Размер файла получается порядка 50 Мб.
Выполняется запрос долго - часов 25, словом порядка суток.
Скорость выгрузки данных приблизительно 1Кб/сек.
В целом на мой взгляд очень долго. Я понимаю что операция записи - не быстрая, но все же.
У меня есть идея насчет того чтобы за раз записывать больше информации - тогда можно увеличить скорость выполнения запроса.
Поделитесь идеями пжст, интересно было бы обсудить.

Процедура:

create or replace 
procedure export_roads is
count_num number:=0;
BEGIN
 
 select count(DISTINCT settle_idx) cnt into count_num from ACON_ADMIN;	
 log_road_writer.put_line(count_num);						-- Count SYNT_ID
 
 for i in (SELECT DISTINCT settle_idx, admin_order FROM ACON_ADMIN) 
 loop
 log_road_writer.put_line(i.settle_idx);					-- SYNT_ID

    if i.admin_order=8 then 									-- order8_id roads count	    
        begin
    	     SELECT count(DISTINCT a.street_name) into count_num FROM acon_road_2 a where a.order8_id=i.settle_idx order by a.street_name;	
    	     log_road_writer.put_line(count_num);
 
        	for j in (SELECT DISTINCT a.street_name, a.street_language FROM acon_road_2 a where a.order8_id=i.settle_idx order by a.street_name) 
	        loop
 		         log_road_writer.put_line(j.street_name);
 		         log_road_writer.put_line(j.street_language);
				  		  	
				SELECT DISTINCT count(a.road_link_id) into count_num FROM acon_road_2 a where a.order8_id=i.settle_idx and a.street_name=j.street_name;
				log_road_writer.put_line(count_num);  	
		  		for c in (SELECT DISTINCT a.road_link_id FROM acon_road_2 a where a.order8_id=i.settle_idx and a.street_name=j.street_name) 
				    loop
						log_road_writer.put_line(c.road_link_id);
					end loop;					   
	        end loop;

    end;
 else														-- builtup_id roads count
   begin
   SELECT count(DISTINCT a.street_name) into count_num FROM acon_road_2 a where a.builtup_id=i.settle_idx order by a.street_name;
       	     log_road_writer.put_line(count_num);
 
        	for j in (SELECT DISTINCT a.street_name, a.street_language FROM acon_road_2 a where a.builtup_id=i.settle_idx order by a.street_name) 
	        loop
 		         log_road_writer.put_line(j.street_name);
 		         log_road_writer.put_line(j.street_language);
		  		
				SELECT DISTINCT count(a.road_link_id) into count_num FROM acon_road_2 a where a.builtup_id=i.settle_idx and a.street_name=j.street_name;
				log_road_writer.put_line(count_num);  	
		  		for c in (SELECT DISTINCT a.road_link_id FROM acon_road_2 a where a.builtup_id=i.settle_idx and a.street_name=j.street_name) 
				    loop
						log_road_writer.put_line(c.road_link_id);
					end loop;					   
	        end loop;
   
   end;
 end if; 
 
  end loop;
END;
/
26 апр 07, 16:08    [4074996]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. Выгрузка данных в файл.  [new]
Q u a d r o
Member

Откуда: Canada
Сообщений: 1987
Почему вы думаете что проблема именно в записи? 50MB - детский сад для современных дисков.

Если убрать все вызовы к log_road_writer (оставив все запросы на месте!) - какая скорость работы?
26 апр 07, 16:17    [4075040]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. Выгрузка данных в файл.  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Такая процедура и не может быстро работать...

Чисто навскидку:
1.
SELECT count(DISTINCT a.street_name) ... order by a.street_name;
смотрится экзотично :)

2. А зачем Вы все время отдельно считаете кол-во, если потом полностью проходите по циклу?

3. Запросы по a.order8_id=i.settle_idx и a.order8_id=i.settle_idx and a.street_name=j.street_name леко объединяются.

4. Может Вам в начале собрать всю информацию, а потом выгрузить?

ЗЫ: Даже страшно представить, что можно потом сделать с обычным текстовым файлом размером 50Мб :)
26 апр 07, 16:23    [4075066]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. Выгрузка данных в файл.  [new]
semenar
Member

Откуда: Днепропетровск
Сообщений: 3308
Блог
Jannny
Такая процедура и не может быстро работать...

Чисто навскидку:
1.
SELECT count(DISTINCT a.street_name) ... order by a.street_name;
смотрится экзотично :)

2. А зачем Вы все время отдельно считаете кол-во, если потом полностью проходите по циклу?

3. Запросы по a.order8_id=i.settle_idx и a.order8_id=i.settle_idx and a.street_name=j.street_name леко объединяются.

4. Может Вам в начале собрать всю информацию, а потом выгрузить?

ЗЫ: Даже страшно представить, что можно потом сделать с обычным текстовым файлом размером 50Мб :)

Вы не представляете насколько страшен файл в 14 гигабайт. Правда операцию обраную проводил. В Оракл заливали.
26 апр 07, 16:25    [4075089]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. Выгрузка данных в файл.  [new]
Anton M.
Member

Откуда:
Сообщений: 193
Jannny
Такая процедура и не может быстро работать...

Чисто навскидку:
1.
SELECT count(DISTINCT a.street_name) ... order by a.street_name;
смотрится экзотично :)

2. А зачем Вы все время отдельно считаете кол-во, если потом полностью проходите по циклу?

3. Запросы по a.order8_id=i.settle_idx и a.order8_id=i.settle_idx and a.street_name=j.street_name леко объединяются.

4. Может Вам в начале собрать всю информацию, а потом выгрузить?

ЗЫ: Даже страшно представить, что можно потом сделать с обычным текстовым файлом размером 50Мб :)



1. Согласен - order by a.street_name вообще ни к чему :)
2. Мне необходимо записать в файл количество выбранных записей, перед тем как они сами пойдут.
3. ИМХО это невозможно, т.к. сперва нужно указать count(street_name) затем ( street_name и street_language ), затем count(road_links_id), после список road_links_id и все это в цикле.
4. Вообще мысль хорошая, только пока не представляю в каком виде ее собрать, поскольку и так все выгружаемые записи находятся в одной таблице.
26 апр 07, 16:38    [4075163]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. Выгрузка данных в файл.  [new]
givanov
Member

Откуда:
Сообщений: 757
Для Oracle >= 8i попробуйте примерно так:
SELECT count(distinct a.street_name) over (partition by a.order8_id)
     , a.street_name
     , a.street_language
     , count(*) over (partition by a.order8_id, a.street_name, a.street_language)
     , a.road_link_id
  FROM acon_road_2 a
     , ACON_ADMIN i
  where a.order8_id=i.settle_idx
    and i.admin_order=8
  group by a.order8_id
         , a.street_name
         , a.street_language
         , a.road_link_id
  order by a.street_name
26 апр 07, 17:08    [4075365]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. Выгрузка данных в файл.  [new]
Anton M.
Member

Откуда:
Сообщений: 193
Q u a d r o
Почему вы думаете что проблема именно в записи? 50MB - детский сад для современных дисков.

Если убрать все вызовы к log_road_writer (оставив все запросы на месте!) - какая скорость работы?


Вообще вы правы, здесь проблема похоже не только в операции записи, скрипт выполняется долго.
26 апр 07, 17:11    [4075385]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. Выгрузка данных в файл.  [new]
nikopol
Member

Откуда:
Сообщений: 335
ИМХО надо смотреть в сторону оптимизации запроса. 25 часов запись 50 мегабайт ну никак идти не может.
27 апр 07, 10:03    [4077318]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. Выгрузка данных в файл.  [new]
Splain
Member

Откуда: Череповец
Сообщений: 924
Anton M.

Выполняется запрос долго - часов 25, словом порядка суток.


Какое-нибудь из этих средств:

PL/SQL Profiler

SQL Trace

для анализа проблем производительности Вы уже пробовали использовать?
27 апр 07, 10:15    [4077411]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. Выгрузка данных в файл.  [new]
givanov
Member

Откуда:
Сообщений: 757
Splain
Какое-нибудь из этих средств:
Не надо никаких средств.
Надо научиться писать запросы на SQL, потом в жизни пригодится.
Приведенный автором код не может работать быстро на таблицах в несколько МБ по вполне понятным причинам.
27 апр 07, 14:07    [4079276]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса. Выгрузка данных в файл.  [new]
Splain
Member

Откуда: Череповец
Сообщений: 924
givanov
Не надо никаких средств.
Надо научиться писать запросы на SQL, потом в жизни пригодится.
Приведенный автором код не может работать быстро на таблицах в несколько МБ по вполне понятным причинам.


Завидую терпению :) У меня лично никакого желания разбираться и строить догадки по непонятному куску чужого кода нет. Другое дело - детальная информация о ходе выполнения процедуры.
28 апр 07, 08:29    [4082166]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить