Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Oracle |
![]() ![]() |
Топик располагается на нескольких страницах: ←Ctrl назад 1 2 3 4 [5] 6 7 8 9 10 .. 42 вперед Ctrl→ |
Elic Member Откуда: Сообщений: 30057 |
|
||
31 май 16, 17:17 [19242358] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 54845 |
Сравнивал некие объекты на двух БД. Под объектом имеется в виду данные по определённым параметрам в 15 разных таблицах Нашел функцию fn_gen_inserts, выгружающую в CLOB данные селекта в виде инсерта Подёргал, в 20 раз ускорил, в 5 раз уменьшил получаемый функцией код Набросал пакет, слепил общий скрипт, выдрал у одминов права на dbms_crypto для хешей (пока так буду сравнивать, хоть и моветон) Сравнил продакт и свой тест - все зашибись, что за день накорректировали, сразу увидел Начала сравнивать две свои продакшн-БД - и тут оказалось, что ключевой параметр - id комплекса - как раз не совпадает. 21 и 121. Хеши не совпадают, всё не совпадает :) :( |
19 июл 16, 19:02 [19428704] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 54845 |
|
||
19 июл 16, 19:03 [19428707] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 54845 |
оказывается, скобки имеют значение при конкатенации с 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] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 54845 |
неявное и неудачное преобразование типов |
20 июл 16, 15:37 [19431638] Ответить | Цитировать Сообщить модератору |
s u Member Откуда: Сообщений: 741 |
не говоря о том что конкатинация через || к клобу вообще не приемлема, в 1-м случае конкатенируем 3 раза к клобу против одной конкатинации во втором примере.. вот и объяснение.. |
||
20 июл 16, 17:34 [19432253] Ответить | Цитировать Сообщить модератору |
s u Member Откуда: Сообщений: 741 |
попрвил
|
||
20 июл 16, 17:37 [19432261] Ответить | Цитировать Сообщить модератору |
Вячеслав Любомудров Member Откуда: Владивосток Сообщений: 18527 |
А вообще -- действительно интересно. Попробовал на Спарках (9.2-11.2) и x86 (11.2) -- везде разница в разы (десятки раз)
|
|||||||
21 июл 16, 04:45 [19433914] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: Сообщений: 30057 |
задачка на длинную пятницу для настоящих бойцов (pl/sql) |
||
21 июл 16, 07:50 [19434020] Ответить | Цитировать Сообщить модератору |
Вячеслав Любомудров Member Откуда: Владивосток Сообщений: 18527 |
Не совсем так. У меня под спойлером код немного другой Там любая конкатенация вызовет конкатенацию/преобразование с/в CLOB, ибо размерчик строки VARCHAR2 уже под 32к. Либо оно "внутре" умеет больше 32к. По-моему, это (или что-то подобное) уже обсуждалось, но не могу вспомнить где |
21 июл 16, 13:09 [19435900] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: Сообщений: 30057 |
|
||
21 июл 16, 13:40 [19436211] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: Сообщений: 30057 |
Из древнейших: Максимальная длина VARCHAR2 в параметрах |
21 июл 16, 13:41 [19436226] Ответить | Цитировать Сообщить модератору |
s u Member Откуда: Сообщений: 741 |
имелась ввиду производительность, а не валидность операции |
||||
21 июл 16, 15:54 [19437396] Ответить | Цитировать Сообщить модератору |
Вячеслав Любомудров Member Откуда: Владивосток Сообщений: 18527 |
Имеется ввиду без изменения алгоритма. DBMS_LOB.APPEND работает не быстрее |
||||||||
22 июл 16, 03:43 [19439402] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: Сообщений: 30057 |
|
||
22 июл 16, 09:31 [19439733] Ответить | Цитировать Сообщить модератору |
Вячеслав Любомудров Member Откуда: Владивосток Сообщений: 18527 |
Это понятно Я думал, ![]() |
22 июл 16, 09:43 [19439799] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 54845 |
|
||||
22 июл 16, 10:39 [19440078] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 54845 |
работу предлагают одминам https://www.sql.ru/forum/1225026 |
1 авг 16, 16:08 [19482838] Ответить | Цитировать Сообщить модератору |
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;
|
|
1 авг 16, 20:05 [19483887] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
andreymx Member Откуда: Запорожье Сообщений: 54845 |
по каждому юзверю? select test_user, count(*) from test_table where test_param = 'Y' group by test_user |
||
1 авг 16, 22:48 [19484272] Ответить | Цитировать Сообщить модератору |
check x in (Y, N)
Guest |
invisiblesereja, count(replace(x, 'N')) |
1 авг 16, 23:16 [19484320] Ответить | Цитировать Сообщить модератору |
_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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: Сообщений: 30057 |
|
||
4 авг 16, 15:53 [19499944] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: ←Ctrl назад 1 2 3 4 [5] 6 7 8 9 10 .. 42 вперед Ctrl→ |
Все форумы / Oracle | ![]() |