性能 analyze 与 dbms_stat

函数索引就一定要使用analyze命令来分析吗?

各位,打听个事。
有没有这个说法,创建完函数索引之后,一定要使用这样的语句来分析?
analyze table table_name compute statistics
           for table
           for all indexes
           for all indexed columns size n;


因为我遇到一句SQL.简化后如下
SELECT *
  FROM TABLE_NAME A
WHERE A.IS_FIRST = 1
   AND A.STATUS IN ('1', '2')
   AND A.TASK_ID IN (6, 31, 24, 35, 36)
   AND A.ROLE_ID IN (3, 18, 13, 2, 11, 4, 14, 8, 12, 6)
   AND A.USER_ID IN (3103, 0)
   AND A.COMPANY_ID = '30000101'
   AND SUBSTR(F_REVERSE_STR(A.REPORT_ID), 1, 50) LIKE '822460%'

COMPANY_ID 、USER_ID 、STATUS、ROLE_ID 上建有复合索引。
SUBSTR(F_REVERSE_STR(A.REPORT_ID), 1, 50)建有函数索引。

一开始,我怎么分析表,执行计划总是走复合索引。包括给report_id做size 100柱状图分析。给函数索引对应的隐含列做size100的柱状图分析。
给复合索引的4个字段做size 100的柱状图分析。都不行。
最后,我用了上面的analyze,只用for all indexed columns size 1,结果,执行计划选择使用了函数索引,而且cost值非常低。

 

回复1:

      基于函数的索引一定要进行分析才可以。
它是基于COST的

回复2:

      不知道:
DBMS_STATS和analyze到底有什么差别。
我前天用analyze分析表后发现性能下降非常多。昨晚又用DBMS_STATS分析。对系统一些全表扫描的表,又加了一些索引,让他使用索引优化。

网上有说DBMS_STATS和analyze分析有差异是在使用了分区表和分索引进会有差异。

你可能感兴趣的:(sql,F#)