大家在进行表结构设计时,对于表的字段是否为空比较随意,这是错误的。
例如,允许id1和id2列为空的情况下,比较条件id1 = id2就应该转换为nvl(id1, 0) = nvl(id2, 0)
案例1
-
DROP TABLE t;
-
CREATE TABLE t AS SELECT * FROM dba_objects WHERE object_id IS NOT NULL;
-
CREATE INDEX idx_t ON t(object_id);
-
ANALYZE TABLE t COMPUTE STATISTICS FOR TABLE FOR ALL INDEXES FOR ALL INDEXED COLUMNS;
-
EXPLAIN PLAN FOR SELECT count(*)FROM t;
-
SELECT * FROM TABLE(dbms_xplan.display);
-
-
PLAN_TABLE_OUTPUT
-
--------------------------------------------------------------------
-
Plan hash value: 2966233522


-
--前面不走索引的原因是在object_id列上没有not null约束,所以有可能能有null值,而null值是不会出现在索引中的.
-
--所以为了避免统计的数据不准确,Oracle是不会走索引的.
-
--在试着给 object_id 加上is not null, 明确告诉Oracle该索引列值不会为空。
-
EXPLAIN PLAN FOR SELECT COUNT(*) FROM t WHERE object_id IS NOT NULL;
-
SELECT * FROM TABLE(dbms_xplan.display);
-
-
PLAN_TABLE_OUTPUT
-
-------------------------------------------------------------------------------
-
Plan hash value: 2371838348
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17013648/viewspace-1072248/
,如需转载,请注明出处,否则将追究法律责任。