從上海來到溫州,看了前幾天監控的sql語句和資料變化,發現有一條語句的io次數很大,達到了150萬次io,而兩個表的資料也就不到20萬,為何有如此多的io次數,下面是執行語句:
select
ws.nodeid,wi.laststepid,wi.curstepid
from
workflowinfo wi,
workflowstep ws
where
ws.workflowid='
402881db1b441e6f011c0cff320e4766
'and
(wi.laststepid
=ws.id
or(wi.curstepid
=ws.id
andisreceived=1
andissubmited =1
)) 執行io統計結果如下:(22
行受影響)表 '
workflowstep
'。掃瞄計數
1,邏輯讀取
23次,物理讀取
0次,預讀
0次,lob 邏輯讀取
0次,lob 物理讀取
0次,lob 預讀 0次。
表 'worktable
'。掃瞄計數
4,邏輯讀取
1490572
次,物理讀取
0次,預讀
0次,lob 邏輯讀取
0次,lob 物理讀取
0次,lob 預讀 0次。
表 'workflowinfo
'。掃瞄計數
4,邏輯讀取
12208
次,物理讀取
0次,預讀
0次,lob 邏輯讀取
0次,lob 物理讀取
0次,lob 預讀 0次。
表 'worktable
'。掃瞄計數
0,邏輯讀取
0次,物理讀取
0次,預讀
0次,lob 邏輯讀取
0次,lob 物理讀取
0次,lob 預讀 0次。
執行計畫如下:
這裡發現:主要是巢狀迴圈演算法佔的開銷最大。個人感覺是「or」引起的效能問題,後來根據業務邏輯改寫。如下:
語句修改如下:
select
ws.nodeid,wi.laststepid,wi.curstepid
from
workflowinfo wi, workflowstep ws
where
ws.workflowid='
402881db1b441e6f011c0cff320e4766
'and
(wi.laststepid
=ws.id)
union
allselect
ws.nodeid,wi.laststepid,wi.curstepid
from
workflowinfo wi, workflowstep ws
where
ws.workflowid='
402881db1b441e6f011c0cff320e4766
'and
(wi.curstepid
=ws.id
andisreceived=1
andissubmited =1
)查詢io次數如下:(22
行受影響)表 '
workflowinfo
'。掃瞄計數
36,邏輯讀取
142次,物理讀取
0次,預讀
0次,lob 邏輯讀取
0次,lob 物理讀取
0次,lob 預讀 0次。
表 'workflowstep
'。掃瞄計數
2,邏輯讀取
46次,物理讀取
0次,預讀
0次,lob 邏輯讀取
0次,lob 物理讀取
0次,lob 預讀 0次。
執行計畫如下:
這裡發現:成本不在是巢狀迴圈上的開銷了,io次數大大減少。
總結:這裡通過改寫」or「語句成「union」語句,效能大大提高,用了or語句,資料庫優化器無法優化,這裡都是用的「巢狀迴圈演算法」,但是使用方式不一樣,同樣得到不同的結果。
對於類似的語句,可以將其改寫成」union「 或」union all「 語句。
sql語句優化!
1.不要使用in操作符,這樣資料庫會進行全表掃瞄,推薦方案 在業務密集的sql當中盡量不採用in操作符 a 改為 a 4.is null 或is not null操作 判斷字段是否為空 5.及 操作符 大於或小於操作符 大於或小於操作符一般情況下是不用調整的,因為它有索引就會採用索引查詢,但有的情況...
SQL語句優化
explain sql 反饋sql語句執行資訊 1 優化 select min id as nid,uid pmzongfen updatetime picid gg from qd mouldu qd sell limit 1 select uid pmzongfen updatetime pic...
sql語句優化
1.oracle使用merge更新或插入 使用merge比傳統的先判斷再選擇插入或更新快很多 如果該行存在,執行乙個update操作,如果是乙個新行,執行insert操作 避免了分開更新 提高效能並易於使用 在資料倉儲應用中十分有用 使用語法 merge hint into schema table...