Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 34 35 36 37 38 39 40 [41] 42 43   вперед  Ctrl
 Re: Курилка  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 956
env
НеофитSQL
Еще можно так:

Помимо уже приведённого ограничения, вы действительно считаете, что вызов функции, увеличивающей количество байт для сравнения, на оба операнда - хорошая идея?


Следил за копейкой, рубль не заметил..

Там дело совсем не в лишних байтах для сравнения, хотя если бы этот случай был важен sql оптимизатору, он бы его сделал с такой же скоростью или быстрее.

Возможно, это не сразу очевидно.
6 окт 20, 14:39    [22209557]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7692
НеофитSQL,

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

А отсечку на 4К байт в результате dump комментировать нет смысла.
6 окт 20, 14:57    [22209571]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 956
andreymx
НеофитSQL
Еще можно так:

with tst (ord, val) as (select 1, null from dual union all
                         select 2,   0  from dual union all
                         select 3,   5  from dual )
select * from tst where dump(val) != dump(5)
WITH T AS(
SELECT LPAD('1', 1500, '1') a,
       LPAD('1', 1499, '1')||'2' b
  FROM dual
)
SELECT t.*, 1 FROM T WHERE a=b
UNION ALL
SELECT t.*, 2 FROM T WHERE DUMP(a)=DUMP(b)


SELECT t.*, 2 FROM T WHERE DUMP(a,17)=DUMP(b,17)

;)

Справедливое замечание. Кроме равенства типов, также есть ограничение на максимальный размер сравниваемых объектов, на моем 11.2 распечатка dump() не должна превышать 4000 символов.

Добавлю еще одно ограничение, которое пока не упомянули:
Поскольку Оракл не нормализует мантиссу для десятичного формата, одинаковые числа могут быть представлены в памяти по-разному. Вообще формат NUMBER уникальный, было бы интересно поговорить с тем, кто его изобрел.

with t as (select 100 norm, utl_raw.cast_to_number('c165') denorm from dual)
select 'normal = denormal' from t where norm = denorm union all
select 'does not auto-normalize' from t where dump(norm) != dump(denorm)
6 окт 20, 15:39    [22209617]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 956
env
НеофитSQL,

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


Прими на веру, что сравнение нескольких лишних байтов безболезненно для СУБД.
Источник: занимался тюнингом ОС для их производителя.

LOOPZ в кэше исполняется со скоростью на пару порядков выше чем:
- аллокация переменной для временной строки, дважды
- преобразование байтов объекта в их десятичное или 16-ричное представление

Мой комментарий по поводу оптимизатора сводился к следующему:
если бы у конструкции dump(x)=dump(y) был приоритет к быстрому исполнению,
оптимизатор знал бы что она приравнивается к побитовому сравнению объектов в памяти,
что никогда не медленнее чем сравнение самих объектов.

Я не рекомендую использовать dump() для этих целей, это разговор для курилки, так же как и предложение от SY.
6 окт 20, 15:50    [22209627]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7692
НеофитSQL
Прими на веру, что сравнение нескольких лишних байтов безболезненно для СУБД

Вложенными циклами, на миллионных таблицах, с расчётом скаляра после извлечения данных и до фильтра. Угу, спасибо, проходили.
6 окт 20, 16:13    [22209647]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 58435
env
НеофитSQL
Прими на веру, что сравнение нескольких лишних байтов безболезненно для СУБД

Вложенными циклами, на миллионных таблицах, с расчётом скаляра после извлечения данных и до фильтра. Угу, спасибо, проходили.
в одном учебнике по мсскл автор настойчиво предлагает отказаться от сортировок в бд, ибо это дорого
6 окт 20, 17:29    [22209731]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7692
andreymx,

Как раз на mssql и ловил такое )))
6 окт 20, 17:32    [22209735]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Melkomyagkii_newbi
Member

Откуда: из прошлого
Сообщений: 2112
env
andreymx,

Как раз на mssql и ловил такое )))


в оракле тож не слишком дешево если не лезет в выделенное процессу pga..
6 окт 20, 18:32    [22209779]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 956
env
НеофитSQL
Прими на веру, что сравнение нескольких лишних байтов безболезненно для СУБД

Вложенными циклами, на миллионных таблицах, с расчётом скаляра после извлечения данных и до фильтра. Угу, спасибо, проходили.


Вряд ли. Или что-то не понял.
Скорость сравнения нескольких байт памяти незаметна на фоне аллокации памяти или преобразования числа в текст.
Сравнение двух dump(), как это реализовано в моем Оракле 11.2 - это медленная операция, но совсем не по той причине, что вы подумали.

