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

Откуда: Запорожье
Сообщений: 54120
Надфиль
andreymx

такой констрейнт кому-то нужен?

Почему нет? дерево, например, запилить, ссылочку на родителя.
ну, разве что когда родитель сам же и сын и дед
тогда да
30 янв 20, 09:56    [22069252]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Надфиль
Member

Откуда:
Сообщений: 226
andreymx
ну, разве что когда родитель сам же и сын и дед
тогда да

не придирайся)
с утра не рассмотрел что поле тоже самое.
ну что ж, моей шизы не хватает, чтобы придумать как это использовать для дела.
30 янв 20, 10:32    [22069304]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
test1failed
Member

Откуда:
Сообщений: 1
Добрый день! Подскажите, пожалуйста, как выполнить такую настройку, чтобы при переходе между элементами списка (который формирует tab bar) можно было сохранять заданные свойства формы без потерь? В разных элементах бара заполняются разные части одной строки исходной таблицы с базе. Нужно сделать так, чтобы пользователь мог безболезненно переключаться, пока заполняет данные, а при нажатии кнопки "сохранить изменения", всё заполненное на разных элементах публиковалось в БД. Может быть, кто-то знает видео для решения подобной задачи. Спасибо.
30 янв 20, 19:20    [22069825]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Elic
Member [заблокирован]

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29861
test1failed
как выполнить такую настройку, чтобы при переходе между элементами списка
Чудак, во-первых, это "курилка", где отвлекаются от работы, а не решают чьи-то дебильные вопросы.
Во-вторых, стань по другую сторону барьера, и прочти, что ты спросил. - Никакой конкретики. RTFM
В-третьих, для своих вопросов нужно создавать свои темы, а не залезать в чужие и, к тому же, абсолютно нерелевантно.

P.S. Ты провалил не только тест, но и почин.
31 янв 20, 07:46    [22070110]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54120
http://datareview.info/article/8-sposobov-obedineniya-join-tablic-v-sql-chast-2/

Как сказал Лукас Эдер (Lukas Eder): «Никогда не используйте предикат NOT IN в SQL, за исключением тех случаев, когда вы указали в нем константные, не содержащие NULL значения».


--------



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

Я в шоке
Какого хрена администратор будет что-то отключать или включать в моей зоне ответственности?

Сообщение было отредактировано: 1 фев 20, 00:22
1 фев 20, 00:22    [22070692]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Elic
Member [заблокирован]

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29861
andreymx
Какого хрена администратор будет что-то отключать или включать в моей зоне ответственности?
У вас разное представление о распределении трудовых обязанностей.
1 фев 20, 08:32    [22070733]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18323
Ну добавить индекс администратор иногда еще может, но снимать ограничения -- это очень креативный администратор
1 фев 20, 09:22    [22070736]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54120
Elic
andreymx
Какого хрена администратор будет что-то отключать или включать в моей зоне ответственности?
У вас разное представление о распределении трудовых обязанностей.
сидит админы, мониторит бд

О! А не убрать ли мне нот налл в этом поле? Всё равно прогеры не узнают, кто их болезных на прод пустит
1 фев 20, 09:23    [22070737]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54120
SELECT nvl(SUM(NVL(DK.SUMMA,0)),0) summav
на всякий случай
11 фев 20, 14:58    [22077659]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Надфиль
Member

Откуда:
Сообщений: 226
andreymx
SELECT nvl(SUM(NVL(DK.SUMMA,0)),0) summav
на всякий случай

ну не смешно, есть у меня программист, который только так и пишет. поубивал бы
11 фев 20, 16:49    [22077736]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Кобанчег
Member

Откуда: Рахів
Сообщений: 768
Мне примерно в 2012-2013 году попадался пост вроде авторства Льюиса на тему:
что лучше использовать как метку "маскимальной даты" - date '9999-12-31' или null.
И он утверждал что null лучше. Причина очевидна - потому что Оракл отдельно считает num_nulls для столбца при сборе статистики
и кардинальность предиката dt is null намного точнее чем dt = date '9999-12-31'.
Но там были еще какие-то размышления, а найти сходу не удается.
Кому-нибудь попадалось?
13 фев 20, 18:01    [22079482]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Кобанчег
Member

