查看: 4939|回复: 11

[性能调整] 请帮忙看看,非倾斜列为什么会被自动收集柱状图?

[复制链接]
论坛徽章:
122
现任管理团队成员
日期:2011-05-07 01:45:08
跳转到指定楼层
1#
发表于 2008-11-18 16:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天用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 编辑 ]
论坛徽章:
122
现任管理团队成员
日期:2011-05-07 01:45:08
2#
 楼主| 发表于 2008-11-18 16:38 | 只看该作者
顶一下~

使用道具 举报

回复
论坛徽章:
33
ITPUB元老
日期:2009-03-11 15:35:03咸鸭蛋
日期:2011-11-06 22:20:25紫蛋头
日期:2011-12-27 22:15:052012新春纪念徽章
日期:2012-01-04 11:49:542014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11红宝石
日期:2014-06-03 13:13:19
3#
发表于 2008-11-18 16:54 | 只看该作者
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

使用道具 举报

回复
论坛徽章:
122
现任管理团队成员
日期:2011-05-07 01:45:08
4#
 楼主| 发表于 2008-11-18 16:59 | 只看该作者
9i 的dba_tab_col_statistics 里没有HISTOGRAM列,只能从dba_tab_histograms中的endpoint_number来看是否有柱状图~

使用道具 举报

回复
论坛徽章:
33
ITPUB元老
日期:2009-03-11 15:35:03咸鸭蛋
日期:2011-11-06 22:20:25紫蛋头
日期:2011-12-27 22:15:052012新春纪念徽章
日期:2012-01-04 11:49:542014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11红宝石
日期:2014-06-03 13:13:19
5#
发表于 2008-11-18 17:08 | 只看该作者
再测试了一下,10g中跟你的情况也是一样'FOR ALL INDEXED COLUMNS SIZE SKEWONLY'不分倾斜与否,只要字段上面有索引,就收集柱状图

使用道具 举报

回复
论坛徽章:
122
现任管理团队成员
日期:2011-05-07 01:45:08
6#
 楼主| 发表于 2008-11-18 17:12 | 只看该作者
原帖由 battleman 于 2008-11-18 17:08 发表
再测试了一下,10g中跟你的情况也是一样'FOR ALL INDEXED COLUMNS SIZE SKEWONLY'不分倾斜与否,只要字段上面有索引,就收集柱状图


不是的
请看一下我这里的结果

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

红色的部分,应该是没有柱状图的~但这些列也是在索引上的

使用道具 举报

回复
论坛徽章:
33
ITPUB元老
日期:2009-03-11 15:35:03咸鸭蛋
日期:2011-11-06 22:20:25紫蛋头
日期:2011-12-27 22:15:052012新春纪念徽章
日期:2012-01-04 11:49:542014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11红宝石
日期:2014-06-03 13:13:19
7#
发表于 2008-11-18 17:21 | 只看该作者
原帖由 zergduan 于 2008-11-18 17:12 发表


不是的
请看一下我这里的结果

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

红色的部分,应该是没有柱状图的~但这些列也是在索引上的



我的说法确实有问题,刚刚测试的时候让字段取唯一值,以为这样就不是倾斜的呵呵,其实这是最大的倾斜。。。
oracle应该有一个算法来控制什么是倾斜,什么是不倾斜

使用道具 举报

回复
论坛徽章:
3
ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28灰彻蛋
日期:2011-11-20 13:12:27茶鸡蛋
日期:2011-12-23 09:57:57
8#
发表于 2008-11-18 17:50 | 只看该作者
关注中.....

使用道具 举报

回复
论坛徽章:
33
ITPUB元老
日期:2009-03-11 15:35:03咸鸭蛋
日期:2011-11-06 22:20:25紫蛋头
日期:2011-12-27 22:15:052012新春纪念徽章
日期:2012-01-04 11:49:542014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11红宝石
日期:2014-06-03 13:13:19
9#
发表于 2008-11-18 18:02 | 只看该作者
oracle在界定skew的时候还不是用重复值来界定的。
我用一个唯一字段的test表测试的时候,如果这些值不是连续的,比如1--200,1000-3000,10000--12000。。
采用样'FOR ALL INDEXED COLUMNS SIZE SKEWONLY'方式仍然会收集柱状图。
如果是连续的就不会收集了。

使用道具 举报

回复
论坛徽章:
122
现任管理团队成员
日期:2011-05-07 01:45:08
10#
 楼主| 发表于 2008-11-19 09:05 | 只看该作者
原帖由 battleman 于 2008-11-18 18:02 发表
oracle在界定skew的时候还不是用重复值来界定的。
我用一个唯一字段的test表测试的时候,如果这些值不是连续的,比如1--200,1000-3000,10000--12000。。
采用样'FOR ALL INDEXED COLUMNS SIZE SKEWONLY'方式仍然会收集柱状图。
如果是连续的就不会收集了。


谢谢,明白了~

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表