前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >左右db_block_size了解和实验

左右db_block_size了解和实验

作者头像
全栈程序员站长
发布于 2022-07-06 08:59:19
发布于 2022-07-06 08:59:19
3110
举报

大家好,又见面了,我是全栈君

关于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://javaforall.cn/116932.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SQL Tuning 基础概述10 - 体会索引的常见执行计划
在《SQL Tuning 基础概述05 - Oracle 索引类型及介绍》的1.5小节,提到了几种"索引的常见执行计划":
Alfred Zhao
2019/05/24
3480
@dbsnake-用合适的函数索引来避免看似无法避免的全表扫描
昨天听了@dbsnake的SQL方法论,感觉比第一次要更有感觉,希望对实际工作能有帮助。
bisal
2019/01/29
6160
【DB笔试面试592】在Oracle中,表和表之间的关联方式有哪几种?
① 排序合并连接(Sort Merge Join,简称SMJ),Oracle 6提供
AiDBA宝典
2019/09/29
2.2K0
【DB笔试面试592】在Oracle中,表和表之间的关联方式有哪几种?
sql_profile的使用(一) (r2笔记29天)
今天看了老熊关于sql_profile的讲解,受益匪浅,自己在本机也做了一通,感觉好记性不如烂笔头还是得多总结总测试才能真正理解。 准备的数据如下,创建两个表,一个大,一个小,然后做表分析 SQL> create table t1 as select object_id,object_name from dba_objects where rownum<=50000; Table created. SQL> create table t2 as select * from dba_objects;
jeanron100
2018/03/14
5460
【DB笔试面试608】在Oracle中,如何使用STA来生成SQL Profile?
利用STA对语句进行优化后,STA会对语句进行分析,采用最优的优化策略,并给出优化后的查询计划。可以按照STA给出的建议重写语句。但是,有些情况下,你可能无法重写语句(比如在生产环境中,SQL语句又在一个包中)。这个时候就可以利用Sql Profile,将优化策略存储在Profile中,Oracle在构建这条语句的查询计划时,就不会使用已有相关统计数据,而使用Profile的策略,生成新的查询计划。
AiDBA宝典
2019/09/29
2.8K0
【DB笔试面试608】在Oracle中,如何使用STA来生成SQL Profile?
这条SQL的索引,你会如何创建?
在微信群中,老虎刘老师提了一个有趣的问题,这个SQL,object_id列的可选择性非常高,owner列的可选择性比较差,你认为创建什么索引最佳?
bisal
2019/08/29
1.2K0
奇奇怪怪的ORA-01841错误,分析处理过程(全)
最近,遇到了一个关于ORA-01841的报错,起初,认为这个错误处理起来应该不困难,但实际上折腾了很久,才最终找到问题原因,并解决掉,下面将本次解决和分析的过程用样例来说明。
数据和云
2021/01/12
4.6K0
对recursive calls的深刻理解
SQL执行计划中的统计信息部分,出现不为0的recursive calls,对结果的判断,究竟有什么影响?
bisal
2019/08/29
1K0
对recursive calls的深刻理解
补偏救弊 | 关于一致性读与语句性能关系的一大误区
作者简介 黄玮(Fuyuncat) 资深 Oracle DBA,致力于数据库底层技术的研究,其作品获得广大同行的高度评价。 个人网站 www.HelloDBA.com 研究背景 实际上,我们所说的保证
数据和云
2018/03/05
7210
补偏救弊 | 关于一致性读与语句性能关系的一大误区
关于不可见索引的学习(r3笔记74天)
不可见索引在日常工作中可能实用比较少,自己体验了一把,还是比较实用的功能,在平时的工作中不妨尝试一下。 我们来先体验一下,然后再细细的总结一下。 测试环境基于11gR2 > sqlplus -v SQL*Plus: Release 11.2.0.2.0 Production 我们先来创建一个表来看看,然后创建一个不可见索引,来看看索引的访问情况。 create table t as select *from dba_objects where object_id is not null and rownu
jeanron100
2018/03/15
5820
【DB笔试面试619】在Oracle中,举例说明“连接因式分解(Join factorization,JF)”查询转换。
在Oracle中,举例说明“连接因式分解(Join factorization,JF)”查询转换。
AiDBA宝典
2019/09/29
3810
【DB笔试面试620】在Oracle中,举例说明“集合操作关联转变(Set Join Conversion)”查询转换。
在Oracle中,举例说明“集合操作关联转变(Set Join Conversion)”查询转换。
AiDBA宝典
2019/09/29
4470
关于虚拟索引的学习(r3笔记第75天)
昨天简单总结了下不可见索引,今天来说说虚拟索引。 这两个索引听起来有点类似。其实差别还是比较大。 不可见索引有对应的索引段,而虚拟索引没有对应的索引段存在。 不可见索引可以通过alter语句来直接切换可见不可见。而对于虚拟索引而言这些操作都不支持。 不可见索引可以在user_indexes中查到对应的数据字典信息。但是虚拟索引在user_indexes中都没有记录,最后只能从dba_objects里面勉强查到一条它存在的记录。 不可见索引和虚拟索引都有对应的数据库参数,可以通过a
jeanron100
2018/03/15
6930
【每日一摩斯】-Index Skip Scan Feature (212391.1)
INDEX Skip Scan,也就是索引快速扫描,一般是指谓词中不带复合索引第一列,但扫描索引块要快于扫描表的数据块,此时CBO会选择INDEX SS的方式。
bisal
2019/01/29
3490
使用decode函数
Oracle 的decode函数蛮有意思,是oracle独有的,国际标准SQL中并没有decode函数。
全栈程序员站长
2022/09/16
8400
【DB笔试面试475】分区表性能注意事项有哪些?
② 在设计分区表时,避免数据都进入默认分区,从而导致出现默认分区超大或各个分区大小严重不均衡的情况,失去分区表的意义。
AiDBA宝典
2019/09/30
5750
Oracle 全表扫描及其执行计划(full table scan)
    全表扫描是Oracle访问数据库表是较为常见的访问方式之一。很多朋友一看到SQL语句执行计划中的全表扫描,就要考虑对其进行修理一番。全表扫描的存在,的确存在可能优化的余地。但事实上很多时候全表扫描也并非是最低效的,完全要看不同的情形与场合,任一方式都是有利有弊的,也就是具体情况要具体分析。本文描述了什么是全表扫描以及何时发生全表扫描,何时全表扫描才低效。   本文涉及到的相关链接: 高水位线和全表扫描 启用 AUTOTRACE 功能 Oracle 测试常用表BIG_TABLE Oracle
