SQL优化--使用关联查询代替子查询
测试例子:
子查询:
select
a.
*
,
( select workflowname from workflowbase where id = workflowid) workflowname
from [ [zping.com ] ]] a
where a.operator = ' 402882ed1112669201112a8385892f33 '
( select workflowname from workflowbase where id = workflowid) workflowname
from [ [zping.com ] ]] a
where a.operator = ' 402882ed1112669201112a8385892f33 '
执行结果:
(
360
行受影响)
表 ' Worktable ' 。扫描计数 360 ,逻辑读取 142334 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ' workflowbase ' 。扫描计数 1 ,逻辑读取 1589 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ' [zping.com] ' 。扫描计数 1 ,逻辑读取 366 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ' Worktable ' 。扫描计数 360 ,逻辑读取 142334 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ' workflowbase ' 。扫描计数 1 ,逻辑读取 1589 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ' [zping.com] ' 。扫描计数 1 ,逻辑读取 366 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
关联查询:
select
a.
*
,b.workflowname
from [ [zping.com ] ]] a inner join workflowbase b on a.workflowid = b.id
where operator = ' 402882ed1112669201112a8385892f33 '
from [ [zping.com ] ]] a inner join workflowbase b on a.workflowid = b.id
where operator = ' 402882ed1112669201112a8385892f33 '
执行结果:
(
360
行受影响)
表 ' Worktable ' 。扫描计数 0 ,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ' workflowbase ' 。扫描计数 1 ,逻辑读取 1589 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ' [zping.com] ' 。扫描计数 1 ,逻辑读取 366 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ' Worktable ' 。扫描计数 0 ,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ' workflowbase ' 。扫描计数 1 ,逻辑读取 1589 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 ' [zping.com] ' 。扫描计数 1 ,逻辑读取 366 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
这里:子查询IO次数:142334 +1589+366=144289
关联查询IO次数:1589 +366 =1922
关联查询是子查询的75倍
总结:
使用子查询和关联查询,一般情况下如果能用关联查询就不用子查询,