今天主要是给客户优化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
有没有知道的,麻烦告诉我一下

#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秒
这里面能否去重? in ()后面的唯一个数大概是多少
2 如果确确实实in后面太多了,可以改成inner join 来过滤 消除In
3 如果inner join也不行 我以前使用minus消除In 但是比较麻烦点。效果从当初的14秒多到0.5秒
#5
给Bill_Buy的BuildDate和DateCode的Date加上索引试试
#1
索引没用过,所以不太懂,还有没有其他的办法可以解决
#2
有没有知道的,麻烦告诉我一下

#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秒
这里面能否去重? in ()后面的唯一个数大概是多少
2 如果确确实实in后面太多了,可以改成inner join 来过滤 消除In
3 如果inner join也不行 我以前使用minus消除In 但是比较麻烦点。效果从当初的14秒多到0.5秒
#5
给Bill_Buy的BuildDate和DateCode的Date加上索引试试