sql语句 嵌套查询优化

时间:2022-06-22 21:40:19

今天主要是给客户优化sql语句查询,多个表连接查询以及嵌套查询,一万多条的数据就至少用了半分钟以上,代码比如:


select * 
from a 
left  join  b on a.id=b.id
........
left join ......
......
where a.userId in (select id from c)

我检查了一下,主要是在  in 处用的时间较长,  a表和c表的数据量比较大,几十万以上,我用了exists替换in 根本没用,不知道还有没有其他的解决方法,建索引可以吗?除了建立索引还有没有其他的方法

5 个解决方案

#1


索引没用过,所以不太懂,还有没有其他的办法可以解决

#2


有没有知道的,麻烦告诉我一下 sql语句 嵌套查询优化

#3


你们看一下这个代码:





select a.ID,b.ContractID,i.UserName as BaseBID,b.BillCode,b.Remark as AdvContent,a.BasePID,d.UserName as SizeAlias,e.UserName as Catalogue,
f.UserName as BaseZID,f.StartTime,f.EndTime,f.UserCode as BaseZNo,g.UserName as AdvFormID,a.PresentNumber,a.StartDate,a.EndDate,a.BuildDate,a.Price,
a.IsRPermit,b.AdverPrice,a.QTY,a.Total,a.DisTotal,a.PlayDay,a.SUMQTY,a.PlayCyc,h.UserName as Unit,(Convert(nvarchar(20),Convert(numeric(18, 4),a.DisCount))+'%') as DisCount,
a.ReMark,b.BillType,0 as SonNum 
from Bill_Buy a  
left join Bill_Index b on a.BillID=b.ID
inner join PriceInfo c on a.BasePID = c.BaseID
left join Fz_Color d on c.SizeAlias = d.BaseID
left join Fz_Size e on c.Catalogue = e.BaseID
left join BaseZ f on c.BaseZID = f.BaseID 
left join BaseB i on b.BaseBID = i.BaseID 
left join AdverForm g on c.AdvFormID = g.BaseID 
left join zidian h on c.Unit = h.BaseID 
left join OrderBill_Index  k on b.ContractID = k.BillCode
left join (select BaseID,Avail from zidian where EntryStyle='style8') m on k.ChargeQua=m.BaseID
where m.Avail=1 

AND a.BuildDate in (select DateCode from DateList where 1=1  AND Date <='2014-06-06') 

#4


1      select DateCode from DateList where 1=1  AND Date <='2014-06-06'
这里面能否去重? in ()后面的唯一个数大概是多少

2  如果确确实实in后面太多了,可以改成inner join 来过滤  消除In

3  如果inner join也不行   我以前使用minus消除In 但是比较麻烦点。效果从当初的14秒多到0.5秒

#5


给Bill_Buy的BuildDate和DateCode的Date加上索引试试

#1


索引没用过,所以不太懂,还有没有其他的办法可以解决

#2


有没有知道的,麻烦告诉我一下 sql语句 嵌套查询优化

#3


你们看一下这个代码:





select a.ID,b.ContractID,i.UserName as BaseBID,b.BillCode,b.Remark as AdvContent,a.BasePID,d.UserName as SizeAlias,e.UserName as Catalogue,
f.UserName as BaseZID,f.StartTime,f.EndTime,f.UserCode as BaseZNo,g.UserName as AdvFormID,a.PresentNumber,a.StartDate,a.EndDate,a.BuildDate,a.Price,
a.IsRPermit,b.AdverPrice,a.QTY,a.Total,a.DisTotal,a.PlayDay,a.SUMQTY,a.PlayCyc,h.UserName as Unit,(Convert(nvarchar(20),Convert(numeric(18, 4),a.DisCount))+'%') as DisCount,
a.ReMark,b.BillType,0 as SonNum 
from Bill_Buy a  
left join Bill_Index b on a.BillID=b.ID
inner join PriceInfo c on a.BasePID = c.BaseID
left join Fz_Color d on c.SizeAlias = d.BaseID
left join Fz_Size e on c.Catalogue = e.BaseID
left join BaseZ f on c.BaseZID = f.BaseID 
left join BaseB i on b.BaseBID = i.BaseID 
left join AdverForm g on c.AdvFormID = g.BaseID 
left join zidian h on c.Unit = h.BaseID 
left join OrderBill_Index  k on b.ContractID = k.BillCode
left join (select BaseID,Avail from zidian where EntryStyle='style8') m on k.ChargeQua=m.BaseID
where m.Avail=1 

AND a.BuildDate in (select DateCode from DateList where 1=1  AND Date <='2014-06-06') 

#4


1      select DateCode from DateList where 1=1  AND Date <='2014-06-06'
这里面能否去重? in ()后面的唯一个数大概是多少

2  如果确确实实in后面太多了,可以改成inner join 来过滤  消除In

3  如果inner join也不行   我以前使用minus消除In 但是比较麻烦点。效果从当初的14秒多到0.5秒

#5


给Bill_Buy的BuildDate和DateCode的Date加上索引试试