王磊的个人技术记录 王磊的个人技术记录

记录精彩的程序人生

目录
数据库查询因为统计信息不新,不走索引导致查询慢
/    

数据库查询因为统计信息不新,不走索引导致查询慢

项目中遇到,有一个查询特别慢,备份了相同的数据库和程序后,发现并不慢。

最后发现是因为直方图的收集没有更新,使得查询没有能够使用索引。

SQL> exec dbms_stats.gather_table_stats(ownname=>'GCREPORT_CFS',tabname=>'GC_OFFSETVCHRITEM',estimate_percent=>100,method_opt=>'FOR COLUMNS default_period size auto',cascade=>true,no_invalidate=>false);

select * from dba_tab_col_statistics t where t.TABLE_NAME='GC_OFFSETVCHRITEM' and t.COLUMN_NAME='DEFAULT_PERIOD';

数据库辨别走不走索引有一条是根据你这个索引字段在整个表中重复的概率来的,如果重复的少就走索引,比如一共10条数据,10条数据的索引字段都是一样的,那数据库就觉得走索引也没用还不如全表扫描呢。 然后索引字段在整个表中重复的比例,数据库是有个统计信息维护。咱这次慢就是因为数据库维护的这个统计信息太旧了。

比如说昨天表里就10条数据 索引字段比如说是A, 然后这10条记录的A的值都是一样的都是1,当你查询A的时候数据库就会认为走索引没用 因为都是一样的值都是1,就会全表扫描。 但是你今天插入了100w的数据 这100W的A的值都是2。并且数据库没有维护统计信息, 然后这时候你在查询a=1的记录,数据库会先去看统计信息,统计信息显示A=1的占比100%,然后就会全表扫描查询 就会遍历这100w的数据 所以就慢了


标题:数据库查询因为统计信息不新,不走索引导致查询慢
作者:wanglei03
地址:https://wangleijava.com/articles/2020/07/31/1596182246876.html