powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему кляуза where не работатет?
19 сообщений из 19, страница 1 из 1
Почему кляуза where не работатет?
    #37135326
aleksandy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скрипт для заполнения таблицы тестовыми данными.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
insert into table
  select 
      t.field_id
    , t.pos
    , t.value
    from (
      select 
          case when dbms_random.value < . 25  then null else floor(dbms_random.value(min_id, max_id)) end field_id
        , case when dbms_random.value < . 4  then  0  else floor(dbms_random.value( 1 , max_pos)) end pos
        , dbms_random.string(null, floor(dbms_random.value( 5 ,  15 ))) value
        from (
          select 
               1  min_id
            , floor(dbms_random.value( 5 ,  25 )) max_id
            , floor(dbms_random.value( 2 ,  6 )) max_pos
            from dual
        ) f
        connect by level <  200 
    ) t
    where t.field_id is not null
Используется Oracle 10XE. В результате в таблице имеются записи с field_id is null. Почему???
...
Рейтинг: 0 / 0
Почему кляуза where не работатет?
    #37135364
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksandy,
Потому что порядок проверки предикатов не гарантирован. Возможно он его трасформировал.
Материализуй внутренний подзапрос и будет тебе счастье )
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
  select 
      t.field_id
    , t.pos
    , t.value
    from (
      select ROWNUM, -- materialize
          case when dbms_random.value < . 25  then null else floor(dbms_random.value(min_id, max_id)) end field_id
        , case when dbms_random.value < . 4  then  0  else floor(dbms_random.value( 1 , max_pos)) end pos
        , dbms_random.string(null, floor(dbms_random.value( 5 ,  15 ))) value
        from (
          select 
               1  min_id
            , floor(dbms_random.value( 5 ,  25 )) max_id
            , floor(dbms_random.value( 2 ,  6 )) max_pos
            from dual
        ) f
        connect by level <  5 
    ) t
    where t.field_id is NOT null
...
Рейтинг: 0 / 0
Почему кляуза where не работатет?
    #37135367
брадобрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очисть таблицу, заинсерть туда, сделай селект и все это в виде лога нам покажи.
тут джентельменов нет, на слово верить.
все злые, особенно некий Elic
...
Рейтинг: 0 / 0
Почему кляуза where не работатет?
    #37135368
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksandy,

Их точно там раньше не было?
...
Рейтинг: 0 / 0
Почему кляуза where не работатет?
    #37135378
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQLaleksandy,
Потому что порядок проверки предикатов не гарантирован. Возможно он его трасформировал.
Материализуй внутренний подзапрос и будет тебе счастье )
Какая глупость.
...
Рейтинг: 0 / 0
Почему кляуза where не работатет?
    #37135380
Фотография pravednik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQL,

На XE повторяется, на 10,2,0,5 - полет нормальный
...
Рейтинг: 0 / 0
Почему кляуза where не работатет?
    #37135385
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksandy,

интересно было бы посмотреть на runtime execution plan, скорее всего там что-то вроде
Код: plaintext
case when dbms_random.value < . 25  then null else floor(dbms_random.value(min_id, max_id)) end is not null

решение проблемы, как уже сказали - материализация
...
Рейтинг: 0 / 0
Почему кляуза where не работатет?
    #37135390
Фотография pravednik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|ORA__SQLaleksandy,
Потому что порядок проверки предикатов не гарантирован. Возможно он его трасформировал.
Материализуй внутренний подзапрос и будет тебе счастье )
Какая глупость.
которая все же работает )
...
Рейтинг: 0 / 0
Почему кляуза where не работатет?
    #37135392
Фотография Corner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
SQL> create table test as
   2     select
   3         t.field_id
   4       , t.pos
   5       , t.value
   6       from (
   7         select
   8             case when dbms_random.value < . 25  then null else floor(dbms_random.value(min_id, max_id)) end field_id
   9           , case when dbms_random.value < . 4  then  0  else floor(dbms_random.value( 1 , max_pos)) end pos
  10           , dbms_random.string(null, floor(dbms_random.value( 5 ,  15 ))) value
  11           from (
  12             select
  13                  1  min_id
  14               , floor(dbms_random.value( 5 ,  25 )) max_id
  15               , floor(dbms_random.value( 2 ,  6 )) max_pos
  16               from dual
  17           ) f
  18           connect by level <  200 
  19       ) t
  20       where t.field_id is not null;

