Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2042
Простите за, возможно, дурацкий вопрос, но

Допустим, есть два запроса:
первый
select * from net_element where id = :x
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 227 | 3 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| NET_ELEMENT | 1 | 227 | 3 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | PK_NET_ELEMENT | 1 | | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

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

2 - access("ID"=TO_NUMBER(:X))

и второй
select * from net_element where id = null
----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 227 | 0 (0)| |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL| NET_ELEMENT | 3050K| 660M| 120K (2)| 00:24:09 |
----------------------------------------------------------------------------------

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

1 - filter(NULL IS NOT NULL)

вопрос:
поймет ли СУБД, что не надо ничего делать в случае, если :X=NULL ?
31 янв 13, 15:49    [13857852]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
Кристобаль Хозевич
Member

Откуда: тутошний
Сообщений: 250
--Eugene--
возможно, дурацкий вопрос

Даже не сомневайся.
31 янв 13, 16:14    [13858018]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1031
--Eugene--
поймет ли СУБД, что не надо ничего делать в случае, если :X=NULL ?

+ походу - да

SQL> create table test as select level val from dual connect by level <= 1e5;

Table created.

SQL> set autot trace stat
SQL> var id number
[skipped]выполнил запрос, чтоб хардпарс в статистику не попал[/skipped]
SQL> exec :id := null;

PL/SQL procedure successfully completed.

SQL>  select * from test where val = :id;

no rows selected


Statistics
----------------------------------------------------------
          5  recursive calls
          0  db block gets
         54  consistent gets
          0  physical reads
          0  redo size
        226  bytes sent via SQL*Net to client
        329  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

SQL>  exec :id := 1;

PL/SQL procedure successfully completed.

SQL> select * from test where val = :id;


Statistics
----------------------------------------------------------
         36  recursive calls
          4  db block gets
        227  consistent gets
          0  physical reads
          0  redo size
        345  bytes sent via SQL*Net to client
        431  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          4  sorts (memory)
          0  sorts (disk)
          1  rows processed

31 янв 13, 16:27    [13858084]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 4849
--Eugene--,

Выполни запрос со статистиками времени выполнения и посмотри сколько раз стартанул (Starts) пункта плана (2 - TABLE ACCESS FULL) во втором случае.
31 янв 13, 16:30    [13858102]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
xtender
Member

Откуда: Мск
Сообщений: 4587
Помимо наличия фильтра, который зависит от типа предикатов, количество "работы" еще зависит и от типа операции, например, access или filter предикат, хочешь быть уверен добавляй отдельный предикат ":X is not null"
+
SQL> alter session set optimizer_dynamic_sampling=0;
SQL> alter session set statistics_level=all;
SQL> create table xt_test as select 1 i from dual;

Table created.

SQL> var a number;
SQL> -- NULL 1:
SQL> select * from xt_test where i=:a;

no rows selected

