首页 > 数据库 >Oracle 高低水位线的学习

Oracle 高低水位线的学习

时间:2023-11-30 17:11:26浏览次数:30  
标签:1024 高低 name 水位 tablespace TABLE Oracle table SELECT

Oracle 高低水位线的学习


背景

最近产品的一些脚本会大量的给一些流程表里面插入数据
因为只是一个流程相关没有时序查询的需求
所以数据量挺大, 但是按照石时间戳删除非常麻烦. 
自己执行过多次delete 但是使用自己的SQL查询表大小,发现总是失败
想起来可能跟高低水位线有关系, 所以这里学习了解一下. 

我理解水位线不进行处理, 在进行全表扫描时 ,会多扫描很多无效的区块
对性能是一个伤害, 所以应该努力降低一下相应的水位线. 

Oracle为了性能 并不会将所有的表放到一个特定的增长位置
所以就会出现, 数据库数据文件增长上去之后没有办法再缩小回来. 

SQLSERVER 没有这样的问题, 但是性能会差一下

为了解决这样的问题 exp/expdp 的备份恢复方式其实是会修改高低水位线的

再不是非常大的 并且有停机时间的环境下面执行一下备份恢复 重建表的查询统计信息对性能其实很有帮助. 

查询情况

表空间名称 表空间大小(M) 表空间剩余大小(M) 表空间使用大小(M) 表空间大小(G) 表空间剩余大小(G) 表空间使用大小(G) 使用率 %
SYSTEM 920 105.625 814.375 0.8984375 0.1031494140625 0.7952880859375 88.52
xxxxORA 1925120 545808.5625 1379311.4375 1880 533.01617431640625 1346.98382568359375 71.65
UNDOTBS2 32024 31099.9375 924.0625 31.2734375 30.37103271484375 0.90240478515625 2.89
SYSAUX 7525 423.3125 7101.6875 7.3486328125 0.41339111328125 6.93524169921875 94.37
USERS 5 4 1 0.0048828125 0.00390625 0.0009765625 20

使用的SQL

SELECT
	a.tablespace_name "表空间名称",
	total / ( 1024 * 1024 ) "表空间大小(M)",
	free / ( 1024 * 1024 ) "表空间剩余大小(M)",
	( total - free ) / ( 1024 * 1024 ) "表空间使用大小(M)",
	total / ( 1024 * 1024 * 1024 ) "表空间大小(G)",
	free / ( 1024 * 1024 * 1024 ) "表空间剩余大小(G)",
	( total - free ) / ( 1024 * 1024 * 1024 ) "表空间使用大小(G)",
	round( ( total - free ) / total, 4 ) * 100 "使用率 %" 
FROM
	( SELECT tablespace_name, SUM( bytes ) free FROM dba_free_space GROUP BY tablespace_name ) a,
	( SELECT tablespace_name, SUM( bytes ) total FROM dba_data_files GROUP BY tablespace_name ) b 
WHERE
	a.tablespace_name = b.tablespace_name
	

修改表的水位线-尝试1

alter table table1_name enable row movement; 
alter table table1_name shrink space ;

发现这个SQL根本无效

修改表的水位线-尝试2

truncate 表可以直接降低水位线

所以想法是 先按照时间戳字段删除大部分数据
然后create tableback as select * from tablesource 建立备份表

然后truncate table tablesource 的方式处理表
然后 insert into tablesource select * from tableback

发现这样处理之后 数据库 查询出来的表大小就会发生变化了. 

部分表信息

TABLE_NAMEINFO TABLE_ROWNUM TABLE_COLNUM TABLE_SIZE
table1_name 2097322 569 76672.875
table2_name 62184 216 27706.5

复制表之后

TABLE_NAMEINFO TABLE_ROWNUM TABLE_COLNUM TABLE_SIZE
table1_name_BACK 744443 68 6696.6875

修改一下表大小获取的SQL

SELECT
    x.table_name AS table_nameinfo,
    x.表行数 AS table_rownum,
    x.表列数 AS table_colnum,
    y.表大小 AS table_size ,
    x.table_tablespace as table_tablespace
