我们的DB中有一张表非常大,记录数在2800W左右,我按年份备份了一下,删除了1400万条数据,只保留了2年的数据。
但表空间使用率并未下降。运行以下命令:alter tablespace endat01 coalesce;
很快就完了,但表空间使用率未变化。我记得可以用命令释放删除数据后的表空间,但报错如下:
1,修改表,启动行移动的功能
alter table 表名 enable row movement;
(提示:ORA-14066: 非法的非分区表选项)
2,修改表,收缩表空间
alter table 表名 shrink space;
(提示:ORA-01735: 非法的 ALTER TABLE 选项)
怀疑是因为oracle版本太低,不支持!请各位帮忙看看有什么办法。
此外,我们的数据库最近变得很慢,不知道是什么原因。
初步查了一下服务器CPU,内存占用率都比较低,应该不是服务器硬件的原因,应该是oracle的原因。
但实在不知道怎么查,不知道怎么优化?各位大侠能否给个思路!附:---------------------------------------------
介绍一下我们的数据库配置:
服务器:3.16G双核,4G内存,584G硬盘(Rid5,有硬Rid卡)
数据库:oracle8.16
日常会话:230个左右
数据文件:195
数据文件大小:50G左右
表空间:34(索引和数据分开建的表空间,但在同一个驱动器上)
最大占用率:79%(不算回滚表空间,回滚表空间只有3个,各256M,有一个占用率为83%)
shared_pool_size=50M
db_writer_processes=1
---------------------------------------------
但表空间使用率并未下降。运行以下命令:alter tablespace endat01 coalesce;
很快就完了,但表空间使用率未变化。我记得可以用命令释放删除数据后的表空间,但报错如下:
1,修改表,启动行移动的功能
alter table 表名 enable row movement;
(提示:ORA-14066: 非法的非分区表选项)
2,修改表,收缩表空间
alter table 表名 shrink space;
(提示:ORA-01735: 非法的 ALTER TABLE 选项)
怀疑是因为oracle版本太低,不支持!请各位帮忙看看有什么办法。
此外,我们的数据库最近变得很慢,不知道是什么原因。
初步查了一下服务器CPU,内存占用率都比较低,应该不是服务器硬件的原因,应该是oracle的原因。
但实在不知道怎么查,不知道怎么优化?各位大侠能否给个思路!附:---------------------------------------------
介绍一下我们的数据库配置:
服务器:3.16G双核,4G内存,584G硬盘(Rid5,有硬Rid卡)
数据库:oracle8.16
日常会话:230个左右
数据文件:195
数据文件大小:50G左右
表空间:34(索引和数据分开建的表空间,但在同一个驱动器上)
最大占用率:79%(不算回滚表空间,回滚表空间只有3个,各256M,有一个占用率为83%)
shared_pool_size=50M
db_writer_processes=1
---------------------------------------------
然后再把备份的导入到这个表中,然后删除备份表,试试
alter table 表名 shrink space;
好像是在10g上才支持的
方法2: move tablespace,需要重建索引
alter table tab_name move tablespace xxx;
然后,删除这么多用DELETE会用很长时间吧,
综合看来,还不如导出需要的数据到备份表,TRUNCATE,然后导入,重建索引来的划算呢,呵呵,学习哦
bstat,estat是什么啊
8i不能用Stackpack分析么,我刚找了关于这个的资料。
还要问一下啊,回滚表空间要不要增加呢。现在的DB中,只有3个回滚表空间,每个只有256M,使用率分别为79.8,28.7,83.3这个是不是也是影响速度的原因之一呢?+++
再汇报一下:
前天晚上重建了全部索引(增加临时表空间TMP01~04G,H.ora8个文件)。
效果很奇怪:相关部门反应,速度快了,使用时可以连着点了
但我们用以下语句查询表空间占用情况时,速度奇慢,比平时还要慢很多,每次都要1200多秒,即使在服务品端也要977秒!实在奇怪。+++
准备重做系统,升级数据库:
初步想用win2003server + oracle10g大家有什么好的建议啊!
重建索引语句:ALTER INDEX PK_ENJBTR03 REBUILD NOLOGGING TABLESPACE BKENIDX01;查询表空间占用情况SQL:SELECT
A.TABLESPACE_NAME as TABLESPACE,
ROUND(SUM(A.TOTAL1)/1024/1024, 1) as "Allocate(MB)",
ROUND((SUM(A.TOTAL1)-SUM(A.SUM1))/1024/1024,1) as "Used(MB)",
ROUND(SUM(A.SUM1)/1024/1024,1) as "Free(MB)",
100-ROUND((SUM(A.SUM1)/SUM(A.TOTAL1)*100),1) as "(%)",
ROUND(SUM(A.MAXB)/1024/1024,1) as "Max Size",
MAX(A.CNT) as "Fragment"
FROM (
SELECT
TABLESPACE_NAME,
0 as TOTAL1,
SUM(BYTES) as SUM1,
MAX(BYTES) as MAXB,
COUNT(BYTES) as CNT
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME
UNION
SELECT
TABLESPACE_NAME,
SUM(BYTES) as TOTAL1,
0,
0,
0
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME
) A
GROUP BY A.TABLESPACE_NAME 这里不能边续回复啊,,晕,不知道能不能发出去。
下面取自Oracle9i文档
Statspack is not supported with releases earlier than 8.1.6.所以可以知道从8.1.7开始支持Statspack.
当时是采用3楼的方法解决的。
我觉得楼主的数据库设计应该更改一下:
假设那个大表叫TA,目前用户为UA,你应该在其他用户UB中建立一个同TA一样的表,存储在不同的表空间中.
并在每天夜维或每隔一段时间,自动把UA.TA部分内容导入到UB.TA中,这样,UA.TA永远不会太大。
可以通过resize的方法回收物理空间。