SQL Server 表内容的组合的操作模式


  本文标签:SQL Server 表内容

  以下的文章主要描述的是SQL Server 表内容的组合,即 union 提高查询速度的实际操作步骤,以下就是SQL Server 表内容的组合,即 union 提高查询速度的实际操作步骤的描述,希望在你今后的学习中会有所帮助  。

  1. select ws.nodeid,wi.laststepid,wi.curstepid from Workflowinfo wi,   
  2. Workflowstep ws where ws.workflowid=  
  3. select ws.nodeid,wi.laststepid,wi.curstepid from Workflowinfo wi,   
  4. Workflowstep ws where ws.workflowid=  
  5. 402881db1b441e6f011c0cff320e4766 and (wi.laststepid =  
  6. 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”引起的性能问题,后来根据业务逻辑改写  。如下:

  语句修改如下:

  

  1. select ws.nodeid,wi.laststepid,wi.curstepid from Workflowinfo wi, Workflowstep ws  
  2. where ws.workflowid=402881db1b441e6f011c0cff320e4766 and (wi.laststepid = ws.id)   
  3. union all   
  4. select ws.nodeid,wi.laststepid,wi.curstepid from Workflowinfo wi, Workflowstep  
  5. ws where ws.workflowid=402881db1b441e6f011c0cff320e4766 and   
  6. (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“ 语句  。