Table created.

SQL> select count(*) from test where field_id is NULL;

  COUNT(*)
----------
          0 

SQL> select * from v$version
   2   ;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release  11 . 2 . 0 . 1 . 0  - 64bit Production
PL/SQL Release  11 . 2 . 0 . 1 . 0  - Production
CORE     11 . 2 . 0 . 1 . 0       Production
TNS for Linux: Version  11 . 2 . 0 . 1 . 0  - Production
NLSRTL Version  11 . 2 . 0 . 1 . 0  - Production
...
Рейтинг: 0 / 0
Почему кляуза where не работатет?
    #37135401
Фотография pravednik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
Oracle Database 10g Express Edition Release  10 . 2 . 0 . 1 . 0  - Production

SQL> create table d as select
   2         t.field_id
   3       , t.pos
   4       , t.value
   5       from (
   6         select
   7             case when dbms_random.value < . 25  then null else floor(dbms_random.value(min_id, max_id)) end field_id
   8           , case when dbms_random.value < . 4  then  0  else floor(dbms_random.value( 1 , max_pos)) end pos
   9           , dbms_random.string(null, floor(dbms_random.value( 5 ,  15 ))) value
  10           from (
  11             select
  12                  1  min_id
  13               , floor(dbms_random.value( 5 ,  25 )) max_id
  14               , floor(dbms_random.value( 2 ,  6 )) max_pos
  15               from dual
  16           ) f
  17           connect by level <  200 
  18       ) t
  19       where t.field_id is not null;

Table created.

SQL> select count(*)  from d where field_id is null;

  COUNT(*)
----------
         37 

SQL> drop table d;

Table dropped.

SQL>  create table d as select
   2             t.field_id
   3           , t.pos
   4           , t.value
   5           from (
   6             select ROWNUM, -- materialize
   7                 case when dbms_random.value < . 25  then null else floor(dbms_random.value(min_id, max_id)) end field_id
   8               , case when dbms_random.value < . 4  then  0  else floor(dbms_random.value( 1 , max_pos)) end pos
   9               , dbms_random.string(null, floor(dbms_random.value( 5 ,  15 ))) value
  10              from (
  11                select
  12                     1  min_id
  13                  , floor(dbms_random.value( 5 ,  25 )) max_id
  14                  , floor(dbms_random.value( 2 ,  6 )) max_pos
  15                  from dual
  16              ) f
  17              connect by level <  200 
  18          ) t
  19          where t.field_id is not null;

Table created.

SQL> select count(*)  from d where field_id is null;

  COUNT(*)
----------
          0 

SQL>
...
Рейтинг: 0 / 0
Почему кляуза where не работатет?
    #37135413
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pravednik,

планы покажете?
...
Рейтинг: 0 / 0
Почему кляуза where не работатет?
    #37135417
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pravednikAlexFF__|пропущено...

Какая глупость.
которая все же работает )
Угумс, это я затормозил )))
...
Рейтинг: 0 / 0
Почему кляуза where не работатет?
    #37135419
aleksandy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexFF__|ORA__SQLМатериализуй внутренний подзапрос и будет тебе счастье )
Какая глупость.
Может и глупость, но работает... ORA__SQL , большое спасибо.
...
Рейтинг: 0 / 0
Почему кляуза where не работатет?
    #37135434
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|pravednikпропущено...

которая все же работает )
Угумс, это я затормозил )))
Надо было сказать, что в этом запросе порядок должен быть соблюден и данный пример есть баг.
Кстати, неоднократно обсуждали на форуме.
...
Рейтинг: 0 / 0
Почему кляуза where не работатет?
    #37135457
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksandyAlexFF__|пропущено...
Какая глупость.
Может и глупость, но работает... ORA__SQL , большое спасибо.
Нет не глупость) По умолчанию гарантии порядка проверки предикатов нет)
Что-то похожее тут
TO_NUMBER в условии WHERE приводит к ORA-01722 как быть?
...
Рейтинг: 0 / 0
Почему кляуза where не работатет?
    #37135512
