Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 存储桶数(dba\U选项卡\U列\U统计)_Oracle_Oracle10g - Fatal编程技术网

Oracle 存储桶数(dba\U选项卡\U列\U统计)

Oracle 存储桶数(dba\U选项卡\U列\U统计),oracle,oracle10g,Oracle,Oracle10g,当查看我的表(m_CURRENT)的dba_tab_col_统计信息时,我注意到,列TNE的num_bucket值在一个数据库中为75,在另一个数据库中为254。DB是Oracle 10g 这似乎是两张表之间的主要区别。有没有办法让两个数据库都匹配num_bucket值 我有一个delete语句,它在一个数据库上运行得很快,在另一个数据库上运行得很慢。我知道查询计划在两个数据库上不同有几个原因。经过大量分析,我怀疑让慢速查询数据库具有相同的num_bucket设置可以确保我的delete语句对索

当查看我的表(m_CURRENT)的dba_tab_col_统计信息时,我注意到,列TNE的num_bucket值在一个数据库中为75,在另一个数据库中为254。DB是Oracle 10g

这似乎是两张表之间的主要区别。有没有办法让两个数据库都匹配num_bucket值


我有一个delete语句,它在一个数据库上运行得很快,在另一个数据库上运行得很慢。我知道查询计划在两个数据库上不同有几个原因。经过大量分析,我怀疑让慢速查询数据库具有相同的num_bucket设置可以确保我的delete语句对索引TNE_idx进行范围扫描(快速),而不是快速的完全扫描(在本例中为慢速)。

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

begin
dbms_stats.gather_table_stats(user,'M_CURRENT', 
          method_opt=>'for columns TNE size 254', cascade=>false, 
           granularity=>'ALL', degree=>8);
end;
/
size参数将设置存储桶(如果不同值的数量少于该数量,则结果将更少)

上面没有指定估计值,因此将对较小的总体值进行抽样,而不是100%。如果您想要100%,则在估计值_pct参数*)中指定该值,但如果您有一个正则脚本,则稍后可能会覆盖该值


*您可以通过将dba_选项卡上的样本大小与dba_表上的num_行进行比较来检查当前的样本大小

我想跟进,DazzaL的回答提供了非常丰富的信息,但我错了,桶并没有产生任何影响。我可以通过跑步节省很多时间
解释删除废话的计划

然后

从表中选择*(dbms\u xplan.display)
并专注于正确的步骤id

我将注意力集中在步骤ID5上,其中使用了索引快速完全扫描,而我本应该从步骤2开始,在步骤2中,两个数据库计划是不同的。我看到快速数据库执行嵌套循环反连接,而慢速数据库执行合并连接反连接。一旦我添加了(未记录的?)提示
NL_AJ
在子查询中没有参数的情况下,使用了所需的快速索引范围扫描

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