Oracle——sql优化总结
序言
写在最前,此博客会不断更新,整理总结开发工作(实战过程)中的sql优化问题;因笔者在大数据部门工作,所以数据量基本都是非常多的,也就更加关注大数据下的性能(但是对于有些操作可能在数据少的情况下,具有更高的效能)。同时,部门是用的mybatis,所以这里也会分享一些实用的但可能不常用的语句。也欢迎大家讨论补充。。
1.insert dates(插入多条数据)
insert into(union all拼接)
insert into 表达式
insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
select 8000,0,'Multi 8000',1 from dual
union all select 8001,0,'Multi 8001',1 from dual
`
insert into mybatis应用
INSERT INTO table(
colum1,colum2,...
)
(
<foreach collection="list" item="keyData" index="" separator="union all">
select
#{keyData.colum1},#{keyData.colum2},...
from dual
</foreach>
)
merge into
对于插入多条数据的时候,如果要同时判断,对已有的数据进行更新操作,没有的数据进行新增操作,可食用merge into;
merge into 表达式
MERGE INTO [目标表] A USING [源表] B ON([conditional expression] and [...]...)
WHEN MATCHED THEN
[UPDATE sql]
WHEN NOT MATCHED THEN
[INSERT sql]
merge into mybatis应用
merge into table1 a
using (
<foreach collection="list" item="keyData" index="" separator="union all">
select
#{keyData.seqId} AS SEQ_ID,#{keyData.dataDate} AS DATA_DATE,'1' AS STATUS
from dual
</foreach>
) b
on(a.SEQ_ID=b.SEQ_ID)
when matched then update set a.STATUS='0'
when not matched then insert
(a.SEQ_ID,a.DATA_DATE,STATUS)
values
(b.SEQ_ID,b.DATA_DATE,b.STATUS)
2.case when
case when 表达式是一个通用条件的表达式,可以在表达式有效的任何位置使用。
原语句在现
SELECT * FROM(
SELECT t.*,
(case --1
when t.flag='01' then 'BankCode1'
when t.flag='02' then 'BankCode2'
else
(--2
select BANK_CODE from table1 b
where t.BANK_NO = b.BANK_NO)
end ) col1,
(case
when t.flag='01' then 'BankType1'
when t.flag='02' then 'BankType2'
when t.flag='04' and t.BANK_NO IN
(SELECT BANK_NO from table1
WHERE BANK_NAME in ('item')
) then 'BankType3'
else 'BankType4'
end ) col2,
row_number()over(partition by CON_NUM order by SIGN_DATE desc) cn
FROM table2 t --3
WHERE t.CREATE_TIME = '201912'
AND t.CODE IN ( 'item' )
) t
WHERE cn = 1
decode函数
在数据量非常大的时候,decode函数要比case when速率提升百分之四十多。但是decode只能对字段的值进行判断,无法判断表达式。如下:
decode(条件,值1,返回值1,值2,返回值2,…….,缺省值)
使用decode函数来实现案例:
decode(flag, 10, '01', 20, '02', 30, '04', 'other') from table2
查出来的结果和用case when作用是一样的,但decode看起来简洁得多了
DECODE 与CASE WHEN 的比较
- DECODE 只有Oracle 才有,其它数据库不支持;
- CASE WHEN的用法, Oracle、SQL Server、 MySQL 都支持;
- DECODE 只能用做相等判断,但是可以配合sign函数进行大于,小于,等于的判断,CASE when可用于=,>=,<,<=,<>,is null,is not null 等的判断;
- DECODE 使用其来比较简洁,CASE 虽然复杂但更为灵活;
- 另外,在decode中,null和null是相等的,但在case when中,只能用is null来判断。