有一张数据表,上生产后数据量是千万级的,目前我在开发机上测试里面存储的也有上百万的数据
字段有119个,这是张数据源表,我从里面取数据的时候每次select操作特耗时,因此我在
该表的一个字段上建了索引(data_date 字段类型varchar2(10) ),但是索引建好以后始终没有生效,删除重建以及rebuild
也不行
-----做了如下的分析也是不行
drop index IDX_ETB_DDATE1 ;
analyze table dwh_etb_monthly compute statistics ;
analyze table dwh_etb_monthly compute statistics for all indexed columns;
analyze table dwh_etb_monthly compute statistics for table for all indexes for all indexed columns;
create index idx_dwh_ddate on dwh_etb_monthly(data_date)
-----
然后我做查询的语句是:
select * from dwh_etb_monthly t where t.data_date = '2011-03-31'
执行计划是
SELECT STATEMENT, GOAL = ALL_ROWS Cost=14060 Cardinality=273095 Bytes=108418715
TABLE ACCESS FULL Object owner=DATACORE Object name=DWH_ETB_MONTHLY Cost=14060 Cardinality=273095 Bytes=108418715
------解决方案--------------------
呵呵,正常下应该是会走索引的,你检查你的索引是否还是可用状态噢,
还有就是你2011-03-31 这个日期的数据会不会占很大的一个比重,如果超出整个表的11-20%之间索引也就没什么大的用处了。
------解决方案--------------------
25万占100万的比例是多少,这么高的比例,索引当然会失效了
------解决方案--------------------
索引字段的数据占到总数据量的25%以上Oracle会自动全表扫描了,如果你一定要走索引的话,可以加一下hint:
select /*+index(idx_dwh_ddate)*/ * from dwh_etb_monthly t where t.data_date = '2011-03-31'