左右db_block_size了解和实验

本文通过手动创建小表及对大表的操作实验,详细记录并分析了 Oracle 数据库中 db_block_gets 的变化情况。实验揭示了 db_block_gets 在不同场景下(如表的创建、数据的插入、更新和删除)的具体表现,并总结了其行为规律。
关于db_block_gets了解和实验




实验

一、 自己手动创建的小表

创建一个区大小为  40k 
SYS@ORCL>show parameter db_block_size


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     8192


SYS@ORCL>create tablespace tyger1 datafile '/u01/app/oracle/oradata/ORCL/tyger1.dbf' size 10m
  2  extent management local uniform size 40k;


Tablespace created.


SYS@ORCL>create table test_db1(x int) tablespace tyger1;


Table created.


SYS@ORCL>set autotrace on 
SYS@ORCL>insert into test_db1 values(1);


1 row created.




Execution Plan
----------------------------------------------------------


-------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | INSERT STATEMENT |      |     1 |   100 |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------




Statistics
----------------------------------------------------------
          1  recursive calls
         19  db block gets
          1  consistent gets
          3  physical reads
        964  redo size
        675  bytes sent via SQL*Net to client
        562  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed


SYS@ORCL>insert into test_db1 values(2);


1 row created.




Execution Plan
----------------------------------------------------------


-------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | INSERT STATEMENT |      |     1 |   100 |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------




Statistics
----------------------------------------------------------
          1  recursive calls
          3  db block gets
          1  consistent gets
          0  physical reads
        244  redo size
        675  bytes sent via SQL*Net to client
        562  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed




2. 创建一个区 大小为80k
SYS@ORCL>create tablespace tyger2 datafile '/u01/app/oracle/oradata/ORCL/tyger2.dbf' size 10m
  2  extent management local uniform size 80k;


Tablespace created.


SYS@ORCL>create table test_db2(x int) tablespace tyger2;


Table created.


SYS@ORCL>insert into test_db2 values(1);


1 row created.




Execution Plan
----------------------------------------------------------


-------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | INSERT STATEMENT |      |     1 |   100 |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------




Statistics
----------------------------------------------------------
          1  recursive calls
         29  db block gets
          1  consistent gets
         28  physical reads
       1364  redo size
        675  bytes sent via SQL*Net to client
        562  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed


SYS@ORCL>insert into test_db2 values(2);


1 row created.




Execution Plan
----------------------------------------------------------


-------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | INSERT STATEMENT |      |     1 |   100 |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------




Statistics
----------------------------------------------------------
          1  recursive calls
          3  db block gets
          1  consistent gets
          0  physical reads
        288  redo size
        677  bytes sent via SQL*Net to client
        562  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed



结论:对于新创建的表来说。由于创建的是空表就没有对表里的空间进行分配,当插入第一条数据时,就须要对区上的块进行空间分配和对数据字典的一些操作,就会有比較大的db_block_size。

假设再次插入数据的话就基本没有对空间的分配啥的,就会有比較少的db_block_size产生。

所以对于extent指定的区大小来说  相同的空表插入相同的数据 db_block_size 可能不同。


对插入更新、删除的实验:
SYS@ORCL>update test_db1 set x=3 where x=1;


1 row updated.




Execution Plan
----------------------------------------------------------
Plan hash value: 2185639234


-------------------------------------------------------------------------------
| Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT   |          |     1 |    13 |     2   (0)| 00:00:01 |
|   1 |  UPDATE            | TEST_DB1 |       |       |            |          |
|*  2 |   TABLE ACCESS FULL| TEST_DB1 |     1 |    13 |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------


   2 - filter("X"=1)


Note
-----
   - dynamic sampling used for this statement




Statistics
----------------------------------------------------------
         28  recursive calls
          1  db block gets
         11  consistent gets
          0  physical reads
        388  redo size
        678  bytes sent via SQL*Net to client
        565  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed


SYS@ORCL>delete test_db1 where x=2;


1 row deleted.




Execution Plan
----------------------------------------------------------
Plan hash value: 3135214910


-------------------------------------------------------------------------------
| Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | DELETE STATEMENT   |          |     1 |    13 |     2   (0)| 00:00:01 |
|   1 |  DELETE            | TEST_DB1 |       |       |            |          |
|*  2 |   TABLE ACCESS FULL| TEST_DB1 |     1 |    13 |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------


   2 - filter("X"=2)


