Oracle: 索引与 … where a like xx
摘自《Troubleshooting Oracle Performance》 … where a like ‘A%’ 可以用上索引,即Index Range Scan 但 … where a like ‘%A’则会导致全表扫描或全索引扫描 也就是说,如果以通配符开头,就会导致效率低的模糊搜索
摘自《Troubleshooting Oracle Performance》 … where a like ‘A%’ 可以用上索引,即Index Range Scan 但 … where a like ‘%A’则会导致全表扫描或全索引扫描 也就是说,如果以通配符开头,就会导致效率低的模糊搜索
摘自《Troubleshooting Oracle Performance》 1.如果索引建在 a 列上,则 … where upper(a) = XX 用不上索引 … where a = upper(xx) 仍可以用得上索引 2.如果索引建在 upper(a) 这个函数上,或者实现了upper(a)的虚拟列上, 则 … where upper(a) = XX 可以用得上索引
摘自《Troubleshooting Oracle Performance》 对于B-树索引 如果在a,b,c三列分别建一个索引,则 … where a = xx and b = xx and c = xx 仍然非常低效 如果在a,b,c三列上建立联合索引,则 … where a = xx and b = xx and c = xx 会高效的多 而… where a = xx and b = xx 也会比较高效,即使c列没有出现在where子句 对于位图索引 如果在a,b,c三列分别建一个索引,则 … where …
Oracle: 索引 与… where a = xx and b = xx and c = xx Read More »
摘自《Troubleshooting Oracle Performance》 通过rowid获取数据行是效率最高的方式 典型的场景是: 1. select rowid from t where xx =xx 2. update t set yy=yy where rowid = xxx
leading leading(a) 即指示在Nested Loop时使用a表作为Outer Loop use_nl use_nl(a) 指示连接a表时,要使用Nested Loop并指定a作为Inner Loop ordered select /*+ ordered */ … from t1, t2, t3 where t1.c = t2.c and t2.c = t3.c 指示:先找出t1的记录,然后根据它找出t2的记录,最后再根据t2的结果找出t3的记录
因为一个位图索引项可能索引数千行,一个位图锁引项修改,会导致数千行数据被锁
摘自《Troubleshooting Oracle Performance》 Nested Loops 一个Outer Loop,一个Inner Loop,外部的循环驱动内部的循环 Merge Join 两边的数据集会先按连接的字段排序,然后再连接 Hash Join 左边的数据集会用来构建一个哈希表,等哈希表建好之后,再逐条查看右边的数据集,看它们是否可以命中这张哈希表 比较 Nested Loops可以在产生第一条记录时即开始返回数据,Hash Join有时可以,Merge Join完全不行 如果目标是尽快返回所有记录 1.若查询的选择性较高,则Hash Join最佳 2.否则,则应使用Nested Loops
摘自《Troubleshooting Oracle Performance》 Index Unique Scan: 针对唯一性索引,只返回一个rowId Index Range Scan: 用于非唯一性索引,可以返回多个rowId
摘自《Troubleshooting Oracle Performance》 1. 对于B-树索引 a. 先按索引找到对应的row-id b. 再按row-id获取数据行 2. 对于位图索引 a.先在索引中找到符合条件的索引项 b.然后把该项转换成ROW-ID c.最后按row-id获取数据行
摘自《Troubleshooting Oracle Performance》 可以看一下:执行计划中各步骤返回的结果集中,每行所需的逻辑读的数量。 逻辑读数较高,则这一步可能就是低效的 要得到单行的逻辑读数,那你的执行计划结果中需要有这么两列: 1. A-Rows 实际返回的行数 2. Buffers 返回这么多行所需的逻辑读的数量 单行逻辑读数 = A-Rows/Buffers 这个数字<=5 => 不错的访问路径 介于10和15之间 => 可以接受 超过20 => 低效