一个数据量较大的表,其中有一个列(status),表示数据所处的状态(N),随着业务的变化,该状态会改变(Y)。在业务中,经常需要对Status=N进行统计,该如何为这列建立索引?
第一印象,“哦,使用位图索引”。位图索引对低基数的列有用,该列只有N、Y两个列。但是这列需要大量的单行更新,从N到Y,位图索引不能应用于经常修改的列,这就排除了位图索引。
有的直接在该表上建立索引,但是在基于COST的优化器,经常选择全表扫描来处理。有时配合其他索引,该列的索引也能正常工作。
在这个应用中,函数索引可以起到更好的作用。
CREATE INDEX IDX_table1_NSTATUS ON table1
(CASE "STATUS" WHEN 'N' THEN 'N' ELSE NULL END )
对需要满足某种条件的行进行索引(STATUS=N),其他行不需要进行索引。在B*Tree索引中不会有完全为NULL的项。
为了编程简单,创建一个视图。
CREATE OR REPLACE FORCE VIEW V_TABLE1_NSTATUS as
SELECT TABLE1.*
CASE "CLEARSTATUS" WHEN 'N' THEN 'N' ELSE NULL END NSTATUS
FROM TABLE1;
以后再统计STATUS=N的情况,使用
select count(*) from V_TABLE1_NSTATUS where nstatus = 'N' 即可。