設計開發時慎重決定列是否為空

LuiseDalian發表於2014-01-17

大家在進行表結構設計時,對於表的欄位是否為空比較隨意,這是錯誤的。

例如,允許id1id2列為空的情況下,比較條件id1 = id2就應該轉換為nvl(id1, 0) = nvl(id2, 0)

案例1

點選(此處)摺疊或開啟

  1. DROP TABLE t;
  2. CREATE TABLE t AS SELECT * FROM dba_objects WHERE object_id IS NOT NULL;
  3. CREATE INDEX idx_t ON t(object_id);
  4. ANALYZE TABLE t COMPUTE STATISTICS FOR TABLE FOR ALL INDEXES FOR ALL INDEXED COLUMNS;
  5. EXPLAIN PLAN FOR SELECT count(*)FROM t;
  6. SELECT * FROM TABLE(dbms_xplan.display);

  7. PLAN_TABLE_OUTPUT
  8. --------------------------------------------------------------------
  9. Plan hash value: 2966233522


點選(此處)摺疊或開啟

  1. --前面不走索引的原因是在object_id列上沒有not null約束,所以有可能能有null值,而null值是不會出現在索引中的.
  2. --所以為了避免統計的資料不準確,Oracle是不會走索引的.
  3. --在試著給 object_id 加上is not null, 明確告訴Oracle該索引列值不會為空。
  4. EXPLAIN PLAN FOR SELECT COUNT(*) FROM t WHERE object_id IS NOT NULL;
  5. SELECT * FROM TABLE(dbms_xplan.display);

  6. PLAN_TABLE_OUTPUT
  7. -------------------------------------------------------------------------------
  8. Plan hash value: 2371838348


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17013648/viewspace-1072248/,如需轉載,請註明出處,否則將追究法律責任。

相關文章