ORACLE rowid切分大表

通过如下sql获取rowid切分范围

SELECT rownum || ‘, ‘ || ‘ rowid between ‘ || chr(39) ||
       dbms_rowid.rowid_create(1, DOI, lo_fno, lo_block, 0) || chr(39) ||
       ‘ and  ‘ || chr(39) ||
       dbms_rowid.rowid_create(1, DOI, hi_fno, hi_block, 1000000) ||
       chr(39) data
  FROM (SELECT DISTINCT DOI,
                        grp,
                        first_value(relative_fno) over(PARTITION BY DOI, grp ORDER BY relative_fno, block_id rows BETWEEN unbounded preceding AND unbounded following) lo_fno,
                        first_value(block_id) over(PARTITION BY DOI, grp ORDER BY relative_fno, block_id rows BETWEEN unbounded preceding AND unbounded following) lo_block,
                        last_value(relative_fno) over(PARTITION BY DOI, grp ORDER BY relative_fno, block_id rows BETWEEN unbounded preceding AND unbounded following) hi_fno,
                        last_value(block_id + blocks - 1) over(PARTITION BY DOI, grp ORDER BY relative_fno, block_id rows BETWEEN unbounded preceding AND unbounded following) hi_block,
                        SUM(blocks) over(PARTITION BY DOI, grp) sum_blocks,
                        SUBOBJECT_NAME
          FROM (SELECT obj.OBJECT_ID,
                       obj.SUBOBJECT_NAME,
                       obj.DATA_OBJECT_ID AS DOI,
                       ext.relative_fno,
                       ext.block_id,
                       SUM(blocks) over() SUM,
                       SUM(blocks) over(ORDER BY DATA_OBJECT_ID, relative_fno, block_id) - 0.01 sum_fno,
                       TRUNC((SUM(blocks) over(ORDER BY DATA_OBJECT_ID,
                                               relative_fno,
                                               block_id) - 0.01) /
                             (SUM(blocks) over() / &cnt)) grp,
                       ext.blocks
                  FROM dba_extents ext, dba_objects obj
                 WHERE ext.segment_name = ‘&object_name‘
                   AND ext.owner = ‘&owner‘
                   AND obj.owner = ext.owner
                   AND obj.object_name = ext.segment_name
                   AND obj.DATA_OBJECT_ID IS NOT NULL
                 ORDER BY DATA_OBJECT_ID, relative_fno, block_id)
         ORDER BY DOI, grp);
时间: 2024-10-28 21:03:54

ORACLE rowid切分大表的相关文章

备份oracle中的大表

将原标进行rename操作:RENAME loganalysis to loganalysis_bak; 压缩备份表:alter table LOGANALYSIS_bak move compress; 查看备份表的索引字段:SELECT * from user_cons_columns where TABLE_NAME='LOGANALYSIS_BAK'; 清除备份表的索引:alter table LOGANALYSIS_BAK drop constraint SYS_C005697; 查看备

Oracle大表改为分区表及表空间切换方案

Oracle大表改为分区表及表空间切换方案 一.            背景 由于之前数据库表和索引放在一个表空间导致表空间数据文件增长太快,文件数量即将达到Oracle表空间的限制,需要对表(没有分区,有些表数据量多达几十亿,文件大小TB级)进行表空间迁移,并对某些表改造为分区表. 二.            可选方案分析 1.    使用IMP/EXP 导入(import)导出(export)工具年头已久,将数据导出为二进制文件,将会在11g r2之后废弃,只用于遗留数据的导入导出 此工具可

oracle 的一个大数据表 快速迁移到 Sqlserver2008数据库

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> oracle 的一个大数据表 快速迁移到 Sqlserver2008数据库 - HappyBinhaer的专栏 - 博客频道 - CSDN.NET HappyBinhaer的专栏 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯

SWAP_JOIN_INPUTS Oracle Hint(处理hash join强制大表(segment_size大)作为被驱动表)

swap_join_inputs是针对哈希连接的hint,它的含义是让优化器交换原哈希连接的驱动表和被驱动表的顺序,即在依然走哈希连接的情况下让原哈希连接的驱动表变被驱动表,让原哈希连接的被驱动表变为驱动表. 注意,在swap_join_inputs hint中指定的目标表应该是原哈希连接中的被驱动表,否则oracle会忽略该hint. /*+ swap_join_inputs(原哈希连接的被驱动表) */ 其使用范例如下: 1 2 select /*+ leading(dept) use_ha

【Oracle批量更新】根据一个大表批量更新另一大表的方法比较

[问题]现在有两个千万级别的结构相同数据不同数据表T_SMS_PHONENO(目的表),T_SMS_PHONENO2(源表),根据源表数据更新目的表的数据. [分析]根据经验,更新方法一般有以下几种: 1.直接update. update T_SMS_PHONENO T Set    T.NAME=(select NAME from T_SMS_PHONENO2 where PHONENO=T.PHONENO) 2.采用分条更新.根据记录ID逐条更新. open cur is select ph

删除大表的数据:普通删除语句和游标处理的比较

一.前言 WHERE条件用不到索引的情况下如何删除大表记录?文章中只是列举出其中一种方式而已,但仍然存在很多不严谨的地方.只是 轻描淡写随着数据表越来越大,历史数据的处理将越来越困难.且过滤字段没有索引(如时间)字段,而创建索引是需要临时表空间排序的.有越来越大,创建的维护工作也随之越来越难. 除了本文介绍的方法以外,还可以通过以下几种方法来维护历史数据: 1. 创建历史表,将历史数据定期移至历史表,让源表保持"瘦小身材"(源表会有碎片,需要定期对表和索引进行重建) 2. ORACLE

通过段调优顾问回收大表的分配空间和高水位线

--通过段调优顾问回收大表的分配空间和高水位线 --创建用户 SQL> create tablespace hzqtbs datafile '/u01/app/oracle/oradata/prod/hzqtbs.dbf' size 30m; Tablespace created. SQL> create user hzq identified by hzq default tablespace hzqtbs quota unlimited on hzqtbs account unlock;

MES案例研究1 - 大表并发查询

某工厂是生产数码产品金属外壳的,每天近100万件的产量,随着圣诞节的临近,客户订单大量增加,但是生产却跟不上,经初步分析,发现问题发生在激光雕刻二维码的工位,由于镭雕机从MES取号的时间太长,造成生产的瓶颈. 该厂MES的主要功能是做生产追溯,包括:生产过程记录.关键工位检查.质量问题收集等. 在镭雕工位,客户端程序要从MES中查询得到对应机型的最小序列号,然后传给镭雕机. 查询SQL的核心逻辑为: SELECT MIN(serial_number) FROM t_product_history

Oracle学习笔记八 表空间

表空间 表空间是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间 . 分区表 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区.表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表. 注意:已经存在的表没有方法可以直接转化为分区表 Oracle允许用户将一个表分成多个分区,用户可以执行查询,只访问表中的特定分区,也