Oracle学习(十三)优化专题 【持续更新】
工作中遇到的性能問題及解決方案
一、查詢頻繁,數(shù)據(jù)量大
索引
使用時(shí)機(jī):表中經(jīng)常查詢的字段可以考慮添加索引。
聯(lián)合索引:若能確認(rèn)多個(gè)條件會(huì)同時(shí)使用時(shí),可以將這幾個(gè)條件作為聯(lián)合索引。
單列索引:若條件查詢時(shí),這幾個(gè)條件不是同時(shí)用到的話,還是單列做索引比較好些。
例子:
如:id,name,income三列需要做索引
查詢時(shí)同時(shí)使用:聯(lián)合索引要比單列索引要快。
查詢時(shí)只用到一部分:單列索引要比聯(lián)合索引快,但是實(shí)際上聯(lián)合索引還是要比沒有索引快。
PS:在使用索引字段作為條件時(shí),如果該索引是復(fù)合索引,那么必須使用到該索引中的第一個(gè)字段作為條件時(shí)才能保證系統(tǒng)使用該索引, 否則該索引將不會(huì)被使用。
且盡可能的讓字段順序與索引順序相一致。
PS:若某列中存在大量重復(fù)數(shù)據(jù)(如狀態(tài),支付類型等列),那么建立索引對(duì)效率沒啥影響。
PS:在定義primary key或unique約束后系統(tǒng)自動(dòng)在相應(yīng)的列上創(chuàng)建索引。
用select 具體列代替 select *
使用時(shí)機(jī):查詢時(shí)哪怕很多列也不要使用select*這種寫法,這樣會(huì)全表掃描。
應(yīng)該是用到哪列就在哪列上面加入索引,然后查詢時(shí),寫清楚要select的列,這樣可以調(diào)用到對(duì)應(yīng)列的索引,效率會(huì)高很多。
?
二、查詢條件注意事項(xiàng)
null值處理
使用時(shí)機(jī):當(dāng)某列可能存在空值時(shí),考慮使用默認(rèn)值。
PS:在 where 子句中對(duì)字段進(jìn)行 null 值判斷,將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描!
例子: select id from t where num is null? ??
可以在num上設(shè)置默認(rèn)值0,確保表中num列沒有null值,然后這樣查詢:
select id from t where num = 0? ?
OR、!=、<>、like 優(yōu)化
使用時(shí)機(jī):當(dāng)查詢中的過濾條件存在這幾種過濾方式時(shí),會(huì)導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,可以考慮以下優(yōu)化方案。
例子:OR優(yōu)化:
select id from t where num=10
union all?
select id from t where num=20?
LIKE優(yōu)化:
盡量不要在where條件中使用兩邊都是%的like模糊查詢,這樣會(huì)導(dǎo)致全表掃描,實(shí)在不行在字段后面進(jìn)行模糊匹配。如like 'li%'
?
IN 優(yōu)化
使用時(shí)機(jī):當(dāng)查詢中用到in的條件進(jìn)行過濾時(shí),可以考慮以下優(yōu)化方案。
例子:IN優(yōu)化:
對(duì)于連續(xù)的區(qū)間數(shù)據(jù):使用between
select * from t_order where id between 2 and 3
對(duì)于不連續(xù)連續(xù)的區(qū)間數(shù)據(jù):使用exists
select num from a where exists(select 1 from b where num=a.num)? ?
?
三、字段類型的選擇
字符型優(yōu)化
1、若某列只存在數(shù)值型的數(shù)據(jù),則該列的類型應(yīng)設(shè)置為數(shù)值類型,這會(huì)降低查詢和連接的性能,并會(huì)增加存儲(chǔ)開銷。
2、盡可能的使用? varchar(可變長度) 代替 char (固定長度),因?yàn)槭紫瓤勺冮L度字段存儲(chǔ)空間小,可以節(jié)省存儲(chǔ)空間。??
? 其次對(duì)于查詢來說,在一個(gè)相對(duì)較小的字段內(nèi)搜索效率顯然要高些。 ?
?
四、新增、修改優(yōu)化
勤用commit
多使用commit來釋放回滾點(diǎn),對(duì)性能會(huì)有所提升,出錯(cuò)回滾時(shí)數(shù)據(jù)量也會(huì)相對(duì)少很多。
? ??
五、刪除操作
刪除操作有3種,先簡單了解一下
drop table
1)屬于DDL
2)不可回滾
3)不可帶where
4)表的結(jié)構(gòu)和內(nèi)容都刪除
5)刪除速度快
使用時(shí)機(jī):不再需要一張表的時(shí)候,用drop
truncate table
1)屬于DDL
2)不可回滾
3)不可帶where
4)表內(nèi)容刪除
5)刪除速度快
使用時(shí)機(jī):保留表而刪除所有數(shù)據(jù)的時(shí)候用truncate
delete from
1)屬于DML
2)可回滾
3)可帶where
4)根據(jù)where對(duì)表內(nèi)容刪除
5)刪除速度慢,需要逐行刪除
使用時(shí)機(jī):想刪除部分?jǐn)?shù)據(jù)行時(shí)候,用delete,并且?guī)蟱here子句
?
六、SQL書寫
使用大寫
Oracle服務(wù)器總是先將小寫字母轉(zhuǎn)成大寫后,才執(zhí)行,所以使用大寫時(shí)能減少Oracle的一步操作。
轉(zhuǎn)載于:https://www.cnblogs.com/riches/p/11453202.html
總結(jié)
以上是生活随笔為你收集整理的Oracle学习(十三)优化专题 【持续更新】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。