读书人

SQL语句优化解决方案

发布时间: 2012-03-28 15:40:03 作者: rapoo

SQL语句优化
语句如下:
(1)
select * from tbizCity c,tbizrcd r,tbizsvr s,tbizbrand b,tbizgroup g,tbiztype t where r.branchCode=c.branchCode and r.brandId = b.brandId and r.bizCode = s.bizCode and r.brandid=s.brandid and s.grpId = g.grpId and s.typeId = t.typeId and status= 'OK ' and (date(r.optTime) between '2007-07-13 ' and '2007-09-13 ') and ditch=1 and r.branchCode in( ' ', 'GZ ', 'SZ ', 'ST '//这里有20个左右的城市代码) and r.bizCode in( '20202 ', '21030 ', '60208 '//这里可能有一两百个业务代码) and r.brandId in(3,2,1)

(2)
select * from tbizCity c,tbizrcd r,tbizsvr s,tbizbrand b,tbizgroup g,tbiztype t where r.branchCode=c.branchCode and r.brandId = b.brandId and r.bizCode = s.bizCode and r.brandid=s.brandid and s.grpId = g.grpId and s.typeId = t.typeId and status= 'OK ' and (date(r.optTime) between '2007-07-13 ' and '2007-09-13 ') and ditch=1 and (r.branchCode = ' ' or r.branchCode = 'GZ ' or r.branchCode = 'SZ ' or r.branchCode = 'ST '//有20个左右的城市代码) and (r.bizCode = '20202 ' or r.bizCode = '21030 ' or r.bizCode = '60208 '//这里可能有一两百个业务代码) and (r.brandId = 3 or r.brandId = 2 or r.brandId = 1)

请问是用(1)的in谓词好还是用(2)的or好一些?或者大家有更好的办法吗?我对SQL语句不怎么懂。要连接6张表,表里面的记录很庞大

[解决办法]
一样

用IN,简短点,在编译成查询执行计划时,会自动编译成OR的形式。

[解决办法]
还有多表查询时用table1 a join table2 b on 条件比较好
[解决办法]
(1)
select * from tbizCity c,tbizrcd r,tbizsvr s,tbizbrand b,tbizgroup g,tbiztype t where r.branchCode=c.branchCode and r.brandId = b.brandId and r.bizCode = s.bizCode and r.brandid=s.brandid and s.grpId = g.grpId and s.typeId = t.typeId and status= 'OK ' and (date(r.optTime) between '2007-07-13 ' and '2007-09-13 ') and ditch=1 and r.branchCode in( ' ', 'GZ ', 'SZ ', 'ST '//这里有20个左右的城市代码) and r.bizCode in( '20202 ', '21030 ', '60208 '//这里可能有一两百个业务代码) and r.brandId in(3,2,1)
-------------------------------------------------select * from tbizCity c,tbizrcd r,tbizsvr s,tbizbrand b,tbizgroup g,tbiztype t where r.branchCode=c.branchCode and r.brandId = b.brandId and r.bizCode = s.bizCode and r.brandid=s.brandid and s.grpId = g.grpId and s.typeId = t.typeId and status= 'OK ' and (date(r.optTime) > = '2007-07-13 ' and date(r.optTime) <= '2007-09-13 ') and ditch=1 and r.branchCode in( ' ', 'GZ ', 'SZ ', 'ST '//这里有20个左右的城市代码) and r.bizCode in( '20202 ', '21030 ', '60208 '//这里可能有一两百个业务代码) and r.brandId in(3,2,1)
in 和or 差不多


[解决办法]
请问是用(1)的in谓词好还是用(2)的or好一些?或者大家有更好的办法吗?我对SQL语句不怎么懂。要连接6张表,表里面的记录很庞大


----------------------------
都是一样的,他们的执行计划都是一样的,只不过用IN代码写得少些
多个表查询时
table1 a join table2 b on 条件 与 from table1 a,table2 b
应该也是一样的吧,查询时它们所生成的执行计划一样
只不过Inner Join/Join 是标准的写法而已

[解决办法]
select * from tbizCity c,tbizrcd r,tbizsvr s,tbizbrand b,tbizgroup g,tbiztype t where r.branchCode=c.branchCode and r.brandId = b.brandId and r.bizCode = s.bizCode and r.brandid=s.brandid and s.grpId = g.grpId and s.typeId = t.typeId and status= 'OK ' and (date(r.optTime) between '2007-07-13 ' and '2007-09-13 ') and ditch=1 and r.branchCode in( ' ', 'GZ ', 'SZ ', 'ST '//这里有20个左右的城市代码) and r.bizCode in( '20202 ', '21030 ', '60208 '//这里可能有一两百个业务代码) and r.brandId in(3,2,1)

把城市代码做个表. r.branchCode in (select 城市代码 from 城市代码表)
把业务代码做个表, r.bizCode in (select 业务代码 from 业务代码表)

[解决办法]
建议用临时表,用联接不用in

读书人网 >SQL Server

热点推荐