Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Informix [игнор отключен] [закрыт для гостей] / Оцените процедуру / 10 сообщений из 10, страница 1 из 1
05.11.2004, 15:47
    #32770972
sergiigray
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оцените процедуру
database rt_data;

drop procedure get_lost_u(char, date);

create function get_lost_u(u_num_cnt char(20), u_dat_uchet date)
returning float;
DEFINE u_volumeN float;
DEFINE u_volumeB float;
define u_tempn, u_tempb, u_daten, u_dateb integer;
let u_volumeN=0;
let u_volumeB=0;
let u_dateN=0;
let u_dateB=0;

--- выборка последней записи
foreach
select first 1 dat_uchet, val_cnt into u_dateN, u_volumeN
from counters
where is_actual=1 and num_cnt=u_num_cnt and dat_uchet>=u_dat_uchet
order by dat_uchet desc
EXIT FOREACH;
END FOREACH;

--- выборка предпоследней записи
foreach
select first 1 dat_uchet, val_cnt into u_dateB, u_volumeB
from counters
where is_actual=1 and num_cnt=u_num_cnt and dat_uchet<u_dat_uchet
order by dat_uchet desc
EXIT FOREACH;
END FOREACH;

--- подсчет расхода за месяц
IF (u_volumeN-u_volumeB)<=0
THEN
let u_volumeN=0;
ELSE
--- если разница больше года
if (year(u_daten)-year(u_dateb))>0
then
let u_volumeN=(u_volumeN-u_volumeB)/((year(u_daten)-year(u_dateb))*12+month(u_daten)-month(u_dateb));
else
--- если в диапазоне одного года
let u_volumeN=(u_volumeN-u_volumeB)/(month(u_daten)-month(u_dateb));
end if;
end if;

return u_volumeN;
end function;

---grant execute on get_lost_u to "public" as "are";
--- select 1, get_lost_u("29","01.05.2004") from systables where tabid=1;

Есть таблица, содержащая показания водомеров, необходимо просчитать расход воды по одной квартире за определенный месяц...
...
Рейтинг: 0 / 0
05.11.2004, 16:02
    #32771020
Enlighten me
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оцените процедуру
Ну, ничего страшного, первый блин... с кем не бывает.
Запускать, как я понимаю, не пробовали?
BTW, под какую версию информикса шедевр ваяете?
...
Рейтинг: 0 / 0
05.11.2004, 17:15
    #32771214
sergiigray
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оцените процедуру
Первый блин.... согласен.... предложите свои варианты...
...
Рейтинг: 0 / 0
09.11.2004, 11:07
    #32773017
Enlighten me
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оцените процедуру
sergiigrayПервый блин.... согласен.... предложите свои варианты...
Мои предложения:
1) Прочитать что-нибудь про SPL
2) Самостоятельно добиться выполнения create procedure - исправить ошибки и очепятки
3) Ответить на заданные вам вопросы.
4) В результате ## 1,..,3 : переформулировать заданный вопрос. IMHO, он должен начинаться с "как" или c "почему".

With best regards,
Enlighten me.

PS. Whole things written above, are non-offensive and shold be treated as "IMHO" ideas...
...
Рейтинг: 0 / 0
12.11.2004, 17:23
    #32780383
sergiigray
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оцените процедуру
ваяю под 9.21 ТС1
Запускается и работает... но долго.
как можно оптимизировать?
...
Рейтинг: 0 / 0
12.11.2004, 17:37
    #32780415
Enlighten me
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оцените процедуру
На первый взгляд - foreach здесь излишен. Зачем создавать курсор ради запроса ОДНОЙ записи? Select ... into ... будет в самый раз.

ИМНО, тормозить такая процедура может только на селектах. Посмотрите на план их выполнения.
...
Рейтинг: 0 / 0
12.11.2004, 18:15
    #32780515
sergiigray
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оцените процедуру
выдает не обязательно одну строку.
Бывает, что в квартире по 4 счетчика....
...
Рейтинг: 0 / 0
12.11.2004, 18:31
    #32780536
Enlighten me
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оцените процедуру
sergiigrayвыдает не обязательно одну строку.
Бывает, что в квартире по 4 счетчика.... Переформулируйте селекты. Хотя ожидать резкого ускорения я бы от этого не стал, читаемость не ухудшидся. Дальше профайлинг и тюнинг.
...
Рейтинг: 0 / 0
19.11.2004, 11:26
    #32790818
sergiigray
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оцените процедуру
Enlighten me Переформулируйте селекты. Хотя ожидать резкого ускорения я бы от этого не стал, читаемость не ухудшидся. Дальше профайлинг и тюнинг.

как?
...
Рейтинг: 0 / 0
19.11.2004, 17:27
    #32792095
Enlighten me
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оцените процедуру
sergiigrayкак?
И без использования Data Mining ясно, что этот топик вы проверяете исключительно по пятницам... Informix SPL хорош под пиво? :-))

Я не знаю структуры ваших таблиц, посему приведу абстрактный пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create table payroll (
id serial primary key,
prs_id integer not null,
paid_when date not null,
paid_figure decimal( 16 , 4 ),
paid_currency char( 3 ) ) ;

insert into payroll (prs_id,paid_when,paid_figure,paid_currency)
values ( 7 ,'10/1/2004', 100 ,'GBP') ;
insert into payroll (prs_id,paid_when,paid_figure,paid_currency)
values ( 7 ,'10/2/2004', 200 ,'GBP') ;
insert into payroll (prs_id,paid_when,paid_figure,paid_currency)
values ( 7 ,'10/1/2004', 90 ,'GBP') ;
insert into payroll (prs_id,paid_when,paid_figure,paid_currency)
values ( 6 ,'10/1/2004', 150 ,'GBP') ;

select 
	paid_currency,sum(paid_figure),paid_when 
from payroll where 
 	prs_id =  007  and paid_currency = 'GBP' and paid_when in 
	(select min(paid_when) from payroll where prs_id =  007  and 
		paid_currency = 'GBP' and paid_when > mdy( 9 , 30 , 2004 ))
group by paid_currency,paid_when
Задача выдать суммарную выплату заданной персоне в заданной валюте произведенную в первый payday позже заданной даты. Предполагается, что в день можем быть несколько выплат.

Хранимую процедуру подобный селект не украсит, но всё лучше (как мне кажется) чем fake foreach.

Профайлинг.

SET DEBUG FILE TO '/tmp/foo.trace'; --из доки
TRACE OFF;
Trace 'before...'||curtyme ;
....
Trace 'after...'||curtyme ;

Вот здесь сказано как получить текущий момент во время выполнения хранимой процедуры. CURRENT будет одинаков во время всего выполнения.
Тюнинг - set explain on и select'ы ручками, подставляя значения... Может кто предложит что получше, но я бы двигался примерно так.
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / Оцените процедуру / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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