FROM
    (
    SELECT
        b.table_name,
        a.num_rows AS 表行数,
        b.count1 AS 表列数 ,
                                a.TABLESPACE_name as table_tablespace
    FROM
        user_tables a
        INNER JOIN ( SELECT table_name, count( column_name ) AS count1 FROM user_tab_columns GROUP BY table_name ) b ON a.table_name = b.table_name
    ORDER BY
        b.table_name
    ) x LEFT outer
    JOIN (
    SELECT
        sum( tablesize ) AS 表大小,
        tablename
    FROM
        (
        SELECT
            sum( C.bytes ) / 1024 / 1024 AS tablesize,
            C.table_name AS tablename
        FROM
            ( SELECT A.table_name, B.bytes FROM USER_lobs A, USER_extents B WHERE A.segment_name = B.segment_name ) C
        GROUP BY
            C.table_name UNION ALL
        SELECT
            sum( bytes ) / 1024 / 1024 AS tablesize,
            segment_name AS tablename
        FROM
            user_extents
        WHERE
            segment_type = 'TABLE'
        GROUP BY
            segment_name
        )
    GROUP BY
        tablename
    ORDER BY
        1 DESC
    ) y ON x.table_name = y.tablename
ORDER BY
    nvl(y.表大小,0) desc FETCH NEXT 100 ROWS ONLY

标签:1024,高低,name,水位,tablespace,TABLE,Oracle,table,SELECT
From: https://www.cnblogs.com/jinanxiaolaohu/p/17867804.html

相关文章

  • oracle 源端资料库通过dblink访问目标端资料库会话直接的关系
    1.知道目标端的会话信息,怎么找到对应的源端资料库的会话连接信息?--目标端selectPROCESSfromv$sessionwhereusername='HR';--源端SELECTADDRFROMV$PROCESSWHERESPID=5344;SELECT*FROMV$SESSIONWHEREPADDR='0000000EBBDE78A0';2.知道源端会话信息,怎......
  • Oracle数据库 使用存储过程判断索引是否存在,再删除索引
    不多废话DECLAREindex_countNUMBER;BEGIN--判断索引UK_TEST_2是否存在SELECTCOUNT(*)INTOindex_countFROMuser_indexesWHEREindex_name='UK_TEST_2';IFindex_count>0THENEXECUTEIMMEDIATE'DROPINDEXU......
  • oracle、sql server Join连表修改。
    1、Oracle连表修改mergeintot_usert1using(select*fromt_class)t2on(t1.userId=t2.userId)whenmatchedthenupdatesett1.name=t2.name2、Sqlserver连表修改UPDATEbSETb.ProductSN=p.productsnFROMt_userbINNERJOINt_studentpONb.MainSN=p.Ma......
  • oracle异常
    1、SQLSyntaxErrorException:ORA-00947:没有足够的值大概率是关系表实际列数大于你所填的元素个数,请检查是否有疏漏的列即可2、MyBatis操作Oracle批量插入ORA-00933:SQL命令未正确结束1)在Oracle中表名的别名不能使用as,直接接别名即可2)SQL中没有VALUES;.<foreach>标签中的(se......
  • Oracle Assets Adjustments API Documentation Supplement (Doc ID 206474.1)
    Appliesto:OracleAssets-Version11.5.10.2andlaterInformationinthisdocumentappliestoanyplatform.PurposeOracleAssetsAdjustmentsAPIYoucanusetheAdjustmentsAPItoadjustassetsdirectlyviaPL/SQLratherthanusingtheOracleAssetsinterf......
  • 判断Oracle是否安装成功
    1、电脑win键+R键,输入cmd,进入命令提示符。2、在命令行中输入==sqlplus/nolog==3、如果没有报错,并出现oracle版本号,则代表安装成功。......
  • oracle排查慢的sql
    oracle排查慢的sqlselect*from(selectsa.SQL_TEXT,sa.SQL_FULLTEXT,sa.EXECUTIONS"执行次数",round(sa.ELAPSED_TIME/1000000,2)"总执行时间",round(sa.ELAPSED_TIME/1000000/sa.EXECUTIONS,2)"平均执行时间&quo......
  • Oracle数据库性能
    Oracle数据库性能数据库性能两大指标QPS(QueriesPerSecond,每秒查询数)TPS(TransactionsPerSecond,每秒处理事务数)具体案例QPS--一分钟QPSselectvaluefromv$sysmetricwheremetric_namein('ExecutionsPerSec')andgroup_id=2--15秒QPSselectvaluefrom......
  • Oracle数据库备份与恢复
    Oracle导入导出命令IMP/EXP.注:以下命令需在命令行执行。1EXP导出1.1完全模式:执行全数据库备份expuser/password@dbnameBUFFER=64000file=C:\full.dmpfull=Y#exp:是Oracle的导出工具,用于备份和恢复数据。#user/password:是Oracle的系统用户和密码,用于执行备份......
  • Oracle Database 19c 创建只读用户
    1.登录oracle数据库服务器,以管理员用户登录sqlplus/assysdba切换容器等操作showpdbs; altersessionsetcontainer=ORA19CPDB;showcon_name;2.创建只读用户createusercmsreadonlyidentifiedbycmsreadonlydefaulttablespaceCMSPROD_DATA......