SQL优化
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• Like ‘%aaa%’ eg: select * from ne_cell_g_tmp
where ne_sys_id like ‘%0020%‘;
尽量替换为: 尽量替换为: 替换为
select * from ne_cell_g_tmp where ne_sys_id like ‘0020%‘;
19
• in与exists 与
使用in: 使用 :
select columns from T1 where x in (select y from T2);
转换: 转换:
select columns from T1,(select distinct y from T2) T2 where T1.x=T2.y;
16
使用提示(hints) 使用提示
17
使用提示(hints) 使用提示 • /*+RULE*/ • /*+FULL(TABLE)*/ • /*+INDEX(TABLE INDEX_NAME)*/ • /*+ORDERED*/ • /*+CACHE(TABLE)*/ • /*+APPEND*/
eg:
使用exists: : 使用
select columns from T1 where exists (select NULL from T2 where T2.y=T1.x);
20
• in相当于对子表做 相当于对子表做distinct,exists可以 相当于对子表做 , 可以 •
使用到索引。 使用到索引。 in和exists使用场合: 使用场合: 和 使用场合
• 数据类型隐式转换
eg: select * from ne_cell_g_tmp wherene_sys_id=‘0020000900650002’ select * from ne_cell_g_tmp where ne_sys_id=0020000900650002
9
索引使用
• 避免 where 子句中的“=”左边进行函数、算术运算 子句中的“ 左边进行函数 左边进行函数、
21
that’s all, thanks!
22
索引
• 什么是索引 • 使用索引的目的 • 索引原理
5
索引
6
7
索引
• 索引并非总是最佳选择 • 索引的优劣 • 正确使用索引
8
索引使用 • Where 条件中的约束顺序
• eg: perf_cell_g 中 start_time,ne_sys_id上建了索引 上建了索引
select ne_sys_id,lac,ci from ne_cell_g where time_stamp=to_date('2008-09-10','yyyy-mm-dd') select ne_sys_id,lac,ci from perf_cell_g where ne_sys_id='0013000200100002' (ne_cell_g) )
或其他表达式运算
select * from ne_cell_g_tmp where substr(ne_sys_id,1,4)='0020‘; 替换为: 替换为: select * from ne_cell_g_tmp where ne_sys_id like '0020%‘; select * from T1 where idx_col/2=100; 替换为: 替换为: select * from T1 where idx_col=100*2;
18
注意事项
• 减少访问数据库的次数 • 程序中不要使用 select * from xxx ,用具体 • • • • •
的字段列表代替“*”,不要返回用不到的任 的字段列表代替“ ” 何字段 WHERE子句中的连接顺序 WHERE子句中的连接顺序. 子句中的连接顺序. 替代> 用>=替代 替代 尽量避免使用消耗资源的操作。如: 尽量避免使用消耗资源的操作。 DISTINCT,UNION,MINUS,INTERSECT,ORD ER BY 不要在程序中创建、 不要在程序中创建、删除表 用TRUNCATE替代 替代DELETE * 替代
SQL优化方案 优化方案
1
• SQL执行原理 执行原理 • 索引 • 索引使用 • 注意事项
2
SQL执行原理 执行原理
第1步: 创建游标(Create a Cursor) 第2步:分析语句(Parse the Statement) 第3步: 绑定变量(Bind Any Variables) 第4步: 执行语句(Run the Statement) 第5步: 取出查询的行(Fetch Rows of a Query) 第6步: 关闭游标(Close the Cursor)
select /*+ index(perf_cell_g idx_perf_cell_g)*/ * from perf_cell_g where start_time=to_date('2008-09-10','yyyy-mm-dd') select /*+ index(perf_cell_g idx_perf_cell_g_1)*/ * from perf_cell_g where start_time=to_date('2008-09-10','yyyy-mm-dd')
select * from T1 where x in (select y from T2);
当表T2<<T1时使用 时使用in 当表 时使用
当表T2>>T1时使用 时使用exists 当表 时使用
select * from T1 where exists (select NULL from T2 where T2.y=T1.x);
11
索引使用
• ||
eg:
select * from perf_cell_g where ne_sys_id||city_id=‘0016000800190002000401’
12
使用提示(hints) 使用提示
13
使用提示(hints) 使用提示
14
使用提示(hints) 使用提示
15
使用提示(hints) 使用提示
3
分析语句(Parse the Statement)
• • • • • • •
1.语法分析 语法分析 2.语义分析 语义分析 3.视图、表达式转换 视图、 视图 4.选择优化器 选择优化器 5.选择连接方式 选择连接方式 6.选择连接顺序 选择连接顺序 7.选择数据的搜索路径 选择数据的搜索路径
4
eg:Hale Waihona Puke Baidu
10
索引使用
• <> != eg: select * from ne_cell_g
where time_stamp<>to_date('2008-09-10','yyyy-mm-dd')
替换为: 替换为:
select * from ne_cell_g where time_stamp<=to_date('2008-09-9','yyyy-mm-dd') or time_stamp>=to_date('2008-09-11','yyyy-mm-dd')