首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >num_buckets (dba_tab_col_statistics)

num_buckets (dba_tab_col_statistics)
EN

Stack Overflow用户
提问于 2012-12-20 22:21:03
回答 2查看 1.3K关注 0票数 1

在查看我的表(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 (在本例中为慢)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-20 22:54:35

您如何在两个数据库上收集统计信息,您是否有常规的统计信息收集脚本?您可以一次性执行此操作,以便仅在该列上收集直方图:

代码语言:javascript
运行
复制
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来检查当前样本大小

票数 1
EN

Stack Overflow用户

发布于 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。

在我写这篇文章的时候,我想知道存储桶编号匹配是否重要,但我没有时间重新测试。它没坏,所以我不会碰它的!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13974165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档