请帮忙看看,非倾斜列为什么会被自动收集柱状图?
今天用DBMS_STATS.GATHER_TABLE_STATS中method_opt => 'FOR ALL INDEXED COLUMNS SIZE SKEWONLY'来自动收集,倾斜索引列柱状图,发现非倾斜列也被收集了,请问这是为什么?
下面过程中隐藏一些真实表名,列名.
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.7.0 - 64bit Production
PL/SQL Release 9.2.0.7.0 - Production
CORE 9.2.0.7.0 Production
TNS for IBM/AIX RISC System/6000: Version 9.2.0.7.0 - Production
NLSRTL Version 9.2.0.7.0 - Production
Executed in 0.031 seconds
SQL> select count(*) from A;
COUNT(*)
----------
1789660
Executed in 0.016 seconds
SQL> exec dbms_stats.gather_table_stats(ownname => 'MYDB',tabname => 'A',method_opt => 'FOR ALL INDEXED COLUMNS SIZE SKEWONLY',degree => 4,cascade => TRUE);
PL/SQL procedure successfully completed
Executed in 336.563 seconds
SQL> SELECT COUNT(*), column_name
2 FROM dba_tab_histograms
3 WHERE table_name = 'A'
4 AND column_name = 'ANAME'
5 GROUP BY column_name
6 ORDER BY column_name DESC
7 /
COUNT(*) COLUMN_NAME
---------- --------------------------------------------------------------------------------
201 ANAME
Executed in 0.078 seconds
--ANAME被收集了柱状图,还用了200个桶
SQL> SELECT num_distinct
2 FROM dba_tab_col_statistics
3 WHERE table_name = 'A'
4 AND column_name = 'ANAME'
5 /
NUM_DISTINCT
------------
1789659
--A表一共1789660行,ANAME列有1789659各不同的值
Executed in 0.031 seconds
SQL> SELECT *
2 FROM (SELECT COUNT(*), ANAME
3 FROM A
4 GROUP BY ANAME
5 ORDER BY COUNT(*) DESC)
6 WHERE rownum < 5
7 /
COUNT(*) ANAME
---------- ------------------------------
2 CNCB5+J005DN
1 123121
1 1231214
1 061024-3
Executed in 11.078 seconds
--ANAME列只有一个重复值,这也能算是倾斜?
请问当我使用for indexed columns size skewonly来收集时,oracle如何判断列是否倾斜,为啥我这个明明不倾斜的列会被收集柱状图?
谢谢~
[ 本帖最后由 zergduan 于 2008-11-18 16:53 编辑 ]
SIZE, 索引, select, from, version
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
谢谢,明白了~
oracle在界定skew的时候还不是用重复值来界定的。
我用一个唯一字段的test表测试的时候,如果这些值不是连续的,比如1--200,1000-3000,10000--12000。。
采用样'FOR ALL INDEXED COLUMNS SIZE SKEWONLY'方式仍然会收集柱状图。
如果是连续的就不会收集了。
关注中.....
我的说法确实有问题,刚刚测试的时候让字段取唯一值,以为这样就不是倾斜的呵呵,其实这是最大的倾斜。。。
oracle应该有一个算法来控制什么是倾斜,什么是不倾斜
不是的
请看一下我这里的结果
SQL> SELECT COUNT(*), column_name
2 FROM dba_tab_histograms
3 WHERE table_name = 'A'
4 GROUP BY column_name
5 ORDER BY COUNT(*) DESC
6 /
COUNT(*) COLUMN_NAME
---------- --------------------------------------------------------------------------------
201 ANAME
201 ALASTACTIVITYDATE
197 AID
83 AODUCTID
57 ACTID
4 ATYPE
4 ALEVELID
2 AID
2 ASTATUSID
2 ASTATUS
2 PARENTAID
2 ISSUEDTOCAID
12 rows selected
红色的部分,应该是没有柱状图的~但这些列也是在索引上的
再测试了一下,10g中跟你的情况也是一样'FOR ALL INDEXED COLUMNS SIZE SKEWONLY'不分倾斜与否,只要字段上面有索引,就收集柱状图
9i 的dba_tab_col_statistics 里没有HISTOGRAM列,只能从dba_tab_histograms中的endpoint_number来看是否有柱状图~
SQL> create index ind_test on test(time);
索引已创建。
SQL> select column_name,histogram from dba_tab_col_statistics where table_name='
TEST';
COLUMN_NAME HISTOGRAM
------------------------------ ---------------
TIME NONE
STATUS NONE
SQL> exec dbms_stats.gather_table_stats(ownname => 'SYS',tabname => 'TEST',metho
d_opt => 'FOR ALL INDEXED COLUMNS SIZE SKEWONLY',degree => 4,cascade => TRUE);
PL/SQL 过程已成功完成。
SQL> select column_name,histogram from dba_tab_col_statistics where table_name='
TEST';
COLUMN_NAME HISTOGRAM
------------------------------ ---------------
TIME HEIGHT BALANCED
STATUS NONE
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
顶一下~