Мой старенький комп со старенькой шиной памяти на одном ядре сравнивает байты со скоростью 64 МБ/с.
Для типичного вывода dump() (10-20 байт), это одна четвертая микросекунды для одинаковых чисел (худший случай).
На "миллионной таблице" без индекса* это добавит меньше половины секунды для перебора всех строк, если считать копейку.

Теперь рупь:
Тот же комп аллокирует/освобождает строчки в 20 байт со скоростью 16мс на цикл взять-отдать. На "миллионой таблице" без индекса(*) это добавит около 16 секунд - мы считаем только один dump() на строку, в примере вторая часть равенства статична.

Я вам дам шаблон программы, распечатку байтов в ASCII вы сможете оценить сами.

С добавлением преобразования, стоимость сравнения байтов оказалась меньше одного процента от общего замедления.

+
#include <malloc.h>
#include <memory.h>

#define BLOCKSIZE 1024*1024*1024ul

int main()
{
#if 0
  static char a[BLOCKSIZE];
  static char b[BLOCKSIZE];
  int n = 0;

  for( int i = 0 ; i < 1024 ; ++i )
    n += memcmp(a,b,BLOCKSIZE); // stop agressive optimization
#else
 char* p;
  for( int i = 0 ; i < 1024*1024*1024 ; ++i )
  {
    p = malloc(20);
    free(p);
  }
#endif
  return 0;
}


(*) Вы там начинали подмену понятий, поэтому оговорил.
6 окт 20, 19:45    [22209806]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 3279
НеофитSQL


Справедливое замечание.


https://www.google.com/search?q=oracle sys_op_map_nonnul&oq=oracle sys_op_map_nonnul&aqs=chrome..69i57j0.24783j0j15&sourceid=chrome&ie=UTF-8

ps
всетаки я не удержался

.....
stax
7 окт 20, 08:51    [22209914]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7692
НеофитSQL,

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

НеофитSQL
На "миллионной таблице" без индекса*

Без функционального индекса на dump(поле_таблицы)? Не представляю зачем он может понадобиться, а без него индекс использоваться по полю не будет. Зато будет аллоцироваться память под выгребание в память всех строк сравниваемых таблиц + считаться скаляр по функции dump(). Паааадумаешь парой байт больше, да. И так в N сессиях...

+
SQL> create table dropme_t (n number not null, s varchar2(1000));

Table created.

SQL> create index ix_dropme_t_s on dropme_t (s);

Index created.

SQL> insert into dropme_t
  2  select
  3      level,
  4      dbms_random.string('p', 1000)
  5  from
  6      dual
  7  connect by level <= 1e6;

1000000 rows created.

SQL> commit;

Commit complete.

SQL> explain plan for
  2  select t1.*, t2.*
  3  from
  4      dropme_t t1,
  5      dropme_t t2
  6  where
  7      t1.s = t2.s;

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1599386606

--------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------
| Id  | Operation                    | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |               |   941K|   924M|  6762   (1)| 00:00:01 |
|   1 |  NESTED LOOPS                |               |   941K|   924M|  6762   (1)| 00:00:01 |
|   2 |   NESTED LOOPS               |               |   941K|   924M|  6762   (1)| 00:00:01 |
|   3 |    TABLE ACCESS STORAGE FULL | DROPME_T      |   941K|   462M|  6756   (1)| 00:00:01 |
|*  4 |    INDEX RANGE SCAN          | IX_DROPME_T_S |     1 |       |     0   (0)| 00:00:01 |
|   5 |   TABLE ACCESS BY INDEX ROWID| DROPME_T      |     1 |   515 |     0   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   4 - access("T1"."S"="T2"."S")

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)

21 rows selected.

SQL> explain plan for
  2  select t1.*, t2.*
  3  from
  4      dropme_t t1,
  5      dropme_t t2
  6  where
  7     dump(t1.s) = dump(t2.s);

Explained.

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 968727100

-----------------------------------------------------------------------------------------------
| Id  | Operation                  | Name     | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |          |  8865M|  8503G|       | 80465  (32)| 00:00:04 |
|*  1 |  HASH JOIN                 |          |  8865M|  8503G|   473M| 80465  (32)| 00:00:04 |
|   2 |   TABLE ACCESS STORAGE FULL| DROPME_T |   941K|   462M|       |  6756   (1)| 00:00:01 |
|   3 |   TABLE ACCESS STORAGE FULL| DROPME_T |   941K|   462M|       |  6756   (1)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - access(DUMP("T1"."S")=DUMP("T2"."S"))

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)

19 rows selected.


Сообщение было отредактировано: 7 окт 20, 09:28
7 окт 20, 09:29    [22209930]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 956
env,

