日期:2014-05-16  浏览次数:20510 次

让优化器用上可为空的索引.
首先创建一张测试表:
CREATE TABLE FOO(
  USERID NUMBER(20) NULL,
  USERNAME VARCHAR2(100),
  USERDEPT NUMBER(20),
  USERDEPTNAME VARCHAR2(100)
)
/
模拟上10万条数据进去:
BEGIN
  FOR I IN 0..100000 LOOP
    INSERT INTO FOO
    VALUES
    (I,'ZIWEN'||i,MOD(I,30),'USERDEPTNAME'||MOD(I,30));
  END LOOP;
  IF MOD(I,100) =0 THEN
    COMMIT;
  END IF;
END;
/
在可以为NULL的USERID上面增加一个索引:
CREATE INDEX INDEX_FOO_USERID ON FOO(USERID);

进行表分析:
ANALYZE TABLE FOO
COMPUTE STATISTICS
FOR TABLE
FOR ALL INDEXES
FOR ALL INDEXED COLUMNS;

执行下面的语句,按照道理而言,应该走INDEX,INDEX RANGE SCAN,实际上也是走的索引范围扫描。
SELECT USERID FROM FOO WHERE USERID = 100;


修改其中的某些USERID为空再试一下,仍旧走的是索引范围扫描。