У меня есть процедура PL/SQL, которая делает много SUBSTR
s по параметру VARCHAR2
. Я хотел бы удалить ограничение длины, поэтому я попытался изменить его на CLOB
.Производительность SUBSTR на CLOB
Работает хорошо, но производительность страдает, поэтому я провел несколько тестов (на основе these tests с 2005 года).
UPDATE: Я могу воспроизвести это на нескольких различных экземпляров с различными версиями Oracle и другими аппаратными средствами, dbms_lob.substr
всегда заметно медленнее, чем substr(CLOB)
, и намного медленнее, чем SUBSTR(VARCHAR2)
.
Результаты и тесты Боба в приведенной выше ссылке рассказывают другую историю.
Может ли кто-нибудь объяснить это или хотя бы воспроизвести либо результаты Боба, либо мои результаты? Благодаря!
Результаты тестов:
+000000000 00:00:00. (VARCHAR2)
+000000000 00:00:00. (CLOB SUBSTR)
+000000000 00:00:00. (DBMS_LOB.SUBSTR)
Код испытания:
DECLARE
l_text VARCHAR2(30) := 'This is a test record';
l_clob CLOB := l_text;
l_substr VARCHAR2(30);
t TIMESTAMP;
BEGIN
t := SYSTIMESTAMP;
FOR i IN 1..100000 LOOP
l_substr := SUBSTR(l_text,1,14);
END LOOP;
dbms_output.put_line(SYSTIMESTAMP - t || ' (VARCHAR2)');
t := SYSTIMESTAMP;
FOR i IN 1..100000 LOOP
l_substr := SUBSTR(l_clob,1,14);
END LOOP;
dbms_output.put_line(SYSTIMESTAMP - t || ' (CLOB SUBSTR)');
t := SYSTIMESTAMP;
FOR i IN 1..100000 LOOP
l_substr := DBMS_LOB.SUBSTR(l_clob,14,1);
END LOOP;
dbms_output.put_line(SYSTIMESTAMP - t || ' (DBMS_LOB.SUBSTR)');
END;
Примечание: Тест три - это «14,1», а остальные - «1,14». Я также испытал бы что-то вроде '10000, 5000', поскольку дело в том, что вы хотите сломать 4-килобайтный лимит VARCHAR.Кроме того, поскольку результаты примерно на 75 раз медленнее для VARCHAR, можете ли вы рассмотреть алгоритм, который имеет дело с несколькими VARCHAR? * [Например, нормализованная таблица, в которой одно поле является «sequence_id», показывающее относительное положение этой строки, а другое - VARCHAR] *. Наконец, хотя существует большая * относительная * разница, * абсолютная * разница низкая. Так ли это имеет значение? * [Предварительная оптимизация] * – MatBailie
@ Dems: Спасибо за ваш вклад! «14,1» и «1,14» верны (спасибо Oracle за совместимые API). Я пытаюсь разбить ограничение байта '32767' (PL/SQL, а не SQL), и результаты более или менее одинаковы при использовании текста с этой длиной' (LPAD ('X', 32767, 'X')) '. Я подумал об этом решении с несколькими varchar-таблицами, но я бы хотел его избежать :) И это имеет значение, поскольку процедура называется очень часто, но больше всего мне любопытно, есть ли альтернативы ... –
На моих машинах DBMS_LOB.SUBSTR немного медленнее CLOB_SUBSTR (20%). И оба mooore медленнее, чем varchar2 (в 70 раз медленнее). Я бегу на 11gR2. –