Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6 7 8 9 10 .. 38   вперед  Ctrl
 Re: Курилка  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29674
andreymx
раньше работало
group by 10g vs 11g
31 май 16, 17:17    [19242358]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53418
Сравнивал некие объекты на двух БД. Под объектом имеется в виду данные по определённым параметрам в 15 разных таблицах
Нашел функцию fn_gen_inserts, выгружающую в CLOB данные селекта в виде инсерта
Подёргал, в 20 раз ускорил, в 5 раз уменьшил получаемый функцией код
Набросал пакет, слепил общий скрипт, выдрал у одминов права на dbms_crypto для хешей (пока так буду сравнивать, хоть и моветон)

Сравнил продакт и свой тест - все зашибись, что за день накорректировали, сразу увидел

Начала сравнивать две свои продакшн-БД - и тут оказалось, что ключевой параметр - id комплекса - как раз не совпадает. 21 и 121.
Хеши не совпадают, всё не совпадает
:) :(
19 июл 16, 19:02    [19428704]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53418
andreymx
Начала
начал
19 июл 16, 19:03    [19428707]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53418
andreymx
Нашел функцию fn_gen_inserts, выгружающую в CLOB данные селекта в виде инсерта
Подёргал, в 20 раз ускорил,


оказывается, скобки имеют значение при конкатенации с CLOB
DECLARE
    v_clob  CLOB;
    v_clb2  CLOB;
    v_vch2  VARCHAR2(4000);
    v_vch3  VARCHAR2(4000);
BEGIN

    v_clob := NULL;
    v_vch2 := '1';
    v_clb2 := '1';

    dbms_output.put_line(TO_CHAR(SYSDATE, 'hh24:mi:ss'));

    FOR i IN 1..18000 LOOP
        v_clob := v_clob || v_vch2 || v_vch2 || v_clb2;
    END LOOP; -- 4 сек

    dbms_output.put_line(TO_CHAR(SYSDATE, 'hh24:mi:ss'));

    FOR i IN 1..18000 LOOP
        v_clob := v_clob || (v_vch2 || v_vch2 || v_clb2);
    END LOOP; -- менее 1 сек

    dbms_output.put_line(TO_CHAR(SYSDATE, 'hh24:mi:ss'));


END;
20 июл 16, 15:32    [19431611]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53418
неявное и неудачное преобразование типов
20 июл 16, 15:37    [19431638]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
s u
Member

Откуда:
Сообщений: 740
andreymx
оказывается, скобки имеют значение при конкатенации с CLOB


не говоря о том что конкатинация через || к клобу вообще не приемлема, в 1-м случае конкатенируем 3 раза к клобу против одной конкатинации во втором примере.. вот и объяснение..
20 июл 16, 17:34    [19432253]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
s u
Member

Откуда:
Сообщений: 740
попрвил

s u

против двух конкатинаций во втором примере
20 июл 16, 17:37    [19432261]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18257
s u
andreymx
оказывается, скобки имеют значение при конкатенации с CLOB


не говоря о том что конкатинация через || к клобу вообще не приемлема
Вообще-то еще с 9-ки
PL/SQL
User’s Guide and Reference
Release 2 (9.2)
PL/SQL Expressions and Comparisons
Concatenation Operator
Double vertical bars (||) serve as the concatenation operator, which appends one
string (CHAR, VARCHAR2, CLOB, or the equivalent Unicode-enabled type) to another.
For example, the expression
’suit’ || ’case’
returns the following value:
’suitcase’
If both operands have datatype CHAR, the concatenation operator returns a CHAR
value. If either operand is a CLOB value, the operator returns a temporary CLOB.
Otherwise, it returns a VARCHAR2 value.


А вообще -- действительно интересно. Попробовал на Спарках (9.2-11.2) и x86 (11.2) -- везде разница в разы (десятки раз)
+
SQL> ed
Wrote file afiedt.buf

  1  DECLARE
  2      v_clob  CLOB;
  3      v_clb2  CLOB;
  4      v_vch2  VARCHAR2(32000);
  5  BEGIN
  6      v_clob := NULL;
  7      v_vch2 := rpad('1', 32000, '1');
  8      v_clb2 := rpad('1', 32000, '1');
  9      dbms_output.put_line(TO_CHAR(SYSDATE, 'hh24:mi:ss'));
 10      v_clob := null;
 11      FOR i IN 1..180 LOOP
 12          v_clob := v_clob || (v_vch2 || v_vch2 || v_clb2);
 13      END LOOP;
 14      dbms_output.put_line(TO_CHAR(SYSDATE, 'hh24:mi:ss')||', len='||length(v_clob));
 15      v_clob := null;
 16      FOR i IN 1..180 LOOP
 17          v_clob := v_clob || v_vch2 || v_vch2 || v_clb2;
 18      END LOOP;
 19      dbms_output.put_line(TO_CHAR(SYSDATE, 'hh24:mi:ss')||', len='||length(v_clob));
 20* END;
SQL> /
11:22:05
11:22:05, len=17280000
11:22:30, len=17280000

PL/SQL procedure successfully completed.
21 июл 16, 04:45    [19433914]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29674
Вячеслав Любомудров
А вообще -- действительно интересно. Попробовал на Спарках (9.2-11.2) и x86 (11.2) -- везде разница в разы (десятки раз)
Это ж баян.
задачка на длинную пятницу для настоящих бойцов (pl/sql)
21 июл 16, 07:50    [19434020]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18257
Не совсем так. У меня под спойлером код немного другой
Там любая конкатенация вызовет конкатенацию/преобразование с/в CLOB, ибо размерчик строки VARCHAR2 уже под 32к. Либо оно "внутре" умеет больше 32к.

По-моему, это (или что-то подобное) уже обсуждалось, но не могу вспомнить где
21 июл 16, 13:09    [19435900]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29674
Вячеслав Любомудров
оно "внутре" умеет больше 32к.

По-моему, это (или что-то подобное) уже обсуждалось, но не могу вспомнить где
Размер результата конкатенации строк в PLSQL
21 июл 16, 13:40    [19436211]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29674
Из древнейших: Максимальная длина VARCHAR2 в параметрах
21 июл 16, 13:41    [19436226]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
s u
Member

Откуда:
Сообщений: 740
Вячеслав Любомудров
s u
пропущено...


не говоря о том что конкатинация через || к клобу вообще не приемлема
Вообще-то еще с 9-ки


имелась ввиду производительность, а не валидность операции
21 июл 16, 15:54    [19437396]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18257
Elic
Вячеслав Любомудров
оно "внутре" умеет больше 32к.

По-моему, это (или что-то подобное) уже обсуждалось, но не могу вспомнить где
Размер результата конкатенации строк в PLSQL
О, спасибо

s u
Вячеслав Любомудров
пропущено...
Вообще-то еще с 9-ки


имелась ввиду производительность, а не валидность операции
А как сделать производительней?
Имеется ввиду без изменения алгоритма. DBMS_LOB.APPEND работает не быстрее
22 июл 16, 03:43    [19439402]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29674
Вячеслав Любомудров
А как сделать производительней?
Имеется ввиду без изменения алгоритма. DBMS_LOB.APPEND работает не быстрее
Поменьше использовать любое обращение к lob-ам. Читать chunk-ами побольше, писать - буферизуя в varchar2.
22 июл 16, 09:31    [19439733]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18257
Это понятно

Я думал, s u располагает тайными знаниями что в данном случае лучше использовать вместо конкатенации (||)
22 июл 16, 09:43    [19439799]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53418
Elic
Вячеслав Любомудров
А как сделать производительней?
Имеется ввиду без изменения алгоритма. DBMS_LOB.APPEND работает не быстрее
Поменьше использовать любое обращение к lob-ам. Читать chunk-ами побольше, писать - буферизуя в varchar2.
удалось ускорить функцию в сотни раз
22 июл 16, 10:39    [19440078]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53418
работу предлагают одминам
https://www.sql.ru/forum/1225026
1 авг 16, 16:08    [19482838]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
Задачка на внимательность. Вычислить что вернет запрос не запуская.

create table t as select 1 a, 2 b from dual
create table t1 as select 3 c, 4 d from dual

with t as (select t1.*, -2 y from hr.t1)
select *
  from (with t1
             as (select t0.*, -1 x
                   from hr.t t0)
        select *
          from t1),
       t,
       t1;

+
with z as (select * from dual)
select *        
from non_existent_schema.z
1 авг 16, 20:05    [19483887]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
invisiblesereja
Member

Откуда:
Сообщений: 6
Я вот думаю...
Если мне нужно посчитать количество не всех строк таблицы, а строк с определенным значением параметра, то я использую вот такую конструкцию:

select test_user, sum(case when test_param = 'Y' then 1 else 0 end)
  from test_table
 where 1=1
 group by test_user


А проще как-нибудь можно?
1 авг 16, 22:32    [19484232]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 53418
invisiblesereja
Я вот думаю...
Если мне нужно посчитать количество не всех строк таблицы, а строк с определенным значением параметра, то я использую вот такую конструкцию:

select test_user, sum(case when test_param = 'Y' then 1 else 0 end)
  from test_table
 where 1=1
 group by test_user


А проще как-нибудь можно?

по каждому юзверю?
select test_user, count(*)
  from test_table
 where test_param = 'Y'
 group by test_user
1 авг 16, 22:48    [19484272]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
check x in (Y, N)
Guest
invisiblesereja,

count(replace(x, 'N'))
1 авг 16, 23:16    [19484320]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
_S_T_O_N_E_
Member

Откуда: Moscow
Сообщений: 196
а так нельзя?

select test_user, count (*)
  from test_table
 where test_param = 'Y'
 group by test_user;
2 авг 16, 09:45    [19484961]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
invisiblesereja
Member

Откуда:
Сообщений: 6
Нужно мне было написать запрос к таблице, в которой ФИО хранится в одном столбце, а вывести нужно было каждое отдельно.
Извратился так:

       initcap(substr(sname,1,instr(sname,' ')-1)) "Фамилия",
       initcap(substr(sname,instr(sname,' ')+1,instr(sname,' ',instr(sname,' ',instr(sname,' ')+1))-1-instr(sname,' '))) "Имя",
       initcap(substr(sname,instr(sname,' ',instr(sname,' ',instr(sname,' ')+1))+1,length(sname))) "Отчество",


А проще нельзя?
4 авг 16, 15:51    [19499931]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29674
invisiblesereja
А проще нельзя?
Учи регулярусы.
4 авг 16, 15:53    [19499944]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6 7 8 9 10 .. 38   вперед  Ctrl
Все форумы / Oracle Ответить