Oracle
 sql >> база данни >  >> RDS >> Oracle

План за изпълнение на SQL за съхранена процедура

Отговорих на подобен въпрос тук https://stackoverflow.com/a/26633820/3989608

Някои факти за NULL стойностите и INDEX:

  • Напълно NULL ключовете не се въвеждат в „нормално“ B*Tree в Oracle

  • Следователно, ако имате конкатениран индекс на C1 и C2, тогава вероятно ще намерите NULL стойности в него – тъй като можете да имате ред, където C1 е NULL, но C2 НЕ е NULL – тази ключова стойност ще бъде в индекса.

Част от демонстрацията на Томас Кайт относно същото:

[email protected]> create table t
2  as
3  select object_id, owner, object_name
4    from dba_objects;
Table created.

[email protected]> alter table t modify (owner NOT NULL);
Table altered.

[email protected]> create index t_idx on t(object_id,owner);
Index created.

[email protected]> desc t
Name                    Null?    Type
----------------------- -------- ----------------
OBJECT_ID                        NUMBER
OWNER                   NOT NULL VARCHAR2(30)
OBJECT_NAME                      VARCHAR2(128)

[email protected]> exec dbms_stats.gather_table_stats(user,'T');
PL/SQL procedure successfully completed.

Е, този индекс със сигурност може да се използва за удовлетворяване на „IS NOT NULL“, когато се прилага към OBJECT_ID:

[email protected]> set autotrace traceonly explain
[email protected]> select * from t where object_id is null;

Execution Plan
----------------------------------------------------------
0      SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=1 Bytes=34)
1    0   TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=3 Card=1 Bytes=34)
2    1     INDEX (RANGE SCAN) OF 'T_IDX' (NON-UNIQUE) (Cost=2 Card=1)

Всъщност – дори ако таблицата няма колони NOT NULL или не искаме/трябва да имаме конкатениран индекс, включващ OWNER – има прозрачен начин за лесно намиране на стойностите на NULL OBJECT_ID:

[email protected]> drop index t_idx;
Index dropped.

[email protected]> create index t_idx_new on t(object_id,0);
Index created.

[email protected]> set autotrace traceonly explain
[email protected]> select * from t where object_id is null;

Execution Plan
----------------------------------------------------------
0      SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=1 Bytes=34)
1    0   TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=3 Card=1 Bytes=34)
2    1     INDEX (RANGE SCAN) OF 'T_IDX_NEW' (NON-UNIQUE) (Cost=2 Card=1)

Източник:Нещо за нищото от Томас Кайт



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Примери за PLSQL курсори - явни, неявни и референтни курсори

  2. Как да инсталирате cx_Oracle на El Capitan

  3. SQLException:нарушение на протокола. Проблем с драйвера на Oracle JDBC

  4. Потребителско дефинирана рутина с DBMS_STATS, част II

  5. Как да използвам ключовата дума 'as' за псевдоним на таблица в Oracle?