Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему кляуза where не работатет? / 19 сообщений из 19, страница 1 из 1
25.02.2011, 11:43
    #37135326
aleksandy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему кляуза where не работатет?
Скрипт для заполнения таблицы тестовыми данными.
Код: 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
25.02.2011, 11:51
    #37135364
ORA__SQL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему кляуза where не работатет?
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
25.02.2011, 11:51
    #37135367
брадобрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему кляуза where не работатет?
очисть таблицу, заинсерть туда, сделай селект и все это в виде лога нам покажи.
тут джентельменов нет, на слово верить.
все злые, особенно некий Elic
...
Рейтинг: 0 / 0
25.02.2011, 11:51
    #37135368
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему кляуза where не работатет?
aleksandy,

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

На XE повторяется, на 10,2,0,5 - полет нормальный
...
Рейтинг: 0 / 0
25.02.2011, 11:54
    #37135385
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему кляуза where не работатет?
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
25.02.2011, 11:55
    #37135390
pravednik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему кляуза where не работатет?
AlexFF__|ORA__SQLaleksandy,
Потому что порядок проверки предикатов не гарантирован. Возможно он его трасформировал.
Материализуй внутренний подзапрос и будет тебе счастье )
Какая глупость.
которая все же работает )
...
Рейтинг: 0 / 0
25.02.2011, 11:55
    #37135392
Corner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему кляуза where не работатет?
Код: 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
25.02.2011, 11:57
    #37135401
pravednik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему кляуза where не работатет?
Код: 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
25.02.2011, 12:00
    #37135413
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему кляуза where не работатет?
pravednik,

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

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

которая все же работает )
Угумс, это я затормозил )))
Надо было сказать, что в этом запросе порядок должен быть соблюден и данный пример есть баг.
Кстати, неоднократно обсуждали на форуме.
...
Рейтинг: 0 / 0
25.02.2011, 12:09
    #37135457
ORA__SQL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему кляуза where не работатет?
aleksandyAlexFF__|пропущено...
Какая глупость.
Может и глупость, но работает... ORA__SQL , большое спасибо.
Нет не глупость) По умолчанию гарантии порядка проверки предикатов нет)
Что-то похожее тут
TO_NUMBER в условии WHERE приводит к ORA-01722 как быть?
...
Рейтинг: 0 / 0
25.02.2011, 12:22
    #37135512
pravednik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему кляуза where не работатет?
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
25.02.2011, 12:25
    #37135529
брадобрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему кляуза where не работатет?
какая нехрен материализация? какой еще порядок проверки предикатов, овощщи?
читайте классиков
...
Рейтинг: 0 / 0
25.02.2011, 12:34
    #37135565
AlexFF__|
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему кляуза where не работатет?
...
Рейтинг: 0 / 0
25.02.2011, 12:51
    #37135634
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему кляуза where не работатет?
AlexFF__|,

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


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