增加表连接来优化SQL
2012-08-06 17:04
148 查看
Select Ci.Customer_Id, Ci.Customer_Name, Mc.Card_Id, t.Card_Type_Name, f_Getcustomercontactmeans(Ci.Customer_Id) As Cust_Contactmeans From v_Customer_Info Ci Inner Join t_Mc_Card_Used Mc On Mc.Card_Used_Id = (Select Card.Card_Used_Id From v_Customer_Card_Used Card Where Card.Customer_Id = Ci.Customer_Id And Rownum = 1) Inner Join t_Mc_Card_Type t On t.Card_Type_Id = Mc.Card_Type_Id Where 1 = 1 And Mc.Card_Id = '04001155750' /* And (Ci.Customer_Name = '测试' Or Ci.Cust_Name_Jpinyin = '测试') And Exists (Select a.Customer_Id From t_c_Customer_Contactmeans a Where a.Cust_Contactmeans = '13676898987' And a.Customer_Id = Ci.Customer_Id) */ 不注释后面那句话SQL是一秒就能出,但是注释掉后面那句话,只留 And Mc.Card_Id = '04001155750' 这个条件5分钟都跑不出来,这个mc.card_id列上是有非常好的索引的,但是执行计划非常糟糕,这里涉及 的视图太多,执行计划太长,就不仔细研究, 观察发现问题在于用到ci这个视图的就非常快,那么这里可以把where后面的card_id换一下 添加一个表连接,用上ci Select Ci.Customer_Id, Ci.Customer_Name, Mc.Card_Id, t.Card_Type_Name, f_Getcustomercontactmeans(Ci.Customer_Id) As Cust_Contactmeans, ci.customer_id From v_Customer_Info Ci Inner Join t_Mc_Card_Used Mc On Mc.Card_Used_Id = (Select Card.Card_Used_Id From v_Customer_Card_Used Card Where Card.Customer_Id = Ci.Customer_Id And Rownum = 1) Inner Join t_Mc_Card_Type t On t.Card_Type_Id = Mc.Card_Type_Id Inner Join t_mc_card_used t4 On ci.customer_id=t4.customer_id Where 1 = 1 And t4.Card_Id = '04001155750' 这样就非常快了,从5分钟变成一秒钟了。 总结:有的时候可以并不一定非要从执行计划入手,观察SQL,他涉及的视图以及业务需求,根据SQL表面现象就可以优化。
相关文章推荐
- Oracle 表三种连接方式使用介绍(sql优化)
- SQL语句多表连接查询优化
- sql连接的优化问题
- 实体完整性约束 参照完整性约束 左外连接 右外连接 关系表达式的优化 SQL
- Oracle 表三种连接方式使用介绍(sql优化)
- ORACLE数据库SQL优化--->Oracle表连接类型
- sql 连接接查询优化
- MySQL5.7性能优化系列(二)——SQL语句优化(2)——使用 Semi-Join半连接变换优化子查询,派生表和视图
- ORACLE SQL优化5.WHERE子句中的连接顺序
- SQL优化--使用内连接(inner join)代替外连接(left join,right join) (转)
- mysql5.7官网直译SQL语句优化--左右连接的优化
- SQL优化--使用内连接(inner join)代替外连接(left join,right join) (转)
- SQL优化--逻辑优化--外连接、嵌套连接与连接消除
- 大表小表做包含连接的SQL优化
- mysql5.7官网直译SQL语句优化--嵌套循环连接算法
- sql优化、索引的建立和运用以及多表连接建索引的拙劣见解
- SQL中的连接查询及其优化原则
- 反连接NOT EXISTS子查询中有or 谓词连接条件SQL优化一例
- Sql语句优化-查询两表不同行NOT IN、NOT EXISTS、连接查询Left Join
- SQL优化经典案例----外连接where条件位置优化