前面谈到任何对列的操作都可能导致全表扫描,例如:
select * from emp where substr(ename,1,2)=’SM’;
但是这种查询又经常使用,我们可以创建一个带有substr函数的基于函数的索引,
create index emp_ename_substr on eemp ( substr(ename,1,2) );
这样在执行上面的查询语句时,这个基于函数的索...
分类:
数据库 时间:
2015-01-07 09:21:30
阅读次数:
163
例:
select * from record where to_char(ActionTime,'mm')='12';
这个查询的执行计划将是全表查询,如果我们改变nls_date_format,
alert session set nls_date_formate=’MM’;
现在重新修改上面的查询:
select * from record where ActionTime='...
分类:
数据库 时间:
2015-01-07 09:20:39
阅读次数:
247
继续“oracle 性能优化操作八”的例子
由于实际查询中,还有涉及到DisposalCourseFlag=6的查询,而此时如果用上该字段上的索引,将是非常不明智的,效率也极低。
因此这种情况下,我们需要用特殊的方法屏蔽该索引,以便ORACLE选择其他字段上的索引。
比如,如果字段为数值型的就在表达式的字段名后,添加“+ 0”,为字符型的就并上空串:||""
如:
select * f...
分类:
数据库 时间:
2015-01-06 10:01:05
阅读次数:
178
索引的选择性低,但数据的值分布差异很大时,仍然可以利用索引提高效率。
A、数据分布不均匀的特殊情况下,选择性不高的索引也要创建。
表ServiceInfo中数据量很大,假设有一百万行,其中有一个字段DisposalCourseFlag,取值范围为枚举值:[0,1,2,3,4,5,6,7]。
按照前面说的索引建立的规则,“选择性不高的字段不应该建立索引”,
该字段只有8种取值,索引值的重复率...
分类:
数据库 时间:
2015-01-06 09:59:52
阅读次数:
207
oracle 性能优化操作五:尽量去掉 "
尽量去掉 "
例:
UPDATE SERVICEINFO SET STATE=0 WHERE STATE
以上语句由于其中包含了"
实际应用中,由于业务逻辑的限制,字段state为枚举值,只能等于0,1或2,而且,值等于=1,2的很少。
因此可以去掉"
修改为:
UPDATE SERVICEINFO SET STATE=0 WHERE ...
分类:
数据库 时间:
2015-01-06 09:59:24
阅读次数:
146
在ORACLE优化器无法用上合理索引的情况下,利用HINT强制指定索引。
继续“oracle 性能优化操作七”的例子,ORACLE缺省认定,表中列的值是在所有数据行中均匀分布的,
也就是说,在一百万数据量下,每种DisposalCourseFlag值各有12.5万数据行与之对应。
假设SQL搜索条件DisposalCourseFlag=2,利用DisposalCourseFlag列上的索引进...
分类:
数据库 时间:
2015-01-06 09:58:20
阅读次数:
160
含有"IN"、"OR"的Where子句常会使用工作表,使索引失效;
如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。
例:
select count(*) from stuff where id_no in('0','1');--(23秒)
可以考虑将or子句分开:
select count(*) from stuff where id_no...
分类:
数据库 时间:
2015-01-05 11:20:52
阅读次数:
288
增加查询的范围限制,避免全范围的搜索。
例:以下查询表record 中时间ActionTime小于2001年3月1日的数据:
select * from record where ActionTime
查询计划表明,上面的查询对表进行全表扫描,如果我们知道表中的最早的数据为2001年1月1日,那么,可以增加一个最小时间,
使查询在一个完整的范围之内。修改如下:
select * fr...
分类:
数据库 时间:
2015-01-05 11:20:13
阅读次数:
215
任何对列的操作都可能导致全表扫描,这里所谓的操作包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等式的右边,
甚至去掉函数。
例1:下列SQL条件语句中的列都建有恰当的索引,但30万行数据情况下执行速度却非常慢:
select * from record where substrb(CardNo,1,4)='5378'(13秒)
select * from...
分类:
数据库 时间:
2015-01-05 09:29:12
阅读次数:
207
需要注意的是,尽量避免潜在的数据类型转换。
如将字符型数据与数值型数据比较,ORACLE会自动将字符型用to_number()函数进行转换,从而导致全表扫描。
例2:表tab1中的列col1是字符型(char),则以下语句存在类型转换:
select col1,col2 from tab1 where col1>10;
应该写为:
select col1,col2 from tab1 ...
分类:
数据库 时间:
2015-01-05 09:27:29
阅读次数:
183