我试图在5.5的任何地方改进sybase sql中的sql查询(我知道它已经老了,但这是我的任务,升级sybase版本目前不是一个选项)
select
sum(pd.tax) as totaltax1,sum(pd.tax2) as totaltax2,sum(pd.tax3) as totaltax3,
sum(pd.price) as totalttc,
sum(case when pd.tax<>0 then pd.taxex else 0 end) as tax1able,
sum(case when pd.tax2<>0 then pd.taxex else 0 end) as tax2able,
sum(case when pd.tax3<>0 then pd.taxex else 0 end) as tax3able,
sum(case when pd.tax+pd.tax2+pd.tax3=0 then pd.taxex else 0 end) as nontaxable,
isnull(ra.stax1able,'') as stax1able,isnull(ra.stax1,'') as stax1,
isnull(ra.stax2able,'') as stax2able,isnull(ra.stax2,'') as stax2,
isnull(ra.stax3able,'') as stax3able,isnull(ra.stax3,'') as stax3,
isnull(ra.snontaxable,'') as snontaxable,
isnull(ra.costcenterid,0) as costcenterid,isnull(ra.depcode,0) as depcode,isnull(ra.debitcoa,'') as debitcoa
from("dba".salesheader as ph join
"dba".salesdetail as pd on ph.transact=pd.transact and ph.branchid=pd.branchid) left outer join
"dba".members as m on ph.memcode=m.id left outer join
"dba".accounting_settings as ra on ra."type"=4 and ra.branchid=1
where ph.branchid=1 and ph.opendate=20150808 and ph.amount=ph.paid and(ph.memcode=0 or m.forceexport=0)
group by ra.stax1able,ra.stax1,ra.stax2able,ra.stax2,ra.stax3able,ra.stax3,ra.snontaxable,ra.costcenterid,ra.depcode,ra.debitcoa
表数据:
以上查询需要7到8秒,这是巨大的!有关改进查询的任何提示吗?
P.S。所有连接列都有索引(ph.transact,pd.transact,ph.branchid,pd.branchid,ph.memcode,m.id,ra.type,ra.branchid) 此外,where子句中的所有过滤列都有索引(ph.opendate,ph.amount,ph.paid,m.forceexport)
我尝试的事情:
这些变化都没有影响性能(仍然需要7-8秒)
我该怎么办?
答案 0 :(得分:0)
您的accounting_settings表未与其他表连接。首先,检查一下。
要最大限度地使用索引,请确保您具有以下索引:
因此,为salesheader尝试复合索引(opendate,branchid,memcode),并为salesdetail尝试(transact,branchid)
答案 1 :(得分:0)
好的,我已经设法通过在salesheader和salesdetail表之间添加一个外键,将sql从7-8秒增强到188ms。但是,我一直在研究网络,我已经读过外键不会增强查询性能。
外键不会直接加快查询的执行速度。它们确实具有间接效果,因为它们保证引用的列被索引。该指数将对业绩产生影响。在描述问题时,所有连接关系都应包括其中一个表上的主键。 (Does using Foreign Key speed up table joins)
此外,在创建外键后,我删除了它并重新测试了查询,确实需要7-8秒。
任何提示,为什么在我的情况下,外键加速查询?