SQL> select * from table(dbms_xplan.display_cursor('','','ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------
SQL_ID  4rjbsjvwbq5m0, child number 0
-------------------------------------
select * from xt_test where i=:a

Plan hash value: 3713359643

---------------------------------------------------------------------------------------
| Id  | Operation         | Name    | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |      1 |        |      0 |00:00:00.01 |       1 |
|*  1 |  TABLE ACCESS FULL| XT_TEST |      1 |      3 |      0 |00:00:00.01 |       1 |
---------------------------------------------------------------------------------------

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

   1 - filter("I"=:A)


18 rows selected.

SQL> -- NOT NULL 1:
SQL> exec :a := 0;

PL/SQL procedure successfully completed.

SQL> select * from xt_test where i=:a;

no rows selected

SQL> select * from table(dbms_xplan.display_cursor('','','ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------
SQL_ID  4rjbsjvwbq5m0, child number 0
-------------------------------------
select * from xt_test where i=:a

Plan hash value: 3713359643

------------------------------------------------------------------------------------------------
| Id  | Operation         | Name    | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |      1 |        |      0 |00:00:00.01 |       3 |      1 |
|*  1 |  TABLE ACCESS FULL| XT_TEST |      1 |      3 |      0 |00:00:00.01 |       3 |      1 |
------------------------------------------------------------------------------------------------

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

   1 - filter("I"=:A)


18 rows selected.

SQL> alter table xt_test add primary key(i);

Table altered.

SQL> exec :a := null;

PL/SQL procedure successfully completed.

SQL> -- NULL 2:
SQL> select * from xt_test where i=:a;

no rows selected

SQL> select * from table(dbms_xplan.display_cursor('','','ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------
SQL_ID  4rjbsjvwbq5m0, child number 0
-------------------------------------
select * from xt_test where i=:a

Plan hash value: 136758570

-----------------------------------------------------------------------------------
| Id  | Operation         | Name          | Starts | E-Rows | A-Rows |   A-Time   |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |               |      1 |        |      0 |00:00:00.01 |
|*  1 |  INDEX UNIQUE SCAN| SYS_C00161305 |      1 |      1 |      0 |00:00:00.01 |
-----------------------------------------------------------------------------------

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

   1 - access("I"=:A)


18 rows selected.

SQL> exec :a := 0;

PL/SQL procedure successfully completed.

SQL> -- NOT NULL 2:
SQL> select * from xt_test where i=:a;

no rows selected

SQL> select * from table(dbms_xplan.display_cursor('','','ALLSTATS LAST'));

PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------
SQL_ID  4rjbsjvwbq5m0, child number 0
-------------------------------------
select * from xt_test where i=:a

Plan hash value: 136758570

---------------------------------------------------------------------------------------------
| Id  | Operation         | Name          | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
---------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |               |      1 |        |      0 |00:00:00.01 |       1 |
|*  1 |  INDEX UNIQUE SCAN| SYS_C00161305 |      1 |      1 |      0 |00:00:00.01 |       1 |
---------------------------------------------------------------------------------------------

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

   1 - access("I"=:A)


18 rows selected.
31 янв 13, 17:49    [13858410]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
ranger@VR6
Member

Откуда: Moscow
Сообщений: 303
Кристобаль Хозевич
--Eugene--
возможно, дурацкий вопрос

Даже не сомневайся.


тысяча чертей, каналья, не могу не согласиться :)

ranger.
31 янв 13, 17:54    [13858445]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2042
собственно, вопрос был - в частности - в том, нужно ли в запрос
select * from net_element where id = :x
добавлять дополнительный предикат :x is not null чтобы избежать ненужных INDEX SCAN-ов и TABLE ACCESS-ов
select * from net_element where :x is not null and id = :x
?

а фраза
xtender
хочешь быть уверен добавляй
не звучит убедительно, согласитесь
несколько более убедительно звучит аргумент пользователя Zloxa, основанный на статистике
но хотелось бы почитать об этом The Fucking Manual (или хоть какой-то более-менее официальный текст), если кто знает
спасибо
1 фев 13, 00:02    [13859732]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
xtender
Member

Откуда: Мск
Сообщений: 4587
--Eugene--,

Даже не знаю что и сказать... вроде и ответ дал и пример привел, что тебе не убедительно-то?
1 фев 13, 00:24    [13859766]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
xtender
Member

Откуда: Мск
Сообщений: 4587
--Eugene--
несколько более убедительно звучит аргумент пользователя Zloxa, основанный на статистике
ага, очень убедительно, учитывая, что результат примера прямо противоположен выводу. Да, конечно, consistent gets меньше(кстати скорее всего динамик семплинг сыграл, т.к. по-хорошему единица там должна быть), но не 0, как было бы в случае с index unique scan, что я собственно и показывал в своем примере.
1 фев 13, 00:59    [13859852]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
wurdu
Member

Откуда: Владивосток
Сообщений: 4437
--Eugene--, твой пример в первом посте некорректный, т.к. во втором запросе не используется bind переменная, соответственно в плане видим 1 - filter(NULL IS NOT NULL), который однозначно говорит что работы никакой выполняться не будет. В случае с bind переменной такого фильтра, естественно, не будет и возможны варианты.
xtender
т.к. по-хорошему единица там должна быть), но не 0, как было бы в случае с index unique scan, что я собственно и показывал в своем примере.
Там все несколько странно. Если собрать статистику, то будет 0 и можно смело tablespace в offline переводить. А вот если статистики нет, то даже с optimizer_dynamic_sampling=0 зачем-то читается заголовок сегмента.
1 фев 13, 02:13    [13859973]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2042
wurdu
пример в первом посте некорректный, т.к. во втором запросе не используется bind переменная, соответственно в плане видим 1 - filter(NULL IS NOT NULL), который однозначно говорит что работы никакой выполняться не будет
дак это я специально показал как СУБД работает с NULL-литералом (ничего не делает)
а вот про то как он работает с биндом, который NULL - про это и вопрос
1 фев 13, 08:33    [13860115]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1031
xtender
--Eugene--
несколько более убедительно звучит аргумент пользователя Zloxa, основанный на статистике
ага, очень убедительно, учитывая, что результат примера прямо противоположен выводу. Да, конечно, consistent gets меньше(кстати скорее всего динамик семплинг сыграл, т.к. по-хорошему единица там должна быть), но не 0, как было бы в случае с index unique scan, что я собственно и показывал в своем примере.

Ага, я тоже не понял откуда там гетсы взялись. В моем примере не было уника. Если поставить по полю ПК, то в случае, если параметр из нулл, 0 гетсов. Если ставить уник на nullable поле - не пробовал.
xtender
. В случае с bind переменной такого фильтра, естественно, не будет и возможны варианты.

Почему естественно?
1 фев 13, 10:13    [13860402]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1031
Zloxa
Почему естественно?


Например, емнип, при использовании between оптимайзер добавляет фильтр, чтоб если знечение первого бинда больше второго, ничего не делать.
1 фев 13, 10:16    [13860410]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2042
Zloxa
я тоже не понял откуда там гетсы взялись. В моем примере не было уника. Если поставить по полю ПК, то в случае, если параметр из нулл, 0 гетсов
а можно ли быть уверенным в том, что при поиске по любому NOT NULL-полю (tab.col = :X), в случае, когда :X IS NULL СУБД поймет, что не надо ничего делать? или нужно добавлять этот предикат в запрос для подстраховки (типа :X is not null and tab.col = :X)?
имеется в виду, что tab.col - как раз одна из таких NON-NULLABLE колонок
1 фев 13, 10:42    [13860531]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1031
--Eugene--, тут могу апеллировать только к личному опыту. Не припомню чтобы мне доводилось так подстраховываться, не припомню, чтобы мне приходилось в этом раскаиваться. А гарантии, как известно, дает только страховой полис :D
1 фев 13, 11:33    [13860774]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
usolcew
Member

Откуда: Россия
Сообщений: 118
--Eugene--,

>> а можно ли быть уверенным в том, что при поиске по любому NOT NULL-полю (tab.col = :X), в случае, когда :X IS NULL СУБД поймет, что не надо ничего делать?

нет

>> или нужно добавлять этот предикат в запрос для подстраховки (типа :X is not null and tab.col = :X)?

или проиндексировать

+ Тесткейз

11.2.0.3@ SQL> create table T1 (C1 char(1));

Table created.

SQL> insert into T1 values(null); -- содержимое таблицы не имеет значения
  2  /

1 row created.

SQL> exec dbms_stats.gather_table_stats('','T1'); -- наличие статистики, в общем, тоже

PL/SQL procedure successfully completed.

SQL> var v1 char;
SQL> exec :v1 := null;

PL/SQL procedure successfully completed.

SQL> select * from T1 where C1 = :v1;
SQL> /

no rows selected

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     1 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T1   |     1 |     1 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

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

   1 - filter("C1"=:V1)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          7  consistent gets                              -- читает

SQL> create index I_T1 on T1(C1);                         -- достаточно не уникального обычного индекса

Index created.

SQL> select * from T1 where C1 = :v1;

SQL> /

no rows selected

-------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     1 |     1 |     1   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| I_T1 |     1 |     1 |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------

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

   1 - access("C1"=:V1)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          0  consistent gets                              -- не читает
          0  physical reads

SQL> select num_rows, leaf_blocks from user_ind_statistics where index_name = 'I_T1'
  2  /

  NUM_ROWS LEAF_BLOCKS
---------- -----------
         0           0

SQL> select num_rows, blocks from user_tab_statistics where table_name = 'T1'
  2  /

  NUM_ROWS     BLOCKS
---------- ----------
         1          5

SQL> exec dbms_stats.delete_index_stats('','I_T1'); -- при этом наличие статистики индекса не имеет значения

PL/SQL procedure successfully completed.

SQL> select * from T1 where C1 = :v1;

no rows selected

-------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     1 |     1 |     1   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| I_T1 |     1 |     1 |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------

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

   1 - access("C1"=:V1)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          0  consistent gets                              -- не читает
          0  physical reads

SQL> exec dbms_stats.delete_table_stats('','T1'); -- , как и статистика таблицы

PL/SQL procedure successfully completed.

SQL> alter session set optimizer_dynamic_sampling=0;

Session altered.

SQL> select * from T1 where C1 = :v1;

SQL> /

no rows selected

-------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     4 |    12 |     1   (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| I_T1 |     4 |    12 |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------

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

   1 - access("C1"=:V1)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          0  consistent gets                              -- не читает
          0  physical reads

SQL> update T1 set C1 = 'a';

1 row updated.

SQL> ALTER TABLE T1 MODIFY C1 char(1) NOT NULL;          -- наличие NOT NULL не гарантирует выполнения без чтений 

Table altered.

SQL> select * from T1 where C1 = :v1;

SQL> /

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     4 |    12 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T1   |     4 |    12 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

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

   1 - filter("C1"=:V1)


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          7  consistent gets                              -- читает
          0  physical reads
1 фев 13, 15:27    [13862482]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
wurdu
Member

Откуда: Владивосток
Сообщений: 4437
Тогда другой тесткейс:
SQL>  create table xt_test as select 1 i from dual;

Table created.

SQL> exec dbms_stats.gather_table_stats('','XT_TEST');

PL/SQL procedure successfully completed.

SQL> var a number;
SQL> select * from xt_test where i=:a;

no rows selected


Execution Plan
----------------------------------------------------------
Plan hash value: 1457378020

-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |     1 |     3 |     2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| XT_TEST |     1 |     3 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------

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

   1 - filter("I"=TO_NUMBER(:A))


Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          0  consistent gets
          0  physical reads
          0  redo size
        281  bytes sent via SQL*Net to client
        408  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed
1 фев 13, 15:53    [13862706]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2042
usolcew, wurdu,

вот я о том и говорю - хер проссыш когда он читает, когда нет
и надо ли че-то делать чтобы не читал
1 фев 13, 17:27    [13863381]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
usolcew
Member

Откуда: Россия
Сообщений: 118
wurdu, какая у Вас версия?

на 11.2.0.1:

11.2.0.1.ORCL112@SCOTT SQL> select * from xt_test where i=:a;

no rows selected

Elapsed: 00:00:00.01

Execution Plan
----------------------------------------------------------
Plan hash value: 1457378020

-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |     1 |     3 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| XT_TEST |     1 |     3 |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------

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

   1 - filter("I"=TO_NUMBER(:A))


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          1  consistent gets
          0  physical reads
1 фев 13, 17:57    [13863577]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
usolcew
Member

Откуда: Россия
Сообщений: 118
в 11.2.0.3 также получил:

Statistics
----------------------------------------------------------
          0  recursive calls
          [color=green]0  db block gets[/color]
          0  consistent gets
          0  physical reads


обновляться ;)
1 фев 13, 18:46    [13863766]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
xtender
Member

Откуда: Мск
Сообщений: 4587
usolcew,

ну у меня и на 11.2.0.3 та же ситуевина:
+
SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

5 rows selected.

Elapsed: 00:00:00.14
SQL> desc xt_test;
 Name
                                                                                                                   Null?    Type
 --------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------

 A
                                                                                                                   NOT NULL NUMBER
 B
                                                                                                                   NOT NULL NUMBER
 C
                                                                                                                            VARCHAR2(128)

SQL> exec dbms_stats.gather_table_stats('','XT_TEST');

PL/SQL procedure successfully completed.

Elapsed: 00:00:03.37
SQL> set autot trace stat
SQL> var a number;
SQL> select * from xt_test where a=:a;

no rows selected

Elapsed: 00:00:00.29

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          1  consistent gets
          0  physical reads
          0  redo size
        349  bytes sent via SQL*Net to client
        352  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed

SQL> select * from xt_test where a=:a;

no rows selected

Elapsed: 00:00:00.29

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          1  consistent gets
          0  physical reads
          0  redo size
        349  bytes sent via SQL*Net to client
        352  bytes received via SQL*Net from client
          1  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          0  rows processed
1 фев 13, 19:04    [13863831]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 4849
usolcew
SQL> ALTER TABLE T1 MODIFY C1 char(1) NOT NULL;          -- наличие NOT NULL не гарантирует выполнения без чтений 

Table altered.

SQL> select * from T1 where C1 = :v1;

SQL> /

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     4 |    12 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T1   |     4 |    12 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

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

   1 - filter("C1"=:V1)
Вам не кажется странным TABLE ACCESS FULL при наличие индекса и not null?
4 фев 13, 11:07    [13870974]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
usolcew
Member

Откуда: Россия
Сообщений: 118
dbms_photoshop

сорри, упустил, к этому моменту индекса, конечно уже нет:

SQL> drop index I_T1;

Index dropped.


При наличии индекса блоки разумно не читаются независимо от наличия констрэйнта,
а вот наличие констрэйнта не гарантирует исключения избыточных чтений - идея была такая
4 фев 13, 11:26    [13871105]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 4849
xtender
ну у меня и на 11.2.0.3 та же ситуевина
У меня на 11.2.0.1 в этом случае читается заголовок сегмента, на 11.2.0.3 - нет.
4 фев 13, 11:57    [13871311]     Ответить | Цитировать Сообщить модератору
 Re: Что делает СУБД с пустыми (NULL) значениями BIND-переменных в SQL-запросах?  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 4849
usolcew
При наличии индекса блоки разумно не читаются независимо от наличия констрэйнта,
а вот наличие констрэйнта не гарантирует исключения избыточных чтений - идея была такая
Да, такое поведение с 8.1.7.4 точно. Может быть и с более ранних версий.
4 фев 13, 11:59    [13871326]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить