高效SQL语句必杀技

发表于:2013-6-05 10:04

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:RobinsonCheng    来源:51Testing软件测试网采编

分享:

  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连接等)

77/7<1234567
重磅发布,2022软件测试行业现状调查报告~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号