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

Tsql 使用聚合和函数和分组优化sybase查询,tsql,sybase,sybase-asa,Tsql,Sybase,Sybase Asa,我正在尝试改进sybase sql anywhere 5.5中的sql查询(我知道它很旧,但这是我的任务,升级sybase版本目前不是一个选项) 选择 总和(pd.tax)为totaltax1,总和(pd.tax2)为totaltax2,总和(pd.tax3)为totaltax3, 总额(pd.价格)为总TTC, 应纳税总额(pd.tax0和pd.TAXX其他0结束时的情况), 应纳税总额(pd.tax20和pd.TAXX else 0结束时的情况), 应纳税总额(如pd.tax30,则pd.T

我正在尝试改进sybase sql anywhere 5.5中的sql查询(我知道它很旧,但这是我的任务,升级sybase版本目前不是一个选项)

选择
总和(pd.tax)为totaltax1,总和(pd.tax2)为totaltax2,总和(pd.tax3)为totaltax3,
总额(pd.价格)为总TTC,
应纳税总额(pd.tax0和pd.TAXX其他0结束时的情况),
应纳税总额(pd.tax20和pd.TAXX else 0结束时的情况),
应纳税总额(如pd.tax30,则pd.TAXX否则为0),
总和(如果pd.tax+pd.tax2+pd.tax3=0,则pd.TAXX否则为0结束)不可征税,
isnull(ra.stax1able,'')作为stax1able,isnull(ra.stax1,'')作为stax1,
isnull(ra.stax2able“”)作为stax2able,isnull(ra.stax2“”)作为stax2,
isnull(ra.stax3able“”)作为stax3able,isnull(ra.stax3“”)作为stax3,
isnull(ra.snontaxable“”)作为snontaxable,
isnull(ra.depcenterid,0)作为costcenterid,isnull(ra.depcode,0)作为depcode,isnull(ra.debitcoa,'')作为debitcoa
from(“dba”).salesheader作为ph连接
“dba”.salesdetail在ph.transact=pd.transact和ph.branchid=pd.branchid)左外连接上作为pd
“dba”。ph.memcode=m.id左外连接上的成员为m
“dba”。会计设置为ra上的ra。“类型”=4,ra.branchid=1
其中,ph.branchid=1,ph.opendate=20150808,ph.amount=ph.paid和(ph.memcode=0或m.forceexport=0)
按ra.stax1able、ra.stax1、ra.stax2able、ra.stax2、ra.stax3able、ra.stax3、ra.snontaxable、ra.costcenterid、ra.depcode、ra.DebtCoA分组
表数据:

  • salesheader只有:327285条记录
  • salesdetail只有:1017513条记录
  • 各位议员只有:11785项纪录
  • 会计核算设置只有:13条记录
上面的查询需要7到8秒,这是巨大的!有关于改进查询的提示吗

注意:所有连接列都有索引(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)

我尝试过的事情:

  • 按列(ra.stax1able、ra.stax1、ra.stax2able、ra.stax2、ra.stax3able、ra.stax3、ra.stax3、ra.snontaxable、ra.costcenterid、ra.depcode、ra.debitcoa)添加分组索引
  • 向汇总字段(pd.tax、pd.tax2、pd.tax3、pd.taxx)添加索引
  • 使用不带where部分的sql创建视图,然后运行该视图
  • 创建以opendate和branchid为参数的StoredProcess
  • 这些更改均未影响性能(仍需7-8秒)


    我该怎么办?

    您的会计设置表未与其他表联接。首先,检查一下

    要最大限度地利用索引,请确保索引已准备就绪:

  • 对于限制I/O最多的列(很可能是ph.opendate、, 可能是布兰奇博士(取决于布兰奇博士的数量)
  • 确保连接列(ph.transact,ph.branchid)与 大连接

  • 因此,尝试salesheader的复合索引(opendate、branchid、memcode)和salesdetail的复合索引(transact、branchid)

    好的,我已经成功地通过在salesheader和salesdetail表之间添加外键,将sql从7-8秒提高到188ms。。然而,我一直在网上对此进行研究,我读到外键不能提高查询性能

    外键不会直接加速查询的执行。它们确实有间接影响,因为它们保证引用的列被索引。该指数将对绩效产生影响。在描述问题时,所有连接关系都应该包括其中一个表上的主键。()

    此外,在创建外键之后,我删除了它并重新测试了查询,这确实花了7-8秒


    关于外键为什么会加快查询速度的任何提示?

    sybase central 5.5版中没有查询计划请检查此处文档中的图形计划功能信息:@MichaelGarder此文档适用于sybase 9。。sybase 5中没有图形化的\u计划。会计\u设置按应有方式连接(按分支设置)。答案中指定的所有列都已编入索引(即使是复合联接)还有其他提示吗?如果运行“为表salesdetail描述索引”和“为表salesheader描述索引”,输出结果是什么?至于记帐设置,最好使用ra.branchid=ph.branchid。这可能会为优化器提供有关查询的更多信息(但在这里不太可能有效)。我对5.5不太清楚,因为它有点旧了。是的,我熟悉sybase 12中的许多分析工具,但是我已经没有5.5的子弹了;无论如何,我会尝试得到一个sybase 12数据库的手,升级我目前的数据库,看看我是否可以得到任何分析,为什么这个sql是缓慢的!然后将尝试在12上增强它,并在5.5上应用它
    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