正确高效使用数据库不可不知的索引失效问题
2012-07-15 17:27
411 查看
where语句中索引独立出现,索引才会起作用,不要放在表达式中(如: 转换函数一般放在值那边,不要放在列那边),或发生不合适的隐式转换
1.表达式例子
表employees的last_name列上有个索引
下面的语句使用索引SQL> set autotrace trace exp
SQL> SELECT last_name, job_id, department_id
2 FROM employees
3 WHERE last_name = 'Whalen';
但是下面的语句不使用索引
SQL> set autotrace trace exp
SQL> SELECT last_name, job_id, department_id
2 FROM employees
3 WHERE lower(last_name) = 'whalen';
2.隐式转换
建立演示表test,在test的employee_id列建有索引
SQL> spool off
SQL> create table test as select * from employees;
表已创建。
SQL> create index i_test_id on test(employee_id);
索引已创建。
SQL> set autotrace trace exp
SQL> select * from test where employee_id='24000';
将列employees的类型由原来的整型修改为字符型,目的是然列employees发生隐式转换
SQL> truncate table test;
表被截断。
SQL> alter table test modify(employee_id varchar2(20));
表已更改。
SQL> insert into test select * from employees;
已创建107行。
SQL> commit;
提交完成。
SQL> set autotrace trace exp
SQL> select * from test where employee_id=100;
在上图中发生了一个隐式转换TO_NUMBER("EMPLOYEE_ID")
解决方法:转换函数一般放在值那边,不要放在列那边,因为在列那边会隐士转换,或其他原因,造成索引失效
SQL> select * from test where employee_id=to_char(100);
表employee列salary是NUMBER类型
SQL> select * from employee where salary like ‘13___’;
系统做了隐士准换 where to_char(salary) like ‘13__’,则索引失效
3.索引实际应用之编码设计
根据需求来作编码,例如按一般的逻辑地区编码为省、市、县
但是系统中实际上大量查询是 like ‘%某一个市%‘,这样索引就失效
所以合适的编码是市、省、县 这样 like ‘某一个市%‘,索引就不会失效了
1.表达式例子
表employees的last_name列上有个索引
下面的语句使用索引SQL> set autotrace trace exp
SQL> SELECT last_name, job_id, department_id
2 FROM employees
3 WHERE last_name = 'Whalen';
但是下面的语句不使用索引
SQL> set autotrace trace exp
SQL> SELECT last_name, job_id, department_id
2 FROM employees
3 WHERE lower(last_name) = 'whalen';
2.隐式转换
建立演示表test,在test的employee_id列建有索引
SQL> spool off
SQL> create table test as select * from employees;
表已创建。
SQL> create index i_test_id on test(employee_id);
索引已创建。
SQL> set autotrace trace exp
SQL> select * from test where employee_id='24000';
将列employees的类型由原来的整型修改为字符型,目的是然列employees发生隐式转换
SQL> truncate table test;
表被截断。
SQL> alter table test modify(employee_id varchar2(20));
表已更改。
SQL> insert into test select * from employees;
已创建107行。
SQL> commit;
提交完成。
SQL> set autotrace trace exp
SQL> select * from test where employee_id=100;
在上图中发生了一个隐式转换TO_NUMBER("EMPLOYEE_ID")
解决方法:转换函数一般放在值那边,不要放在列那边,因为在列那边会隐士转换,或其他原因,造成索引失效
SQL> select * from test where employee_id=to_char(100);
表employee列salary是NUMBER类型
SQL> select * from employee where salary like ‘13___’;
系统做了隐士准换 where to_char(salary) like ‘13__’,则索引失效
3.索引实际应用之编码设计
根据需求来作编码,例如按一般的逻辑地区编码为省、市、县
但是系统中实际上大量查询是 like ‘%某一个市%‘,这样索引就失效
所以合适的编码是市、省、县 这样 like ‘某一个市%‘,索引就不会失效了
相关文章推荐
- 数据库字符集不一样导致函数或存储过程中使用的索引失效
- 如何在数据库中使用索引 【数据库高效编程 - 学习笔记 第七章】
- 记录数据库中索引失效的问题
- 解决使用sap数据库驱动查询hana数据库时,like '%param%' 失效问题
- SQL中一些不经意隐式类型转换或者函数使用导致索引失效问题
- pt-online-schema-change使用中的不当,引起的数据库不可写入问题
- 使用“数据库引擎优化顾问”来构建正确的索引设计
- 索引是从数据库中获取数据的最高效方式之一。95%的数据库性能问题都可以采用索引技术得到解决。
- 关于数据库索引失效的问题
- 数据库的使用过程中由于程序方面的问题有时候会碰到重复数据,重复数据导致了数据库部分设置不能正确设置……
- 记录数据库中索引失效的问题
- [网络问题,截图以后再传]本实验是设计性实验。目的在于使用关系数据库标准语言SQL,掌握视图和索引的操作。
- CodeIgniter需要注意错写查询条件导致数据库索引失效的问题
- 数据库建立索引以及索引失效问题
- ios高效开发-正确的使用枚举(Enum)
- [原创]谈谈vb中使用数据库的一点小问题
- java 中JFinal getModel方法和数据库使用出现问题解决办法
- 正确的软件开发进程有助于处理不可预见的问题
- Flex使用Weborb与.NET交互的问题:使用DataSet出现"提供的索引超出范围"异常
- ElasticSearch使用jdbc-river同步数据库出现dateOptionalTime不能识别的问题解决办法一则