Oracle: 索引 与… where a =b
摘自《Troubleshooting Oracle Performance》 1. 对于B-树索引 a. 先按索引找到对应的row-id b. 再按row-id获取数据行 2. 对于位图索引 a.先在索引中找到符合条件的索引项 b.然后把该项转换成ROW-ID c.最后按row-id获取数据行
摘自《Troubleshooting Oracle Performance》 1. 对于B-树索引 a. 先按索引找到对应的row-id b. 再按row-id获取数据行 2. 对于位图索引 a.先在索引中找到符合条件的索引项 b.然后把该项转换成ROW-ID c.最后按row-id获取数据行
摘自《Troubleshooting Oracle Performance》 Index Unique Scan: 针对唯一性索引,只返回一个rowId Index Range Scan: 用于非唯一性索引,可以返回多个rowId
因为一个位图索引项可能索引数千行,一个位图锁引项修改,会导致数千行数据被锁
摘自《Troubleshooting Oracle Performance》 通过rowid获取数据行是效率最高的方式 典型的场景是: 1. select rowid from t where xx =xx 2. update t set yy=yy where rowid = xxx
摘自《Troubleshooting Oracle Performance》 可以看一下:执行计划中各步骤返回的结果集中,每行所需的逻辑读的数量。 逻辑读数较高,则这一步可能就是低效的 要得到单行的逻辑读数,那你的执行计划结果中需要有这么两列: 1. A-Rows 实际返回的行数 2. Buffers 返回这么多行所需的逻辑读的数量 单行逻辑读数 = A-Rows/Buffers 这个数字<=5 => 不错的访问路径 介于10和15之间 => 可以接受 超过20 => 低效
1. 避免硬解析 — 使用预备语句(JDBC里使用PreparedStatement) 2. 避免软解析 — 重用预备语句(JDBC里用完PreparedStatement后并不关闭,下次查数据库时还用这个对象) 3. 客户端语句缓存 — 重用游标(JDBC3.0 与 连接池共用时,JDBC会透明地替你缓存) 有时候你可能无权修改调用SQL的代码(比如这个代码处于二进制JAR包中),这时就只能在Oracle数据库服务器端作文章了 1. 打开“游标共享” — 数据库引擎会自动将字面量替换成绑定变量,避免硬解析。缺点是这个东西有BUG 2. 打开“服务器端语句缓存”
维基百科的“Cloud Computing” 词条里引了这样一句评论: CEO Larry Ellison of Oracle Corporation asserts that cloud computing is "everything that we already do" 我同意这句话。从“物理”上看,云提供的服务早就存在了,它几乎就是网站空间服务:虚拟机,存储,租而非买。 不过,云计算虽不算新服务,但它是一种新视角,这种新视角迫使服务提供商从这个角度出发,提供了让用户更省力的服务。比如说, 1. 云计算强调“封装性”(类似于 接口 V.S. 实现)。用户不需了解自己倒底租用了几台机器,内存是多大,CPU有多高。而且当用户的网站访问量增大时,用户也无须自己去考虑要增加多少硬件,云服务商会自动帮你搞定这些事情。 2. 它强调“服务可以被方便、快捷地获取”。用户和服务商不须任何商务洽谈,不须等待N个工作日,就可以通过浏览器或Web Service立即获得所需服务。 正如The National Institute of Standards and Technology对云计算的定义: "…which can be rapidly provisioned and released with minimal management effort or service provider interaction"