Note
-----
   - dynamic sampling used for this statement




Statistics
----------------------------------------------------------
          5  recursive calls
          1  db block gets
          9  consistent gets
          0  physical reads
        288  redo size
        678  bytes sent via SQL*Net to client
        557  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed


SYS@ORCL>insert into test_db1 values(&x);
Enter value for x: 1
old   1: insert into test_db1 values(&x)
new   1: insert into test_db1 values(1)


1 row created.


。。。。
SYS@ORCL>commit;


Commit complete.


SYS@ORCL>select * from test_db1;


         X
----------
         3
         1
         2
         3
         4
         5
         6
         7
         8
         9
        19
        10
         1
        11
        12
        13
        14
        15
        16
        17
        18


21 rows selected.



SYS@ORCL>alter system flush buffer_cache;


System altered.
SYS@ORCL>update test_db1 set x=21 where x=18;


1 row updated.




Execution Plan
----------------------------------------------------------
Plan hash value: 2185639234


-------------------------------------------------------------------------------
| Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT   |          |     1 |    13 |     2   (0)| 00:00:01 |
|   1 |  UPDATE            | TEST_DB1 |       |       |            |          |
|*  2 |   TABLE ACCESS FULL| TEST_DB1 |     1 |    13 |     2   (0)| 00:00:01 |
-------------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------


   2 - filter("X"=18)


Note
-----
   - dynamic sampling used for this statement




Statistics
----------------------------------------------------------
          5  recursive calls
          1  db block gets
          9  consistent gets
          0  physical reads
        412  redo size
        678  bytes sent via SQL*Net to client
        567  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed



二、对于比較大的表来说


SYS@ORCL>create table test_db1 as select * from dba_objects;


Table created.
 
 
SYS@ORCL>insert into test_db1 values('tyger','tyger','tyger',22,23,'tyger','04-SEP-14','04-SEP-14','tyger','t','t','t','t');


1 row created.




Execution Plan
----------------------------------------------------------


-------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------
|   0 | INSERT STATEMENT |      |     1 |   100 |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------




Statistics
----------------------------------------------------------
          1  recursive calls
         15  db block gets
          1  consistent gets
          5  physical reads
       1144  redo size
        677  bytes sent via SQL*Net to client
        646  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed


 
 
SYS@ORCL>alter system flush buffer_cache;


System altered.


SYS@ORCL>update test_db1 set OBJECT_NAME='tom' where owner='tyger';


3 rows updated.




Execution Plan
----------------------------------------------------------
Plan hash value: 2185639234


-------------------------------------------------------------------------------
| Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT   |          |     8 |   664 |   154   (2)| 00:00:02 |
|   1 |  UPDATE            | TEST_DB1 |       |       |            |          |
|*  2 |   TABLE ACCESS FULL| TEST_DB1 |     8 |   664 |   154   (2)| 00:00:02 |
-------------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------


   2 - filter("OWNER"='tyger')


Note
-----
   - dynamic sampling used for this statement




Statistics
----------------------------------------------------------
          5  recursive calls
          3  db block gets
        769  consistent gets
        687  physical reads
        824  redo size
        679  bytes sent via SQL*Net to client
        589  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          3  rows processed
SYS@ORCL>delete test_db1 where owner='tyger';


3 rows deleted.




Execution Plan
----------------------------------------------------------
Plan hash value: 3135214910


-------------------------------------------------------------------------------
| Id  | Operation          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------
|   0 | DELETE STATEMENT   |          |     8 |   136 |   154   (2)| 00:00:02 |
|   1 |  DELETE            | TEST_DB1 |       |       |            |          |
|*  2 |   TABLE ACCESS FULL| TEST_DB1 |     8 |   136 |   154   (2)| 00:00:02 |
-------------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------


   2 - filter("OWNER"='tyger')


Note
-----
   - dynamic sampling used for this statement




Statistics
----------------------------------------------------------
          4  recursive calls
          3  db block gets
        769  consistent gets
          0  physical reads
       1064  redo size
        679  bytes sent via SQL*Net to client
        567  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          3  rows processed


结论:对于占用多个段的大表来说。可能对数据改动时 对 数据字典  或者对于区、块的分配都包括在 physical reads中。



感想:

对于生产库来说,这个值一般不会太考虑究竟数字是怎么来的,由于数字都比较大,通常只关心它的尺寸大小。

版权声明:本文博主原创文章。博客,未经同意不得转载。

转载于:https://www.cnblogs.com/yxwkf/p/4834893.html

clear; close all; clc; % 读取并处理原始图像 Y1 = imread('study.jpg'); I = im2double(rgb2gray(Y1)); % 转换为[0,1]范围的灰度图像 % 获取实际图像尺寸 [imHeight, imWidth] = size(I); imSize = min(imHeight, imWidth); % 使用最短边作为图像尺寸 % 确保图像尺寸是8的倍数(分块大小) if mod(imSize, 8) ~= 0 imSize = floor(imSize / 8) * 8; % 向下取整为8的倍数 I = imresize(I, [imSize, imSize]); % 调整图像大小 fprintf('图像已调整为 %dx%d\n', imSize, imSize); end K = 8; % 分块大小 gridSize = imSize / K; % 分块网格尺寸 D = zeros(imSize); % 预分配输出矩阵 E = 0.02; % 嵌入强度(DFT比DCT更敏感,需降低强度) % 读取并处理水印 J = imread('output.png'); J = imresize(J, [gridSize, gridSize]); % 调整水印大小为网格尺寸 J = imbinarize(rgb2gray(J)); % 确保二值水印 % === 可视化 === figure; subplot(2,3,1); imshow(Y1); title('原始图像'); subplot(2,3,2); imshow(J); title(['水印图像 ', num2str(gridSize), 'x', num2str(gridSize)]); % === 水印嵌入(使用DFT)=== for p = 1:gridSize for q = 1:gridSize x_start = (p-1)*K+1; y_start = (q-1)*K+1; x_end = x_start+K-1; y_end = y_start+K-1; % 提取图像块 block = I(x_start:x_end, y_start:y_end); % DFT变换(2D) fft_block = fft2(block); % 移频操作,将低频移到中心 fft_shifted = fftshift(fft_block); % 嵌入水印(在低频区域,避开直流分量) alpha = 0.15 * J(p,q); % 调整嵌入因子 % 选择低频区域的点(避开中心直流分量) row = 3; col = 3; % 例如,选择离中心较近的点 % 修改幅度谱(保留相位信息) magnitude = abs(fft_shifted); phase = angle(fft_shifted); % 嵌入水印信息 magnitude(row, col) = magnitude(row, col) + alpha * E; % 重构复数频谱 fft_shifted_modified = magnitude .* exp(1i * phase); % 逆移频 fft_unshifted = ifftshift(fft_shifted_modified); % 逆DFT变换 modified_block = ifft2(fft_unshifted); % 取实部(虚部理论上应为0,或接近0) modified_block = real(modified_block); % 存储处理后的块 D(x_start:x_end, y_start:y_end) = modified_block; end end subplot(2,3,3); imshow(D); title('含水印图像'); % === 低通滤波攻击 === hh = fspecial('gaussian', [3 3], 0.35); QQ = imfilter(D, hh, 'replicate'); subplot(2,3,4); imshow(QQ); title('低通滤波后图像'); % === 水印提取(使用DFT)=== W = false(gridSize); for p = 1:gridSize for q = 1:gridSize x_start = (p-1)*K+1; y_start = (q-1)*K+1; x_end = x_start+K-1; y_end = y_start+K-1; % 原始块DFT orig_block = I(x_start:x_end, y_start:y_end); orig_fft = fftshift(fft2(orig_block)); orig_magnitude = abs(orig_fft); % 攻击块DFT attk_block = QQ(x_start:x_end, y_start:y_end); attk_fft = fftshift(fft2(attk_block)); attk_magnitude = abs(attk_fft); % 选择与嵌入时相同的频率点 row = 3; col = 3; % 计算幅度变化 magnitude_diff = attk_magnitude(row, col) - orig_magnitude(row, col); % 决策(阈值需根据实际情况调整) if magnitude_diff > 0.015 * E W(p,q) = true; end end end % === 结果显示 === subplot(2,3,5); imshow(hh, []); title('高斯滤波器'); subplot(2,3,6); imshow(W); title('提取的水印'); % 计算误码率 error_rate = sum(J(:) ~= W(:)) / numel(J); fprintf('水印误码率: %.2f%%\n', error_rate*100); 优化一下
最新发布
06-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值