TL;DR.

Быстрое решение с nvl я написал сразу, оно очевидно и малоинтересно для курилки.

Интересно было сделать решение в духе предложенного SY, но без контекстного перехода вызова библиотечной функции.

Давай ты будешь что-то упорно доказывать (с ошибками) новичкам в других темах, а в курилке просто поболтаем.
7 окт 20, 15:42    [22210261]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
НеофитSQL
Member [заблокирован]

Откуда: Маями
Сообщений: 956
Stax


https://www.google.com/search?q=oracle sys_op_map_nonnul&oq=oracle sys_op_map_nonnul&aqs=chrome..69i57j0.24783j0j15&sourceid=chrome&ie=UTF-8

ps
всетаки я не удержался

.....
stax


А ларчик просто открывался. Спасибо, расширили мой кругозор. И похоже, не только мой. ++

Интересно, на каком году работы с SQL люди открывают для себя такую полезную встроенную функцию?
7 окт 20, 15:49    [22210272]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7692
НеофитSQL
Интересно было сделать решение в духе предложенного SY

Интересно, да. Жаль, не сделали.

НеофитSQL
Давай ты будешь что-то упорно доказывать (с ошибками) новичкам в других темах

Я где-то написал, что никогда не ошибаюсь? Можно цитату? Или это очередной соломенный аргумент для перевода темы?

Сообщение было отредактировано: 7 окт 20, 15:47
7 окт 20, 15:50    [22210274]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7692
НеофитSQL
TL;DR.

Да. Это и видно.
7 окт 20, 15:54    [22210276]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7692
НеофитSQL
такую полезную встроенную функцию?

Недокументированную, поведение которой может измениться в любом следующем релизе. Действительно.

Хотя гораздо "веселее" людям, которым потом придётся чинить упавший код построенный на таких полезных функциях, угадывая, как они должны были работать. Применимо для разовых случаев, когда разработчик понимает, что и зачем он использует, но не более того.
7 окт 20, 16:03    [22210285]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 58435
почти хинт

К сообщению приложен файл. Размер - 50Kb
23 окт 20, 20:33    [22219821]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 58435
пытаемся перенести старинный StarTeam-2005 на Оракл-11.2

Валится админка на коннекте
выдает ошибку в пакете - стринг буфер ту смолл

обрабатываю, запускаем заново - а ошибка старая и никак не меняется...
Оказалось, эта сволочь при старте каждый раз восстанавливает пакеты!
2 дек 20, 17:49    [22241543]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7692
andreymx,

запили джобу, меняющую пакет обратно
2 дек 20, 18:02    [22241550]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 58435
env
andreymx,

запили джобу, меняющую пакет обратно
это сволочь его компилит и тут же использует
разве что триггер на компайл
2 дек 20, 18:05    [22241553]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 58435
еще и компилит в одну строку... все ошибки на строке №1

мы с админами друг друга чуть не поубивали
я говорю, что добавил обработку и расширил переменные - мне говорят, добавь обработку и расширь переменные!

Сообщение было отредактировано: 2 дек 20, 18:03
2 дек 20, 18:07    [22241555]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 58435
andreymx
еще и компилит в одну строку... все ошибки на строке №1

мы с админами друг друга чуть не поубивали
я говорю, что добавил обработку и расширил переменные - мне говорят, добавь обработку и расширь переменные!
нашел место, где хранились исходники процедур на самом сервере
там исправил, так что эта процедура наконец-то выполнилась нормально

прикольно было, когда одну строчку закомментарил посредством двух минусов --
он же выбрасывает все переводы строки при компиляции...
2 дек 20, 23:41    [22241690]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Egoр
Member

Откуда:
Сообщений: 844
andreymx
env
andreymx,

запили джобу, меняющую пакет обратно
это сволочь его компилит и тут же использует
разве что триггер на компайл

Что с ORA-04068? Джобу не мешает?
3 дек 20, 12:48    [22241851]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 7692
Egoр
Что с ORA-04068

На фоне
andreymx
Валится админка на коннекте

выглядит менее критично

Сообщение было отредактировано: 3 дек 20, 14:20
3 дек 20, 14:25    [22241950]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 58435
env
andreymx
Валится админка на коннекте

нашел ночью репозиторий исходных БД-кодов, на основании того репозитория идет синхронизация исходных кодов с БД
поправил в репозитории пакет
уже и ошибка не валится
даже всё заработало стараниями двух админов и моими )
тестируем
3 дек 20, 14:42    [22241966]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 34 35 36 37 38 39 40 [41] 42 43   вперед  Ctrl
Все форумы / Oracle Ответить