5)比较不匹配的数据类型
-->下面的查询中business_date列上存在索引,且为字符型,这种
-->低效:
SELECT * FROM acc_pos_int_tbl WHERE business_date = 20090201;
Execution Plan ---------------------------------------------------------- Plan hash value: 2335235465
------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 37516 | 2857K| 106K (1)| 00:21:17 | |* 1 | TABLE ACCESS FULL| ACC_POS_INT_TBL | 37516 | 2857K| 106K (1)| 00:21:17 | -------------------------------------------------------------------------------------
Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(TO_NUMBER("BUSINESS_DATE")=20090201) -->这里可以看到产生了类型转换 |
-->高效:
SELECT * FROM acc_pos_int_tbl WHERE business_date = '20090201' |
6)索引列上使用 NULL 值
IS NULL和IS NOT NULL会限制索引的使用,因为数据中没有值等于NULL值,即便是NULL值也不等于NULL值.且NULL值不存储在于索引之中,因此应尽可能避免在索引类上使用NULL值
SELECT acc_num , pl_cd , order_qty , trade_date FROM trade_client_tbl WHERE input_date IS NOT NULL;
Execution Plan ---------------------------------------------------------- Plan hash value: 901462645 -------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 44 | 15 (0)| 00:00:01 | |* 1 | TABLE ACCESS FULL| TRADE_CLIENT_TBL | 1 | 44 | 15 (0)| 00:00:01 | --------------------------------------------------------------------------------------
alter table trade_client_tbl modify (input_date not null); |
不推荐使用的查询方式
SELECT * FROM table_name WHERE col IS NOT NULL SELECT * FROM table_name WHERE col IS NULL |
推荐使用的方式
SELECT * FROM table_name WHERE col >= 0 --尽可能的使用 =, >=, <=, like 等运算符 |
三、总结
1、尽可能最小化基表数据以及中间结果集(通过过滤条件避免后续产生不必要的计算与聚合)
2、为where子句中的谓词信息提供最佳的访问路径(rowid访问,索引访问)
3、使用合理的SQL写法来避免过多的Oracle内部开销以提高性能
4、合理的使用提示以提高表之间的连接来提高连接效率(如避免迪卡尔集,将不合理的嵌套连接改为hash连接等)