SQL Server 表內容的組合的操作模式
以下的文章主要描述的是SQL Server 表內容的組合,即 union 提高查詢速度的實際操作步驟,以下就是SQL Server 表內容的組合,即 union 提高查詢速度的實際操作步驟的描述,希望在你今后的學習中會有所幫助。
- select ws.nodeid,wi.laststepid,wi.curstepid from Workflowinfo wi,
- Workflowstep ws where ws.workflowid=
- 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 and isreceived=1 and issubmited =1))
執行IO統計結果如下:
(22 行受影響)
SQL Server 表 '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 次。
SQL Server 表 '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 all
- select ws.nodeid,wi.laststepid,wi.curstepid from Workflowinfo wi, Workflowstep
- ws where ws.workflowid='402881db1b441e6f011c0cff320e4766' and
- (wi.curstepid = ws.id and isreceived=1 and issubmited =1)
查詢IO次數如下:
(22 行受影響)
表 'workflowinfo'。掃描計數 36,邏輯讀取 142 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
SQL Server 表 'workflowstep'。掃描計數 2,邏輯讀取 46 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
執行計劃如下:
這里發現:成本不在是嵌套循環上的開銷了,IO次數大大減少。
總結:
這里通過改寫”OR“語句成“Union”語句,性能大大提高,用了or語句,數據庫優化器無法優化,這里都是用的“嵌套循環算法”,但是使用方式不一樣,同樣得到不同的結果。
對于類似的語句,可以將其改寫成”Union“ 或”Union All“ 語句。
【編輯推薦】
- 對SQL Server 2000置疑的正確破解
- SQL Server 2008稀疏列與列集的經驗總結
- SQL Server 2008 FileStream支持“真功夫版”
- SQL Server 2005兩種快照隔離機制的不同之處
- SQL Server排序遇到NULL,不怕不帕!