有一个表发现查询慢了,用执行计划分析,发现是全表扫描的原因,忘加索引了.
加上索引之后,用执行计划分析,仍然是全表扫描(TABLE ACCESS FULL),不是用索引扫.这是为什么了.
加上索引之后,用执行计划分析,仍然是全表扫描(TABLE ACCESS FULL),不是用索引扫.这是为什么了.
解决方案 »
- 求一条sql语句,能统计时间差!
- 存储过程中的 警告:过程被创建 有编译错误?????
- ------------------------------------------------刪除相同紀錄----------------------------------------------------
- 高分求高效的SQL语法,在线等待,高手请进!!!!!!!!!!!!
- 送分了```
- 为什么找不到pfile文件initSID.ora和spfile文件呢?
- oracle数据库恢复
- oracle中怎样使select查询的结果有中文标头header
- SOS:::toad能不能显示日文??????
- oracle 怎么修改密码规则, 比如密码长度最少8位
- 怎么在客户端通过P_SQL客户端备份服务器上的Oracle数据库?
- snapshots的index是否会在下次REFRESH的时候删除掉
還是查詢條件裏使用了 索引KEY?你寫的語句有問題吧
所以还是把你建立了什么索引,以及查询的SQL贴出来吧。
全表大概有40多万条数据.
1、除非必要,否则不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算:WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描。
2、避免在索引列上使用IS NULL 和IS NOT NULL:避免在索引中使用任何可以为空的列,ORACLE将无法使用该索引 .对于单列索引,如果列包含空值,索引中将不存在此记录. 对于复合索引,如果每个列都为空,索引中同样不存在此记录.如果至少有一个列不为空,则记录存在于索引中
3、尽量避免在索引列上使用NOT:NOT会产生和在索引列上使用函数相同的影响. 当ORACLE遇到“NOT”,他就会停止使用索引转而执行全表扫描。
5、总是使用索引的第一个列:如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. 这也是一条简单而重要的规则,当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引 。
6、避免改变索引列的类型:当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换。例如,当某个列opcode类型为char(4)时,条件 where opcode = 30将被oracle解释为 where to_number(opcode) = 30,这样隐式的类型转换也将导致不走索引而执行全表扫描。
7、除非必要,否则不要让通配符(%)在搜寻词首出现:例如,要求在职工表中查询名字中包含cliton的人。可以采用如下的查询SQL语句:select * from employee where last_name like '%cliton%'; 这里由于通配符(%)在搜寻词首出现,所以Oracle系统不使用last_name的索引。在很多情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。在下面的查询中索引得到了使用: select * from employee where last_name like 'c%'。
如果用< >的可以吗?