Oracle 行链接 和 行迁移 详解

1 概述

1. 出现场景
   当一行的 '数据过长' 而不能存储在单个 '数据块' 中时,就可能出现两种情况: 
   行链接(Row Chaining) 或 行迁移(Row Migration)

2. 区别
   (1) 行链接:发生在 insert 阶段
   (2) 行迁移:发生在 update 阶段

3. 注意事项
   (1) 无论是 行迁移 还是 行连接,都会影响数据库的 '性能'
   (2) 在读取这样的数据时,Oracle 会扫描多个数据块,执行更多的 I/O

2 详解

2.1 行链接 row chaining

1. 产生原因
   (1) insert 导致记录行不足以在 block 中存放的时候,就会发生 '行链接'
   (2) 常见类型的数据: long、long row、lob
   
2. 多个 block 块
   (1) 将上述记录拆分为多个 block 中,并将其 '链接'chain)起来
   
3. 预防行链接
   (1) 扩大 block 的大小          -- 默认 8 k

2.2 行迁移 row migrating

1. 产生原因
   (1) update 导致记录行长增加,block 的 '剩余空间' 不足以存放这条记录时,就会产生 '行迁移'
   
2. rowid 不变
   (1) 原 block 中会有一个 '指针' 指向该条记录新的 block 地址

3. 预防行迁移
   (1) 将 block 中的 pctfree 调高 -- 默认 10%
   (2) 扩大 block 的大小          -- 默认 8 k

3 扩展

3.1 迁移查询

select dt.table_name,
       dt.pct_free, -- 空闲空间%
       dt.pct_used, -- 可用空间% = 1 - 空闲空间%
       dt.num_rows,
       dt.chain_cnt -- 迁移总数 = 行链接 + 行迁移
  from dba_tables dt
 where dt.owner = 'SCOTT'
 order by dt.table_name;

3.2 pfctree 和 pctused

3.3 block

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Oracle数据库中,转列和列转是一种常见的数据转换操作,可以通过使用Oracle的PIVOT和UNPIVOT函数来实现。 1. 转列(PIVOT): 转列是将一数据转换为多列数据的操作。在Oracle中,可以使用PIVOT函数来实现转列操作。Pivot函数将数据按照指定的列进分组,并将每个分组的值转换为新的列。 例如,假设有以下表格"sales": ``` +---------+-------+-------+ | Product | Month | Sales | +---------+-------+-------+ | A | Jan | 100 | | A | Feb | 200 | | B | Jan | 150 | | B | Feb | 250 | +--+-------+ ``` 可以使用PIVOT函数将上述表格按照月份进转列操作: ```sql SELECT * FROM sales PIVOT ( SUM(Sales) FOR Month IN ('Jan', 'Feb') ); ``` 结果如下: ``` +--+-----+-----+ | A | 100 | 200 | | B | 150 | 250 | +---------+-----+-----+ ``` 2. 列转(UNPIVOT): 列转是将多列数据转换为一数据的操作。在Oracle中,可以使用UNPIVOT函数来实现列转操作。Unpivot函数将指定的列转换为新的。 例如,假设有以下表格"sales": ``` +--+-----+ | A | 100 | 200 | | B | 150 | 250 | +---------+-----+-----+ ``` 可以使用UNPIVOT函数将上述表格进列转操作: ```sql SELECT * FROM sales UNPIVOT ( Sales FOR Month IN (Jan, Feb) ); ``` 结果如下: ``` +---------+-------+-------+ | Product | Month | Sales | +---------+-------+-------+ | A | Jan | 100 | | A | Feb | 200 | | B | Jan | 150 | | B | Feb | 250 | +--+-------+ ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼丸丶粗面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值