Nano Hash - криптовалюты, майнинг, программирование

dbms_output.put_line

Снижает ли dbms_output.put_line производительность в plsql коде?


Ответы:


1

Каждая дополнительная строка кода снижает производительность кода. В конце концов, это дополнительная инструкция для выполнения, которая, по крайней мере, потребляет часть процессора. Так что да, dbms_output.put_line снижает производительность.

Реальный вопрос: перевешивает ли польза от этой дополнительной строки кода снижение производительности? Только ты можешь ответить на этот вопрос.

С уважением,
Роб.

07.02.2011

2

Да, это еще один фрагмент кода, который необходимо выполнить, но если вывод не включен, я думаю, что накладные расходы минимальны.

Вот вопрос AskTom с более подробной информацией: Повлияют ли операторы dbms_output.put_line, оставленные в пакетах, на производительность?

07.02.2011

3

Вы можете изучить условную компиляцию, чтобы DBMS_OUTPUT.PUT_LINE находились только в предварительно проанализированный код, если процедура скомпилирована с соответствующей опцией.

Один вопрос: был ли вызван DBMS_OUTPUT.ENABLE. Если это так, любое значение в DBMS_OUTPUT.PUT_LINE будет записано в структуру памяти сеанса. Если вы продолжите помещать туда что-то и никогда не вынимать (что может быть в случае с некоторыми подключениями к серверу приложений), вы можете обнаружить, что через несколько дней у вас будет МНОГО материала в памяти.

07.02.2011

4

Я использую таблицу журналов вместо dbms_output. Обязательно настройте как автономную транзакцию, что-то вроде (конечно, измените для своих нужд):

create or replace package body somePackage as
...
procedure ins_log(
i_msg in varchar2,
i_msg_type in varchar2,
i_msg_code in number default 0,
i_msg_context in varchar2 default null
) IS PRAGMA AUTONOMOUS_TRANSACTION;

begin

  insert into myLogTable
  (
  created_date,
  msg,
  msg_type,
  msg_code,
  msg_context
  )
  values
  (
  sysdate,
  i_msg,
  i_msg_type,
  i_msg_code,
  i_msg_context
  );

  commit;

end ins_log;
...

end;

Конечно, убедитесь, что вы создали свою таблицу журналов. В вашем коде, если вы выполняете много операций в цикле, вы можете захотеть регистрировать только один раз за x число операций, например:

create or replace myProcedure as
  cursor some_cursor is
  select * from someTable;

  v_ctr pls_integer := 0;

begin

for rec in some_cursor
loop
  v_ctr := v_ctr + 1;

  -- do something interesting

  if (mod(v_ctr, 1000) = 0) then
    somePackage.ins_log('Inserted ' || v_ctr || ' records', 
                        'Log', 
                         i_msg_context=>'myProcedure');
  end if;

end loop;
commit;

exception
  when others then
  somePackage.ins_log(SQLERRM, 'Err', i_msg_context=>'myProcedure');
  rollback;
  raise;
end;

Обратите внимание, что автономная транзакция гарантирует, что ваш журнал stmt будет вставлен, даже если произойдет ошибка, и вы откатите все остальное (поскольку это отдельная транзакция).

Надеюсь, это поможет... намного лучше, чем dbms_output ;)

07.02.2011
  • Как правило, это хорошее решение, но, поскольку оригинальный постер беспокоится о накладных расходах, это может быть намного хуже. Обработка автономных транзакций занимает значительно больше времени, чем вызовы dbms_output.put_line. 07.02.2011
  • Вам действительно не нужна куча dbms_output.put_lines в производственном коде. Это особенно верно для кода, который входит в любой цикл;) 08.02.2011

  • 5

    Это зависит от соотношения того, сколько раз вы вызываете dbms_output.put_line по сравнению с тем, что еще вы делаете в PL/SQL.

    07.02.2011
  • Еще одним важным фактором является то, какие выражения используются для построения параметра, например. dbms_output.put_line(my_slow_function()) 08.02.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..