使用聚合求和函数和分组优化sybase查询

时间:2015-11-13 09:46:06

标签: tsql sybase sybase-asa

我试图在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

表数据:

  • salesheader仅有:327,285条记录
  • salesdetail只有:1,017,513条记录
  • 会员只有:11,785条记录
  • accounting_settings只有:13条记录

以上查询需要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)

我尝试的事情:

  1. 按列添加组的索引(ra.stax1able,ra.stax1,ra.stax2able,ra.stax2,ra.stax3able,ra.stax3,ra.snontaxable,ra.costcenterid,ra.depcode,ra.debitcoa )
  2. 将索引添加到汇总字段(pd.tax,pd.tax2,pd.tax3,pd.taxex)
  3. 使用不带where部分的sql创建视图,然后运行视图
  4. 创建以opendate和branchid作为参数的storedprocedure
  5. 这些变化都没有影响性能(仍然需要7-8秒)

    我该怎么办?

2 个答案:

答案 0 :(得分:0)

您的accounting_settings表未与其他表连接。首先,检查一下。

要最大限度地使用索引,请确保您具有以下索引:

  1. 对于限制I / O最多的列(最有可能是ph.opendate, 可能是ph.branchid取决于有多少个')
  2. 确保连接列匹配(ph.transact,ph.branchid) 大联盟
  3. 因此,为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秒。

任何提示,为什么在我的情况下,外键加速查询?