Откуда: Рахів
Сообщений: 768
Это особенно актально для столбца который содержит дату обновления записи если она более неактивна, а мы хотим выбрать только активные.
13 фев 20, 18:04    [22079483]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Alexander Anokhin
Member

Откуда: Хабаровск
Сообщений: 494
Кобанчег
Мне примерно в 2012-2013 году попадался пост вроде авторства Льюиса на тему:
что лучше использовать как метку "маскимальной даты" - date '9999-12-31' или null.
И он утверждал что null лучше. Причина очевидна - потому что Оракл отдельно считает num_nulls для столбца при сборе статистики
и кардинальность предиката dt is null намного точнее чем dt = date '9999-12-31'.
Но там были еще какие-то размышления, а найти сходу не удается.
Кому-нибудь попадалось?


На днях как раз на багу наступил из этой области.
+ testcase
drop table t1;
create table t1 (m number, d date, n number, v varchar2(100));

insert /*+ append */
into t1
  with q1k as
   (select * from dual connect by level <= 1000),
  q10k as
   (select * from dual connect by level <= 10000)
  select mod(rownum, 2),
         null,
         DBMS_RANDOM.value(low => 1, high => 10000000),
         rpad('*', 100, '*') pad
    from q1k, q10k;

commit;

create index i1 on t1(m, d, n) parallel 8;



12с и выше
select --+ gather_plan_statistics
       count(v)
  from t1
 where m = 0
   and nvl(d, to_date('31.12.2099', 'dd.mm.yyyy')) > sysdate;

select * from table(dbms_xplan.display_cursor(null,null,'iostats last cost'));

