oracle 48101 block,db_block_size是操作系统块的原因?
请问
所有资料上都说
db_block_size 要配置成操作系统块的整数倍
能够提高 处理速度,
可是都没有说明原因?那位老大能说明一下原因啊?:em14:
ivhb
oracle可以用裸设备。但是用裸设备也要用操作系统自己的打开/读写设备的接口。
在unix下,就是open/read/write。对于块设备,unix一般每次读写512字节,这就是unix上的块大小。
简而言之,oracle可以绕过文件系统(用操作文件系统--也就是熟文件,那么打开文件时候,操作系统会给你在操作系统层级上进行缓存。相当于访问数据时候 磁盘->操作系统文件块缓存->数据库缓存->检索到返回用户)。如果用裸设备的,则不会有操作系统缓存这一块。少了一次复制吧。
简要来说: oracle可以绕过文件系统,但是不可能绕过系统调用。
只要运行在操作系统上,要访问设备或者内核数据,都必须通过系统调用,切换程序运行态为核心态,才可能做到。
至于说的必须是整数倍,也就好理解了。
因为系统的块大小是一次读写的基本单位。假定块大小是512字节,DB_BLOCK_SIZE配置成600,那么每读取数据库的一块,操作系统层面需要发生两次读,才能完整的读取到数据库的块。其中,第二次读写只有88字节是有效的。相当于浪费了一部分读取能力
[[i] 本帖最后由 ivhb 于 2008-9-8 23:00 编辑 [/i]]
ILoveMK
:mrgreen: good
jayli426
那下面理解是否正确,大虾执教啊
1)对于裸设备?db_block_size配的越大越好,或者说尽量配大?是否配成8192,每次读取就是取8192,而不是512?(感觉好像理解错了,但是不知大虾专门提到裸设备的目的是为何)
2)对于文件系统,配成8192和配成512其实不能提高多少速度,因为配成8192还是需要读16次,只是一回读的块数多了,但是对于IO而言,每次读的字节数没有增加啊,该读多少还是多少。仅仅是配成非整数倍的时候有些浪费?
doni
db_block_size的设置与数据库应用面有关,也就是说这个库的数据是怎么样的,读写时又是怎么样的
在特定条件下,db_block_size对性能有相当的影响,我做过一些测试,
在Solaris 8 + oracle 7 或 Solaris 10 + oracle 7的条件下,在多个机型上做imp
db_block_size 设置为8192比2048的imp速度可以提高近50%
jayli426
大虾,你这是实践证明。
但不是理论说明啊,只是让大家多了一个经验,却没有理论总结
能否在原理上阐述一下
doni
比如:你打完麻将,打牌放回盒子,是一个个放快呢,还是4个4个放快呢?
当然也是不每次的数量越大越好,要看你的手有多大。
所以db_block_size的设置要根据具体情况来定
camham
block size就是数据库与磁盘一次交互的大小,或者说是io。如果每次操作都需要大量数据返回,则block越大越好,效率高。反之,如果只是做单条记录操作,例如insert,再大block都一样,反而浪费了内存。具体大小要看效率,简单説业务系统用小block,分析系统用大block
jayli426
因为小弟非科班出身,操作系统不熟悉
请问:数据库与磁盘一次交互要怎么理解
同一次IO是什么关系
例如现在磁盘IO一次读取的大小是512bytes
那么8192bytes就总需要读16次
而不论你的db_block_size是多少
例如db_block_size=8192,需要16次IO读取
例如db_block_size=8192/2 ,但是读8912还是需要16次读取
即:反正IO的读取次数是不会变的哦
借用这个比方“比如:你打完麻将,打牌放回盒子,是一个个放快呢,还是4个4个放快呢?”
目前我的理解层面上就不会出现“4个4个放快呢?”的情况啊
那么这时理解“数据库与磁盘一次交互”
就很重要了,
原谅小弟的菜蔬学浅啊
原谅小弟的反反复复,罗罗所所啊:em14:
ivhb
没错,db_block_size是设置多大,最后产生的物理的IO的次数也会随之变化。
这个没有疑问的。比如DB_BLOCK_SIZE设定为4K和32K,那么,前者大概发生8次读操作;后者发生64次读操作。
OLAP一般推荐使用较大的db_block_size,而OLTP一般推荐使用较小的db_block_size。
原因在于,数据库读取一条记录(注意是一条记录也好,多条记录也好。都是一样的)
数据库系统都会按照你的要求去定位记录,如果该记录在缓存中,则从缓存中直接读取。如果该记录不再缓存中,则从定位到磁盘块,然后读取---注意,是读取一整块(db_block_size大小),缓存到sga中。这个缓存动作以db_block_size为单位的。
这样,你可以发现,对于OLPT来说,一般都是输入一个客户号,一个帐号。。。根据这些信息一般都能唯一的定位到一条记录,然后操作该记录,是一个很典型的scattered read动作(记录很分散)。记录访问的分散造成的后果是---你的内存大小是固定的,数据库不可能总是帮你缓存所有的记录。因此,经常发生缓存和磁盘的交换(显然的,db_block_size设定越大,记录访问越随机越分散,则发生交换的次数越多---意味着更多的读写磁盘发生。这样就会显著的降低系统的效率)。
对于OLAP来说,一般都是会操作所有的记录。记录的访问具有连续性。你可以发现,一次缓存越多,基本上来说就是越有利。
db_block_size本质上来说,就是给了用户预读数据,下次访问从缓存中读取/更新,而不是每次从磁盘上读取,而带来的性能上的提升。db_block_size设定越大,在一定程度上,造成的内存浪费越大(在随机访问下尤其如此)。如果内存是无限的,我想不管是OLAP或者OLTP来说,都会推荐大的db_block_size---也许就没有了db_block_size---整个数据库的全部数据都在内存
这是之前在ChinaUnix论坛的上的一个提问,chinaunix就是这点不好,一旦没有置为精华,过一段时间就会被清除掉,想找都不找不到,幸好有位有心人,保存了这个帖子,所以我又从他那里copy回来
这个应当说明了DB_BLOCK_SIZE的原因,照大虾的 回答,DB_BLOCK_SIZE 是操作系统的整数倍的意义并不大,关键是DB_BLOCK_SIZE 是为了在内存中命中率,对于OLTP系统,因为记录访问随机和分散,所以DB_BLOCK_SIZE设得相对较小就有好处
什么意思呢,假设我们的DB_BUFFER只有 32k大
如果我们要经常更新32条记录,他们每条记录至少差8k的距离
什么意思,就是每8k才有一条记录,
那么如果DB_BLOCK_SIZE=8k,那么DB_BUFFER实际上只放了4条我们常做更新的记录
但是如果DB_BLOCK_SIZE=1k,那么DB_BUFFER实际上就能放了32条我们常做更新的记录
但是对于OLAP,我们通常需要对大量数据做统计,数据一般是连续性的,所以
这个时候DB_BLOCK_SIZE大一些就更好吗?
oracle 48101 block,db_block_size是操作系统块的原因?相关推荐
- oracle 48101 block,oracle数据库的一次异常起停处理。
在重启数据库的时候,忘记把一个应用关停了,想起来的时候,就ctrl+c,把数据库shutdown immediate 给强制停下了,把该应用再停止,然后shutdown immdiate,这时候数据报 ...
- oracle一个区有几个块,Oracle段(segment) 区(extent) 块(block)
Data blocks ,Extents,Segment 这就是他们之间的逻辑结构. 先看Data blocks(也叫逻辑块,oracle块,页)吧,oracle存储数据都是在这些数据块 ...
- 查看oracle的块大小,查看操作系统块大小
查看操作系统块大小oracle建库一般设置数据库块大小8192K,一般是OS块大小的整数倍,要避免数据库块大小小于系统块大小的情况.1.在WINDOWS系统上,可以用命令fsutil来查看,测试如下: ...
- Oracle corrupt block(坏块) 详解
转自:http://blog.csdn.net/tianlesoftware/article/details/5024966 一. 坏块说明 1.1 相关链接 在看坏块之前,先看几个相关的链接,在后面 ...
- curr_conv oracle,Oracle 11g ADG Automatic Block Repair(ABMR自动块修复)功能测试
ORACLE 11g ACTIVE Data Guard 不仅提供了physical standby 可以open read-only ,还提供了一个无论是主备库发现currupt block的情况下 ...
- Oracle clean out.,Oracle(block clean out)的块清除
Oracle(block clean out)的块清除 Clean out有2种: fast commit cleanout,delayed block cleanout 1.如果一个事务(trans ...
- oracle block corrupted,ORA-01578: ORACLE data block corrupted (file # 9, block # 45729)
今天在实验的机子的oracle上的一张表中批量插入5000000条记录,在插入过程中途发生了表空间不够的情况,导致插入终止,在表空间上添加一个数据文件,对表中的数据进行查询,发生如下的错误: SQL& ...
- oracle模块损坏,Oracle中模拟及修复数据块损坏
Oracle中模拟及修复数据块损坏,itpub link: http://www.itpub.net/showthread.php?threadid=201766[@more@]Oracle中模拟及修 ...
- oracle 11g跳过坏块,oracle 使用Dbms_Repair跳过坏块
原博文: http://blog.chinaunix.net/uid-77311-id-3051382.html 使用Dbms_Repair跳过坏块 步骤1:表tb_test中有坏块(模拟坏块同方法1 ...
最新文章
- vue中的v-on事件监听机制
- (笔记)Mysql命令select from:查询表中的数据(记录)
- MOSS 2007 / WSS 3.0 运行在Windows Server 2008上不能上传大于28M的文件【已解决】
- 【python数据挖掘课程】二十九.数据预处理之字符型转换数值型、标准化、归一化处理
- syslog()的基本用法
- 遍历一个文件夹所有文件
- Python Day 10 函数(名称空间,作用域,作用域链,加载顺序等; 函数的嵌套 global,nonlocal)...
- java系列1 环境变量配置
- Android提高显示布局文件的性能,使用include标签重用layouts
- WSDL2Java详细使用说明【官方最全说明】
- 在Idea中拉取svn分支
- win7 桌面计算机不显示器,Win7电脑显示器黑屏不显示的解决方案
- 一次数学分析的教学(依然进行中)
- 小程序分包大小超过限制
- 10. Java8新特性-新日期和时间API
- 谷歌I/O大会发布语言模型LaMDA2,以及更多打开想象力的落地应用
- 四大蓝牙天线设计方式
- 计算机毕业设计JAVA人民医院体检预约mybatis+源码+调试部署+系统+数据库+lw
- 安装rpm 树莓派4_树莓派3上安装使用centos 7.4
- 关于使用sdkmanager命令报错(环境:Mac+Android SDK)