is null

P.Spichak
Дата: 22.02.2007 07:35:37
Утверждается что на 8-ке конструкция
[/SRC] not a is null[SRC oracle]
будет отрабатывать быстрее чем
[/SRC] a is not null [SRC oracle]
Подскажите справедливо ли это для 10-ки?
Вячеслав Любомудров
Дата: 22.02.2007 07:45:40
Это несправедливо в обоих случаях
Q u a d r o
Дата: 22.02.2007 10:18:35
нет никакой разницы

SQL> select *
  2   from dual
  3   where dummy is not null;

Execution Plan
----------------------------------------------------------
Plan hash value: 3543395131

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

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

   1 - filter("DUMMY" IS NOT NULL)

SQL> select *
  2   from dual
  3   where not dummy is null;

Execution Plan
----------------------------------------------------------
Plan hash value: 3543395131

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

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

==>   1 - filter("DUMMY" IS NOT NULL)

filter-предикат одинаков в обоих случаях
P.Spichak
Дата: 22.02.2007 10:36:10
Sorry, уточнение, для PL\SQL.
Levandovskiy
Дата: 22.02.2007 10:40:20
Да это справедливо для 8 - но только для кода PL/SQL.
Такова была реализация пакета STANDART в версия 8. is not null отрабатывался за 2 операции
в 9-ке и выше это уже исправлено - обе записи выполняются эквивалентно.
declare nCount number:=1000000;t1 NUMBER;t2 NUMBER;t3 NUMBER;t4 NUMBER;
 i number;
 n number  := 1;
begin
  t1 := dbms_utility.get_time;
  FOR i IN 1..nCount LOOP 
    if not n is null then
      n := null;
    else  
      n := 1;
    end if;
  END LOOP;  t2 := dbms_utility.get_time;
  FOR i IN 1..nCount LOOP 
    if n is not null then
      n := null;
    else  
      n := 1;
    end if;
  END LOOP;  t3 := dbms_utility.get_time;
  FOR i IN 1..nCount LOOP 
    if n is null then
      n := 1;
    else  
      n := null;
    end if;
  END LOOP;  t4 := dbms_utility.get_time;
  dbms_output.put_line('Execution Time - second');
  dbms_output.put_line('---------------------');
  dbms_output.put_line('not n is null: ' || TO_CHAR((t2 - t1)/100));
  dbms_output.put_line('n not is null: ' || TO_CHAR((t3 - t2)/100));  
  dbms_output.put_line('    n is null: ' || TO_CHAR((t4 - t3)/100));  
end;

Execution Time - second
---------------------
n is not null: 1.5
not n is null: .31
    n is null: .31