--------------------------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name | Starts | E-Rows | Cost (%CPU)| A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |      |      1 |        | 25555 (100)|      1 |00:00:06.97 |    5025K|
|   1 |  SORT AGGREGATE                      |      |      1 |      1 |            |      1 |00:00:06.97 |    5025K|
|   2 |   TABLE ACCESS BY INDEX ROWID BATCHED| T1   |      1 |    250K| 25555   (1)|   5000K|00:00:07.30 |    5025K|
|*  3 |    INDEX RANGE SCAN                  | I1   |      1 |      1 | 25555   (1)|   5000K|00:00:01.02 |   25128 |
--------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   3 - access("M"=0)
       filter(NVL("D",TO_DATE(' 2099-12-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))>SYSDATE@!)


11.2.0.4 и ниже по умолчанию, или 12c и выше with fix 7174435 disabled
alter session set "_fix_control"="7174435:0";

select --+ gather_plan_statistics
       count(v)
  from t1
 where m = 0
   and nvl(d, to_date('31.12.2099', 'dd.mm.yyyy')) > sysdate;

select * from table(dbms_xplan.display_cursor(null,null,'iostats last cost'));

-------------------------------------------------------------------------------------------------------------------
| Id  | Operation                  | Name | Starts | E-Rows | Cost (%CPU)| A-Rows |   A-Time   | Buffers | Reads  |
-------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT           |      |      1 |        | 29446 (100)|      1 |00:00:00.53 |     181K|    181K|
|   1 |  SORT AGGREGATE            |      |      1 |      1 |            |      1 |00:00:00.53 |     181K|    181K|
|*  2 |   TABLE ACCESS STORAGE FULL| T1   |      1 |    250K| 29446   (1)|   5000K|00:00:00.53 |     181K|    181K|
-------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - storage(("M"=0 AND NVL("D",TO_DATE(' 2099-12-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))>SYSDATE@!))
       filter(("M"=0 AND NVL("D",TO_DATE(' 2099-12-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))>SYSDATE@!))


если форсировать индекс, чтобы видеть цифры по индексу
alter session set "_fix_control"="7174435:0";

select --+ gather_plan_statistics index(t1)
       count(v)
  from t1
 where m = 0
   and nvl(d, to_date('31.12.2099', 'dd.mm.yyyy')) > sysdate;

select * from table(dbms_xplan.display_cursor(null,null,'iostats last cost'));

--------------------------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name | Starts | E-Rows | Cost (%CPU)| A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |      |      1 |        |   275K(100)|      1 |00:00:07.14 |    5025K|
|   1 |  SORT AGGREGATE                      |      |      1 |      1 |            |      1 |00:00:07.14 |    5025K|
|   2 |   TABLE ACCESS BY INDEX ROWID BATCHED| T1   |      1 |    250K|   275K  (1)|   5000K|00:00:07.46 |    5025K|
|*  3 |    INDEX RANGE SCAN                  | I1   |      1 |    250K| 25555   (1)|   5000K|00:00:01.02 |   25128 |
--------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   3 - access("M"=0)
       filter(NVL("D",TO_DATE(' 2099-12-31 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))>SYSDATE@!)


fix 7174435 это "Adjust for nulls for index filter predicate selectivity"
SQL> select bugno, value, sql_feature, description, optimizer_feature_enable, is_default from v$system_fix_control where bugno = 7174435;

     BUGNO      VALUE SQL_FEATURE                    DESCRIPTION                                                      OPTIMIZER_FEATURE_ENABLE  IS_DEFAULT
---------- ---------- ------------------------------ ---------------------------------------------------------------- ------------------------- ----------
   7174435          1 QKSFM_CARDINALITY_7174435      Adjust for nulls for index filter predicate selectivity          11.2.0.4                           1
хотя OFE указано 11.2.0.4, появился он в 12.1


Короче, в фиксе 7174435 не учли, что не всегда надо Adjust for nulls for index filter predicate selectivity делать.
13 фев 20, 18:46    [22079514]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18065
Кобанчег
Это особенно актально для столбца который содержит дату обновления записи если она более неактивна, а мы хотим выбрать только активные.

Как быть, если:
- дата - ключ секционирования:
- дата - ключ для отбора незначительного на фоне истории количества актуальных записей и хотелось бы индексного доступа
13 фев 20, 19:41    [22079546]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Кобанчег
Member

Откуда: Рахів
Сообщений: 768
andrey_anonymous
Кобанчег
Это особенно актально для столбца который содержит дату обновления записи если она более неактивна, а мы хотим выбрать только активные.

Как быть, если:
- дата - ключ секционирования:
- дата - ключ для отбора незначительного на фоне истории количества актуальных записей и хотелось бы индексного доступа
1. Затрудняюсь представить реальный сценарий когда дата указывающая актуальность является ключом секционирования.
Но если кто-то хочет иметь одну секцию с актуальными данными и множество с неактуальными (+ надо задействовать миграцию между секциями), то тут конечно 9999 фаворит.
2. Предположим что у нас табличка
t(business_key not null, active_until, <other attributes>) и уникальный ключ по business_key, active_until.
С индексным доступом всё хорошо если интересует актуальная запись по ключу where business_key = :k and dt is null.
Точно также как всё хорошо и если нас просто интересует актуальный снимок where dt is null.
Оракл может юзать INDEX SKIP SCAN INDEX (или INDEX FULL SCAN INDEX) + access по dt is null точно также как и access по предикатам с датой и равенством.

Но вообще null вместо 9999 особо критично когда наоборот актуальных, скажем 99% и надо дать корректную оценку кардинальности, чтоб Оракл соединял с остальными таблицами как HJ а не NL.
13 фев 20, 20:20    [22079566]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Кобанчег
Member

Откуда: Рахів
Сообщений: 768
Alexander Anokhin
nvl(d, to_date('31.12.2099', 'dd.mm.yyyy')) > sysdate
Этот предикат используется для получения актуальных?
А что у вас в системе d может быть больше sysdate?
Почему не просто d is null?
13 фев 20, 20:26    [22079571]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Alexander Anokhin
Member

Откуда: Хабаровск
Сообщений: 494
Кобанчег
Alexander Anokhin
nvl(d, to_date('31.12.2099', 'dd.mm.yyyy')) > sysdate
Этот предикат используется для получения актуальных?
А что у вас в системе d может быть больше sysdate?
Почему не просто d is null?

sysdate это пример.
Это популярный паттерн где дата (D) если установлена, то это дата окончания, а NULL это типа действует, ну и получение актуальных данных сводится к
nvl(d, to_date('31.12.2099', 'dd.mm.yyyy')) > :B 
где :B это переменная с датой актуальности.
13 фев 20, 21:01    [22079585]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18065
Кобанчег
andrey_anonymous
пропущено...

Как быть, если:
- дата - ключ секционирования:
- дата - ключ для отбора незначительного на фоне истории количества актуальных записей и хотелось бы индексного доступа
1. Затрудняюсь представить реальный сценарий когда дата указывающая актуальность является ключом секционирования.
Но если кто-то хочет иметь одну секцию с актуальными данными и множество с неактуальными (+ надо задействовать миграцию между секциями), то тут конечно 9999 фаворит.
2. Предположим что у нас табличка
t(business_key not null, active_until, <other attributes>) и уникальный ключ по business_key, active_until.
С индексным доступом всё хорошо если интересует актуальная запись по ключу where business_key = :k and dt is null

1. Сценарий типовой. Их на самом деле их, "базовых скользящих", два - один для построения инкрементов (partition by dt_from эффективно собирает в одну кучу "свежак"), другой - для построения всяких витрин (partition by dt_till позволяет нормально работать с актуальным срезом )
И нет, "задействовать миграцию между секциями" ни один из этих сценариев не требует.
...по крайнем мере, в моем исполнении ;)

2. Ну тут мне как-то сложно сложить в один сценарий "доступ по business_key" и "чтоб Оракл соединял с остальными таблицами как HJ а не NL.". Либо паттерн OLTP, либо DWH - под какой сценарий хорошо прокатывает null?
13 фев 20, 21:25    [22079597]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18065
Кобанчег
А что у вас в системе d может быть больше sysdate?


...вы будете смеяться… но так тоже бывает.
Нормальным сценарием может быть плановое изменение какой-то записи в будущем времени.
Например, вступление в силу новой редакции какого-либо закона, решения суда или... да просто нового набора конфигурационных параметров - мало ли :)

Я больше скажу. В одной конторе было "так принято" среди продвинутых юзверей при увольнении оставлять в корпоративной системе прощальное сообщение будущей датой. Которое становилось видимым, как правило, на следующий день после того, как уволившийся автор покинул предприятие.
Было забавно :)

Кобанчег
Почему не просто d is null?

Ну если коллегам не лень писать и поддерживать по два комплекта запросов (один - на актуальный срез, другой - на срез во времени) - то, конечно, хозяин-барин, с этим сложно спорить.
...ну и, ессно, не забыть "в первом комплекте" учесть сценарий "документ планово сменит версию завтра".
13 фев 20, 22:03    [22079614]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
-2-
Member

Откуда:
Сообщений: 15330
https://docs.oracle.com/en/database/oracle/oracle-database/20/books.html
14 фев 20, 07:47    [22079716]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Elic
Member [заблокирован]

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29861
-2-
20с
Вкусняшка: "PL/SQL Type Attributes in Non Persistable User Defined Types"
14 фев 20, 09:20    [22079744]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
IMNO
Member

Откуда:
Сообщений: 135
Что думаете?

https://habr.com/ru/post/487622

У поста довольно большой положительный рейтинг.
Плюс, если почитать комментарии, то многие прям хейтят хранимки, и называют их прошлым веком.
Типа "нормальные пацаны" так давно уже не пишут.
14 фев 20, 11:35    [22079831]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
-2-
Member

Откуда:
Сообщений: 15330
IMNO
многие
Когда отсутствуют аргументы, взывают к статистике.
14 фев 20, 12:02    [22079862]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Valergrad
Member

Откуда:
Сообщений: 697
IMNO
Что думаете?

https://habr.com/ru/post/487622

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


В комментариях многие резонно указали ему на его ошибки.
Рейтинг же на хабре ( на наверное и где бы то ни было ) ничего не значит.
14 фев 20, 17:34    [22080243]     Ответить | Цитировать Сообщить модератору
 Re: Курилка  [new]
Elic
Member [заблокирован]

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29861
LISTAGG(…) [ WITHIN GROUP (order by …) ]
SQL> select listagg(level, '-') from dual connect by level <= 3;

LISTAGG(LEVEL,'-')
----------------------------------------------------------------
1-2-3
Работает с 18с. Неудачно задокументировано с 19с.
14 фев 20, 18:13    [22080272]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 30 31 32 33 34 35 [36] 37 38 39   вперед  Ctrl
Все форумы / Oracle Ответить