在查看我的表(m_CURRENT)的dba_tab_col_statistics时,我注意到列TNE的num_buckets值在一个数据库上是75,在另一个数据库上是254。数据库为Oracle 10g。
这似乎是两个表之间的主要区别。有没有办法让两个数据库都匹配num_bucket的值?
我有一个delete语句,它在一个数据库上速度很快,而在另一个数据库上非常慢。我知道有几个原因导致两个数据库上的查询计划可能不同。经过大量分析,我怀疑让慢查询数据库具有相同的num_bucket设置可以确保我的delete语句对索引TNE_idx执行range_scan (快速)而不是fast_full_scan (在本例中为慢)。
发布于 2012-12-20 22:54:35
您如何在两个数据库上收集统计信息,您是否有常规的统计信息收集脚本?您可以一次性执行此操作,以便仅在该列上收集直方图:
begin
dbms_stats.gather_table_stats(user,'M_CURRENT',
method_opt=>'for columns TNE size 254', cascade=>false,
granularity=>'ALL', degree=>8);
end;
/size参数将设置存储桶(如果不同值的数量小于该数量,则结果将更少)。
上面的代码没有指定estimate_pct,因此将对较小数量的值进行抽样,而不是100%。如果你想要100 %,那么在estimate_pct参数*)中指定它,但是如果你有一个常规的脚本,这可能会在以后被覆盖。
*您可以通过比较dba_tab_col_statistics上的sample_size和dba_tables上的num_rows来检查当前样本大小
发布于 2012-12-21 23:22:36
我想跟进一下,DazzaL的回答很有见地,但我错了,水桶并没有起到什么作用。我本来可以节省很多时间的
explain plan for delete blah blah blah
然后
select * from table(dbms_xplan.display)和专注于正确的步骤id。
我转到了步骤id 5,其中使用了索引快速完全扫描,而我本应该从步骤2开始,其中两个数据库计划是不同的。我看到快数据库执行嵌套循环反连接,而慢数据库执行合并连接反连接。一旦我添加了(未记录的?)提示在子查询中没有参数的情况下,使用了所需的fast index_range_scan。
在我写这篇文章的时候,我想知道存储桶编号匹配是否重要,但我没有时间重新测试。它没坏,所以我不会碰它的!
https://stackoverflow.com/questions/13974165
复制相似问题