设计索引问题和数据库设计

[复制链接]
查看11 | 回复4 | 2013-12-9 14:13:35 | 显示全部楼层 |阅读模式
由于新上一个报表数据源改造的项目,以前的报表得从新的数据源头取数。
我们的做法是读txt文件用datastage抽取到oracle的数据源表中,然后加工生成报表。
1.我这没有dba权限,分配的用户只有普通权限,如何查看分配给我的用户的表空间大小和使用了多少。dba说已经分配给我们10g的空间了,可是一转眼就报空间使用完的警告了。
2.设计数据源表时表结构师和以前的数据源类似的,只不过索引要自己设计的,库中的用户也是我们自己的。按照数据源表的周期每天或每月用datastage抽取数据到数据源表中,
全量的表会truncate后再插入,增量的按日期标志delete后插入。在设计时我既想提高datastage插入的速度,又想在数据源头表上建立合适的索引用来增加olap报表的生成速度,同时减少数据源头表使用的空间。以前只是看过了几本oracle的书,缺少实际的经验。各位有什么好办法或经验,分享给我一下。数据源头表有个特性就是它是只有insert 和delete或tuncate的,只有极少数的是做update的。数据源表是上面系统产生的,我们会按照周期全量或增量的导入到数据库中,这个过程我们完全控制的。数据一旦导入要么就查询,要么就删除不会有并发的update或大批量的update。
回复

使用道具 举报

千问 | 2013-12-9 14:13:35 | 显示全部楼层
“数据源”的提法令人困惑,你一会说它是“上面系统产生的”,一会又说是“datastage抽取到oracle的数据源表中”,到底是源还是目标?
如果维护索引的代价太大,也可以在加载结束后再重建。
回复

使用道具 举报

千问 | 2013-12-9 14:13:35 | 显示全部楼层
其实情况是这样的,我们产生的报表都是根据上游源系统的数据olap出来的。原来数据都由一个小组统一抽取到oralce库中,它们把抽取完成的表放入到用户a中,将a中所有对象的select的权限授权给我们用户b1,库是公用的(我们直接在oracle中select就可以了)。下游产生报表的系统可能有我们的b1,和别人的b2,b3,b4。。。。
现在原来抽取数据的小组开发了一个数据仓库t1,他们将上游源系统的数据都加工过了(当然他们不再负责将数据抽取到oracle中,原来那块抽取工作就下线了),他们根据每个下游系统要的数据产生b1.txt,b2.txt。。。对于我们我们就将b1.txt抽取到oracle数据库的b1用户中,然后对他select。

1.删除索引和重建索引的脚本可以写在plsql中吗,我们抽取前后可以用datastage调存储过程的。
2.如果只有普通权限能否查到b1的表空间大小,使用多少,是不是用user_tablespace,我查了没有发现里面说总空间有多少
3.我看到网上有说可以调pctfree和pctused来提高空间使用率,我们这里有这样的表:
3.1大表,全量
3.2大表,增量(txdt日期增量)
dml基本上只有insert,delete,truncate操作很少update我把pctfree调成2,理论上是不是可以增加8%的使用空间?varchar2(10) 和varchar2(60)如果里面只放7个字节的内容,空间使用的大小一样的吗?(为了怕上生产报字段过小无法插入的错误,默认都将字段长度设置的较大,用来兼容)
回复

使用道具 举报

千问 | 2013-12-9 14:13:35 | 显示全部楼层
DISABLE索引和在线重建可以写成动态SQL, 在PLSQL中用EXECUTE IMMEDIATE执行。
你必须比较这样做法和带索引更新的做法哪种更高效,再决定是否这么做。有些索引在你ETL的时候是要用到的。
查看剩余空间:
SELECT t.tablespace_name
,ROUND(f.free_space*100/t.ts_size) as free_percentage
FROM (select round(sum(bytes/(1024*1024)),0) ts_size

,tablespace_name
from dba_data_files d
group by d.tablespace_name
) t
,(select sum(bytes)/(1024*1024) as free_space

,tablespace_name
from dba_free_space
group by tablespace_name
) f
WHERE t.tablespace_name = f.tablespace_name
如果没有UPDATE, 可以把PCTFREE调小一些,增加块里面的数据密度。
"varchar2(10) 和varchar2(60)如果里面只放7个字节的内容,空间使用的大小一样的吗?"一样的,但是定义长度要有节制,因为可以防止超长的垃圾输入。
回复

使用道具 举报

千问 | 2013-12-9 14:13:35 | 显示全部楼层
感谢你的回答,回答的很详细具体,谢谢。
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行