SQL 語句優化 OR 語句優化案例

2022-03-31 22:18:12 字數 2278 閱讀 5428

從上海來到溫州,看了前幾天監控的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...