在下只好低头哈腰的给他解释了半天,delete是不会回收空间的,咱们数据库的表空间很充足,数据文件还自动扩展,你用delete删除数据之后,这部分空间虽然被置成可用状态了,但表空间充足的情况下,一般并不会被使用,这样这张表就会越删越大,你虽然只删除2万多条数据,但是这SQL要走全表扫描。
创新互联建站是一家专注于成都网站设计、成都网站制作与策划设计,青白江网站建设哪家好?创新互联建站做网站,专注于网站建设十多年,网设计领域的专业建站公司;建站业务涵盖:青白江等地区。青白江做网站价格咨询:18982081108
性能调整:调整需求一般根据数据库服务器的响应时间来确定是否要调整,发现瓶颈,调整性能,解决问题。需要有具体的问题描述,方可意义。
回收表空间碎片:简单粗暴管用的方法,导出后重建,再导入。
两种方法,一种是在线重定义表,操作起来比较麻烦
还有一种简单点的,就是收缩高水位空间,语法如下:
alter table ggs_ddl_hist enable row movement;
alter table ggs_ddl_hist shrink space cascade;
alter table ggs_ddl_hist disable row movement;
alter table tablename move [tablespace tablespacename];\x0d\x0a\x0d\x0adelete数据不会回收已经分配出去的block(也就是delete前后你查看user_segments中的信息不会有改动)。\x0d\x0a但这时你对表执行analyze后查看dba_tables表的话会发现empty_block数目变大或者avg_space数据变小。\x0d\x0a \x0d\x0a如果你希望减少该table占用的实际block数目,\x0d\x0a你需要使用move操作将table重建,oracle才会重新分配block,这时table上的索引会失效,需要rebuild。\x0d\x0a\x0d\x0a一,创建测试环境\x0d\x0a1.1 创建测试表,为其插入16万条记录\x0d\x0acreate table jax_t11 \x0d\x0aas\x0d\x0aselect * from dba_objects \x0d\x0awhere rownum user, -- 表的拥有者\x0d\x0a tabname = upper('jax_t11'), -- 表名称\x0d\x0a method_opt = 'for all indexed columns size 1', -- 获得所有索引列的柱状图\x0d\x0a cascade = TRUE ); -- 级联获取 indexes的统计信息\x0d\x0aend;\x0d\x0a\x0d\x0a1.4 查看表占用空间大小\x0d\x0aselect segment_name,segment_type,bytes/1024/1024 from dba_segments ds\x0d\x0awhere ds.segment_name in ( 'JAX_T11', upper('idx_jax_t11_01'));\x0d\x0a\x0d\x0aSEGMENT_NAME SEGMENT_TYPE BYTES/1024/1024\x0d\x0aJAX_T11 TABLE 17\x0d\x0aIDX_JAX_T11_01 INDEX 9\x0d\x0a这里我们可以看到,表占空间17M,索引占空间9M;\x0d\x0a\x0d\x0a表空间占用明细\x0d\x0aSELECT table_name,tablespace_name,\x0d\x0anum_rows, -- 记录行数\x0d\x0aavg_row_len, --平均行长度 \x0d\x0ablocks,\x0d\x0aavg_space, \x0d\x0aempty_blocks\x0d\x0afrom user_tables ut\x0d\x0awhere ut.table_name = 'JAX_T11'\x0d\x0a\x0d\x0aTABLE_NAME TABLESPACE_NAME NUM_ROWS AVG_ROW_LEN BLOCKS AVG_SPACE EMPTY_BLOCKS\x0d\x0aJAX_T11 DRP_DATA 160000 100 2146 0 0\x0d\x0a\x0d\x0a索引空间占用明细\x0d\x0aSELECT index_name,table_name,leaf_blocks,distinct_keys,num_rows\x0d\x0afrom user_indexes ut\x0d\x0awhere ut.index_name = upper('idx_jax_t11_01')\x0d\x0aINDEX_NAME TABLE_NAME LEAF_BLOCKS DISTINCT_KEYS NUM_ROWS\x0d\x0aIDX_JAX_T11_01 JAX_T11 1036 9832 160000\x0d\x0a\x0d\x0a二,删除90%的记录后的空间占用\x0d\x0a2.1 删除90%的记录\x0d\x0adelete from jax_t11\x0d\x0a where rowid in (select r1\x0d\x0a from (select rowid r1, mod(rownum, 100) r2 from jax_t11) t\x0d\x0a where r2 user, -- 表的拥有者\x0d\x0a tabname = upper('jax_t11'), -- 表名称\x0d\x0a method_opt = 'for all indexed columns size 1', -- 获得所有索引列的柱状图\x0d\x0a cascade = TRUE ); -- 级联获取 indexes的统计信息\x0d\x0aend;\x0d\x0a\x0d\x0a2.3 查看表占用空间大小\x0d\x0aselect segment_name,segment_type,bytes/1024/1024 from dba_segments ds\x0d\x0awhere ds.segment_name in ( 'JAX_T11', upper('idx_jax_t11_01'));\x0d\x0a\x0d\x0aSEGMENT_NAME SEGMENT_TYPE BYTES/1024/1024\x0d\x0aJAX_T11 TABLE 17\x0d\x0aIDX_JAX_T11_01 INDEX 9\x0d\x0a这里我们可以看到,表占空间17M,索引占空间9M;与删除数据前相比,没有任何改变\x0d\x0a\x0d\x0a表空间占用明细\x0d\x0aSELECT table_name,tablespace_name,\x0d\x0anum_rows, -- 记录行数\x0d\x0aavg_row_len, --平均行长度 \x0d\x0ablocks,\x0d\x0aavg_space, \x0d\x0aempty_blocks\x0d\x0afrom user_tables ut\x0d\x0awhere ut.table_name = 'JAX_T11'\x0d\x0a\x0d\x0aTABLE_NAME TABLESPACE_NAME NUM_ROWS AVG_ROW_LEN BLOCKS AVG_SPACE EMPTY_BLOCKS\x0d\x0aJAX_T11 DRP_DATA 14400 100 2146 0 0\x0d\x0a\x0d\x0a索引空间占用明细\x0d\x0aSELECT index_name,table_name,leaf_blocks,distinct_keys,num_rows\x0d\x0afrom user_indexes ut\x0d\x0awhere ut.index_name = upper('idx_jax_t11_01')\x0d\x0aINDEX_NAME TABLE_NAME LEAF_BLOCKS DISTINCT_KEYS NUM_ROWS\x0d\x0aIDX_JAX_T11_01 JAX_T11 998 7654 14400\x0d\x0a\x0d\x0a三,move table rebuild index\x0d\x0a3.1 删除90%的记录\x0d\x0aalter table jax_t11 move;\x0d\x0aalter index idx_jax_t11_01 rebuild;\x0d\x0a\x0d\x0a3.2 分析表及索引\x0d\x0abegin\x0d\x0a dbms_stats.gather_table_stats\x0d\x0a ( ownname = user, -- 表的拥有者\x0d\x0a tabname = upper('jax_t11'), -- 表名称\x0d\x0a method_opt = 'for all indexed columns size 1', -- 获得所有索引列的柱状图\x0d\x0a cascade = TRUE ); -- 级联获取 indexes的统计信息\x0d\x0aend;\x0d\x0a\x0d\x0a3.3 查看表占用空间大小\x0d\x0aselect segment_name,segment_type,bytes/1024/1024 from dba_segments ds\x0d\x0awhere ds.segment_name in ( 'JAX_T11', upper('idx_jax_t11_01'));\x0d\x0a\x0d\x0aSEGMENT_NAME SEGMENT_TYPE BYTES/1024/1024\x0d\x0aJAX_T11 TABLE 2\x0d\x0aIDX_JAX_T11_01 INDEX 0.8125\x0d\x0a这里我们可以看到,表占空间2M,索引占空间0.8125M;与删除数据前相比,该回收的空间已经回收完毕