Фотография pravednik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
envpravednik,

планы покажете?
без материализации
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
SQL>  explain plan for select
   2             t.field_id
   3           , t.pos
   4           , t.value
   5           from (
   6             select
   7                 case when dbms_random.value < . 25  then null else floor(dbms_random.value(min_id, max_id)) end field_id
   8               , case when dbms_random.value < . 4  then  0  else floor(dbms_random.value( 1 , max_pos)) end pos
   9               , dbms_random.string(null, floor(dbms_random.value( 5 ,  15 ))) value
  10              from (
  11                select
  12                     1  min_id
  13                  , floor(dbms_random.value( 5 ,  25 )) max_id
  14                  , floor(dbms_random.value( 2 ,  6 )) max_pos
  15                  from dual
  16              ) f
  17              connect by level <  200 
  18          ) t
  19          where t.field_id is not null;

Explained.

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

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value:  1243202743 

---------------------------------------------------------------------------------------
| Id  | Operation                      | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|    0  | SELECT STATEMENT               |      |      1  |   2028  |      2    ( 0 )|  00 : 00 : 01  |
|    1  |  VIEW                          |      |      1  |   2028  |      2    ( 0 )|  00 : 00 : 01  |
|*   2  |   FILTER                       |      |       |       |            |          |
|    3  |    CONNECT BY WITHOUT FILTERING|      |       |       |            |          |
|    4  |     FAST DUAL                  |      |      1  |       |      2    ( 0 )|  00 : 00 : 01  |
---------------------------------------------------------------------------------------

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

    2  - filter(CASE  WHEN "DBMS_RANDOM"."VALUE"()<. 25  THEN NULL ELSE
              FLOOR("DBMS_RANDOM"."VALUE"( 1 ,FLOOR("DBMS_RANDOM"."VALUE"( 5 , 25 )))) END  IS NOT
              NULL)

 18  rows selected.

с материализацией
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
SQL>  explain plan for select
   2             t.field_id
   3           , t.pos
   4           , t.value
   5           from (
   6             select ROWNUM, -- materialize
   7                 case when dbms_random.value < . 25  then null else floor(dbms_random.value(min_id, max_id)) end field_id
   8               , case when dbms_random.value < . 4  then  0  else floor(dbms_random.value( 1 , max_pos)) end pos
   9               , dbms_random.string(null, floor(dbms_random.value( 5 ,  15 ))) value
  10              from (
  11                select
  12                     1  min_id
  13                  , floor(dbms_random.value( 5 ,  25 )) max_id
  14                  , floor(dbms_random.value( 2 ,  6 )) max_pos
  15                  from dual
  16              ) f
  17              connect by level <  200 
  18          ) t
  19          where t.field_id is not null;

Explained.

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

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value:  761049541 

---------------------------------------------------------------------------------------
| Id  | Operation                      | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|    0  | SELECT STATEMENT               |      |      1  |   2028  |      2    ( 0 )|  00 : 00 : 01  |
|*   1  |  VIEW                          |      |      1  |   2028  |      2    ( 0 )|  00 : 00 : 01  |
|    2  |   COUNT                        |      |       |       |            |          |
|    3  |    CONNECT BY WITHOUT FILTERING|      |       |       |            |          |
|    4  |     FAST DUAL                  |      |      1  |       |      2    ( 0 )|  00 : 00 : 01  |
---------------------------------------------------------------------------------------

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

    1  - filter("T"."FIELD_ID" IS NOT NULL)

 16  rows selected.
...
Рейтинг: 0 / 0
Почему кляуза where не работатет?
    #37135529
брадобрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какая нехрен материализация? какой еще порядок проверки предикатов, овощщи?
читайте классиков
...
Рейтинг: 0 / 0
Почему кляуза where не работатет?
    #37135565
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Почему кляуза where не работатет?
    #37135634
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|,

В тех темах цирюльника не было, поэтому их нельзя считать за классиков.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему кляуза where не работатет?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]