Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Помощь новичку с процедурой / 7 сообщений из 7, страница 1 из 1
06.08.2010, 16:09
    #36779715
Larsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь новичку с процедурой
Добрый день народ.

Подскажите следующее, оптимальна ли данная процедура?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
ALTER PROCEDURE "DBA"."sp_Report_Dates_Ditail"
(
    @uid BIGINT
)
RESULT
(
    @id BIGINT,
    @login VARCHAR( 50 ),
    @size_g NUMERIC( 10 , 4 ),
    @size NUMERIC( 10 , 4 ),
    @size_l NUMERIC( 10 , 4 )
)
BEGIN
    DECLARE LOCAL TEMPORARY TABLE tmp_Jurnal
    (
        uid BIGINT,
        "login" VARCHAR( 50 ),
        size_g NUMERIC( 10 , 4 ),
        size NUMERIC( 10 , 4 ),
        size_l NUMERIC( 10 , 4 )
    ) ON COMMIT DELETE ROWS;

    DECLARE @l_id BIGINT;
    DECLARE @l_login VARCHAR( 50 );
    DECLARE @l_size NUMERIC( 10 , 4 );
    DECLARE @l_size_l NUMERIC( 10 , 4 );

    DECLARE @sql LONG VARCHAR;
    SET @sql = 'SELECT DISTINCT(uid_user) as uid_user FROM Jurnal as j WHERE j.uid_date = ' || string(@uid) || ' ORDER BY uid_user';
    
    FOR loop_name AS DYNAMIC SCROLL CURSOR USING @sql
    DO
        SELECT name INTO @l_login
        FROM DirectoryUsers
        WHERE uid = uid_user;

        SELECT (SUM(size) /  1048576 ) size INTO @l_size
        FROM Jurnal AS j
        LEFT JOIN DirectoryDomains AS dd ON (j.uid_domain = dd.uid AND dd.isLocal =  0 )
        WHERE uid_date = @uid AND uid_user = uid_user;

        SELECT (SUM(size) /  1048576 ) size INTO @l_size_l
        FROM Jurnal AS j
        LEFT JOIN DirectoryDomains AS dd ON (j.uid_domain = dd.uid AND dd.isLocal =  1 )
        WHERE uid_date = @uid AND uid_user = uid_user;

        INSERT INTO tmp_Jurnal VALUES (@uid, @l_login, @l_size + @l_size_l, @l_size, @l_size_l);
    END FOR;
    
    SELECT uid AS @id, "login" AS @login, size_g AS @size_g, size AS @size, size_l as @size_l
    FROM tmp_Jurnal
    ORDER BY size_g;
END

Схема данных во вложении
...
Рейтинг: 0 / 0
06.08.2010, 16:38
    #36779804
Larsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь новичку с процедурой
Понятно :( Пятница...
...
Рейтинг: 0 / 0
06.08.2010, 17:06
    #36779876
Dmitry.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь новичку с процедурой
Larsik,

как по мне - не оптимально
это все можно было сделать одним запросом
...
Рейтинг: 0 / 0
06.08.2010, 23:26
    #36780312
Ggg_old
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь новичку с процедурой
Если запрос работает правильно и быстро, значит он оптимален. Чисто эстетически, я бы старался избегать динамического SQL в ХП. Лучше бы uid параметризовать в переменную и выполнить запрос как select во времянку. А уже по времянке открывать курсор. Что там внутри курсора я не смотрел, посему за оптимизацию запросов там сказать ничего не могу.
Понравилось, что текст ХП выглядит красиво, опрятно.
...
Рейтинг: 0 / 0
09.08.2010, 08:11
    #36781416
KSerega
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь новичку с процедурой
Larsik,

SELECT (SUM(if dd.isLocal = 0 then size else 0 endif) / 1048576)
(SUM(if dd.isLocal = 1 then size else 0 endif) / 1048576)
INTO @l_size,@l_size_l
FROM Jurnal AS j
LEFT JOIN DirectoryDomains AS dd ON (j.uid_domain = dd.uid)
WHERE uid_date = @uid AND uid_user = uid_user;
...
Рейтинг: 0 / 0
09.08.2010, 11:47
    #36781767
Larsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь новичку с процедурой
KSeregaLarsik,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT
(SUM(if dd.isLocal =  0  then size else  0  endif) /  1048576 ),
(SUM(if dd.isLocal =  1  then size else  0  endif) /  1048576 ) 
INTO @l_size,@l_size_l
FROM Jurnal AS j
LEFT JOIN DirectoryDomains AS dd ON (j.uid_domain = dd.uid)
WHERE uid_date = @uid AND uid_user = uid_user;


За подсказку спасибо, я так и не нашел аналог IIF :-)

Вопрос еще вот в чем, как проверить(узнать) стоимость всей процедуры в целом.
В FB любую процедуру можно выполнить в виде блока и узнать какие индексы дергал сервер, какой план и его стоимость. Как тут это можно выполнить?
...
Рейтинг: 0 / 0
09.08.2010, 12:25
    #36781872
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помощь новичку с процедурой
09.08.2010 12:47, Larsik пишет:

> За подсказку спасибо, я так и не нашел аналог IIF :-)
>
> Вопрос еще вот в чем, как проверить(узнать) стоимость всей процедуры в
> целом.
> В FB любую процедуру можно выполнить в виде блока и узнать какие индексы
> дергал сервер, какой план и его стоимость. Как тут это можно выполнить?

Совет № 1: выбросить из головы FB, чтобы не мешал работать. Совет № 2:
открыть для себя Profiling (в Sybase Central-е) и планы запросов (в ISQL).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Помощь новичку с процедурой / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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