sql >> Databasteknik >  >> RDS >> Oracle

Hur använder man ett funktionsbaserat index på en kolumn som innehåller NULL i Oracle 10+?

Indexet kan användas, även om optimeraren kan ha valt att inte använda det för ditt specifika exempel:

SQL> create table my_objects
  2  as select object_id, object_name
  3  from all_objects;

Table created.

SQL> select count(*) from my_objects;
  2  /

  COUNT(*)
----------
     83783


SQL> alter table my_objects modify object_name null;

Table altered.

SQL> update my_objects
  2  set object_name=null
  3  where object_name like 'T%';

1305 rows updated.

SQL> create index my_objects_name on my_objects (lower(object_name));

Index created.

SQL> set autotrace traceonly

SQL> select * from my_objects
  2  where lower(object_name) like 'emp%';

29 rows selected.


Execution Plan
----------------------------------------------------------

------------------------------------------------------------------------------------
| Id  | Operation                   | Name            | Rows  | Bytes | Cost (%CPU)|
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                 |    17 |   510 |   355   (1)|
|   1 |  TABLE ACCESS BY INDEX ROWID| MY_OBJECTS      |    17 |   510 |   355   (1)|
|*  2 |   INDEX RANGE SCAN          | MY_OBJECTS_NAME |   671 |       |     6   (0)|
------------------------------------------------------------------------------------

Dokumentationen du läste påpekade förmodligen att, precis som alla andra index, lagras inte helt null-nycklar i indexet.



  1. Kan jag använda en ström för att INFOGA eller UPPDATERA en rad i SQL Server (C#)?

  2. kan inte installera MySQL-Python

  3. Hur hämtar man radräkning i PHP i Mysql Database?

  4. FEL 1215:Kan inte lägga till en främmande nyckel-begränsning när du använder ON DELETE SET NULL