powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Помощь новичку с процедурой
7 сообщений из 7, страница 1 из 1
Помощь новичку с процедурой
    #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
Помощь новичку с процедурой
    #36779804
Larsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно :( Пятница...
...
Рейтинг: 0 / 0
Помощь новичку с процедурой
    #36779876
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Larsik,

как по мне - не оптимально
это все можно было сделать одним запросом
...
Рейтинг: 0 / 0
Помощь новичку с процедурой
    #36780312
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если запрос работает правильно и быстро, значит он оптимален. Чисто эстетически, я бы старался избегать динамического SQL в ХП. Лучше бы uid параметризовать в переменную и выполнить запрос как select во времянку. А уже по времянке открывать курсор. Что там внутри курсора я не смотрел, посему за оптимизацию запросов там сказать ничего не могу.
Понравилось, что текст ХП выглядит красиво, опрятно.
...
Рейтинг: 0 / 0
Помощь новичку с процедурой
    #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
Помощь новичку с процедурой
    #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
Помощь новичку с процедурой
    #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
7 сообщений из 7, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Помощь новичку с процедурой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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