楼主: jjddlliang

[精华] 为什么索引会比其所对应的表大?

[复制链接]
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
11#
发表于 2002-12-23 16:18 | 只看该作者

你难道认为这些话里面没有问你什么东西?

索引到底保存了什么东西?

键值+rowid(18bytes) + 树结构 ……

一个表是否还存在多个索引?
索引列占行的比例多大?
update索引列为全新的值很多?或者delete 后 insert 新值很多?

使用道具 举报

回复
论坛徽章:
2
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33
12#
 楼主| 发表于 2002-12-23 16:31 | 只看该作者

Re: 你难道认为这些话里面没有问你什么东西?

最初由 biti_rainy 发布
[B]索引到底保存了什么东西?

键值+rowid(18bytes) + 树结构 ……

一个表是否还存在多个索引?
索引列占行的比例多大?
update索引列为全新的值很多?或者delete 后 insert 新值很多? [/B]


这只能拿一张表来作为例子了:
SQL> desc p_lszzpkc1;
Name                            Null?    Type
------------------------------- -------- ----
CPDH                                     VARCHAR2(30)
GXDH                                     VARCHAR2(5)
BMDH                                     VARCHAR2(2)
ZZSL                                     NUMBER
WGSL                                     NUMBER
SCPH                                     VARCHAR2(10)
YF                                       VARCHAR2(10)
SQL> select count(*) from p_lszzpkc1;

  COUNT(*)
----------
    738857
这个表只有一个唯一索引(yf,bmdh,gxdh,cpdh,scph)

我刚才将索引重建过了,这个索引就只占用31。64M,
但是REBUILD没有变化,什么原因呀?

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
13#
发表于 2002-12-23 16:38 | 只看该作者

你这张表里面

除了2个 number 类型的字段
其余的全部被包含在索引里面了

键值+rowid(18bytes) + 树结构 ……


你认为呢,是索引大还是表大?


别人给出的建议总是可能有意义的,先想想别人为什么要这么回答 ?

使用道具 举报

回复
论坛徽章:
2
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33
14#
 楼主| 发表于 2002-12-23 16:52 | 只看该作者
哦 !
谢谢了!批评的是,由于接触ORACLE时间短,还请多多指教,
象这种情况,我应该怎么做呢?
我删了几个索引,重建过,应该会好点吧!

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
15#
发表于 2002-12-23 17:09 | 只看该作者

哦!

还是没有明白!

使用道具 举报

回复
论坛徽章:
16
咸鸭蛋
日期:2011-09-06 18:06:46三菱
日期:2013-08-19 19:29:14
16#
发表于 2002-12-23 17:21 | 只看该作者
很正常的,一个表经常INSERT和DELETE,它的索引也会进行修改的
从METALINK摘的一些关于INDEX的INSERT和DELETE

Index growth could be due to the manner in which Oracle splits the blocks as  the index is populated.  Indexes are created as b*trees.  The only balancing  occurs as a 50:50 block splits. Each leaf block is allocated a range of key  values.  When a value is deleted the space is not immediately available for  any new key values - only for ones that fall in the existing range for the  block. A block is only placed back on the free list when all the index entries  for that block are deleted.  "deleted" means that the space is available for  reuse but the data is not zeroed out.    When a new value is inserted, if the key "fits" into an existing leaf block  then it will attempt to place it in that block.  This algorithm is not  particularly aggressive.  When a block split is required it will split the  data in the first block 50-50. Half of the data will be kept in the original  block and the other half placed in the new (split) block.  This algorithm  causes the index growth observed and can double the size of the index overtime.


重建是最好的方法了。

另那个脚本试了没有什么效果,怎么不回答我

使用道具 举报

回复
论坛徽章:
2
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-10-30 17:05:33
17#
 楼主| 发表于 2002-12-23 17:29 | 只看该作者
脚本没收到呀,今天晚上不搞了,看看书再问了。

使用道具 举报

回复
论坛徽章:
314
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
18#
发表于 2002-12-23 18:43 | 只看该作者
因为:索引不会使用被删除,修改后剩下的空间,而是在不断的使用新的空间
这一点和表的数据的存储不一样,所以,会出现这种情况!

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
19#
发表于 2002-12-23 18:49 | 只看该作者

不是这个样子的噢

最初由 ZALBB 发布
[B]因为:索引不会使用被删除,修改后剩下的空间,而是在不断的使用新的空间
这一点和表的数据的存储不一样,所以,会出现这种情况! [/B]


呵呵,这个观点是不确切的
如果新插入的数据跟以前的数据的索引键值一样的话,会使用原来的空间
因为索引是有序的,所以新值不会使用原来的空间

使用道具 举报

回复
论坛徽章:
0
20#
发表于 2002-12-23 18:53 | 只看该作者
哦,原来如so

使用道具 举报

回复

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

本版积分规则 发表回复

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