Наблюдаю интересную картину: абсолютное большинство отчётов и программ под Oracle Applications написано не в декларативном SQL-стиле, а в традиционном процедурном стиле PL/SQL. Даже родные оракловые пакеты этим грешат.
А между тем, это чревато потерей производительности, причём иногда совершенно катастрофической. Беглый взгляд в трассу (как в
(
Read more... )
Comments 8
Reply
ъ) Во всём с тобой соглашусь, кроме одного. Ты выводишь на первое место многоблочное чтение, а я всё-таки считаю, что уменьшение логических чтений важнее. Их уменьшение означает, что мы будем делать меньше бесполезной работы. Если при этом ещё и возрастёт скорость за счёт многоблочных чтений или распараллеливания - ну совсем хорошо. Но даже если бы не возрасла, всё равно было бы неплохо. В общем, мы-то понимаем, что на самом деле одно другое очень удачно дополняет ( ... )
Reply
Слышал про такую штуку как ожидания? Вот посчитай время и количество ожиданий при одноблочном и многоблочном чтении, будет о чём задуматься. И с латчами то же самое.
Как посчитать переключения контекстов - не знаю, но твою кривую функцию можно как минимум написать чуть менее криво_чем, если уж SQL товарищи писать не умеют:
create or replace function get_authors(p_book_id number)
return varchar2
is
type t_name is table of writers.name%TYPE index by binary_integer;
v_name t_name;
begin
select w.name
bulk collect into v_name
from writers w, authors a
where a.book_id = p_book_id and w.writer_id = a.writer_id
order by a.seq_num;
if v_name.count>1 then
return v_name(1)||' и др.';
else
return v_name(1);
end if;
end;
Количество переключений контекста сокращается вдвое!
А ещё время выполнения PL/SQL кода предсказуемо, в отличие от SQL. Помню, делал халтурку® для одной конторы, так я там написал всё на SQL ( ... )
Reply
Про переключение контекстов тоже есть над чем поразмыслить. Если получится продемонстрировать разницу на твоём примере, то завтра же высылаю $10.
А с распараллеливанием у нас облом, потому что хрен-то там чего разделишь. Да на наших жалких объёмах и без распараллеливания всё может очень шустро работать, если, конечно, зарядить могзи.
Reply
"сериализуется с помощью защелок" - это упорядочивается с помощью триггеров, что ли? :Е
Сама идея, что микрооптимизация, особенно ориентированная на "знание" внутренней структуры, зачастую ухудшает макропоказатели, в-общем, не нова.
Однако есть наблюдение о ходе эксперимента, точнее о собираемой статистике: оптимизируемый параметр (consistent gets) может не вполне отражать картину, если учитывает только обращение к данным "на носителе", но не учитывает внутренние манипуляции, которых во втором случае гораздо больше. Даже с учетом того, что ОЗУ намного быстрее чем диск, нельзя исключить ненадежность результатов.
СП
Reply
Да, внутренние манипуляции по обработке того, что прочиталось, действительно не учитываются. Действительно, обработка одного блока может занимать больше времени, чем обработка другого. Тем не менее, этот параметр всё-таки вполне адекватен, что подтверждается практикой. И у него есть огромный плюс: его легко измерить.
Reply
то еще зрелище...
Reply
И должен сказать, что зачастую это всё равно лучше, чем процедурный код. Другое дело, что на SQL надо уметь писать аккуратно, чтобы эти 1000 строк не были одним большим месивом. Впрочем, месиво - оно и на процедурном языке месиво...
Reply
Leave a comment