Leshami
2018/08/13
2.8K0
Oracle 索引扫描的几种类型
1.对于unique index来说,如果where 条件后面出现了<,> ,between ...and...的时候,那么就可能执行index range scan,如果where条件后面是=,那么就会执行index unique scan。
星哥玩云
2022/08/17
6200
Oracle海量数据优化-01分区的渊源
当我们看到这条语句时,会想到什么呢? 一条再简单不过的按照条件删除数据库的操作。 如果大量存在,会不会引起系统性能问题呢?
小小工匠
2021/08/16
3970
【DB笔试面试604】在Oracle中,存储概要(Stored Outline)的作用是什么?
OUTLINE的原理是将调好的执行计划(一系列的Hint)保存起来,然后使用该效率高的执行计划替换之前效率低下的执行计划,从而使得当系统每次执行该SQL时,都会使用已存储的执行计划来执行。所以,可以在不改变已有系统SQL的情况下达到改变其执行计划的目的。OUTLINE方式是通过存储Hint的方式来达到执行计划的稳定与改变。当发现低效SQL之后,可以使用Hint优化它,对于SQL代码可以修改的情况,直接修改SQL代码加上Hint即可。
AiDBA宝典
2019/09/29
1.1K0
推荐阅读
相关推荐
SQL Tuning 基础概述10 - 体会索引的常见执行计划
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档