【问题标题】:Optimizing sybase query with aggregate sum function and grouping使用聚合求和函数和分组优化 sybase 查询
【发布时间】:2015-11-24 16:31:47
【问题描述】:

我正在尝试改进在 sybase sql Anywhere 5.5 中进行的 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 秒,这是巨大的!有关改进查询的任何提示?

附:所有连接列都有索引(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 作为参数的存储过程

这些更改均未影响性能(仍需要 7-8 秒)

我该怎么办?

【问题讨论】:

  • sybase Central 中没有 5.5 版的查询计划
  • 从此处的文档中查看 GRAPHICAL_PLAN 函数信息:infocenter.sybase.com/archive/topic/…
  • @MichaelGardner 此文档适用于 sybase 9 .. sybase 5 中没有 graphics_plan ..

标签: tsql sybase sybase-asa


【解决方案1】:

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

为了最大限度地利用索引,请确保您有以下索引:

  1. 对于限制 I/O 最多的列(很可能是 ph.opendate、 可能是 ph.branchid,具体取决于存在多少个 branchid)
  2. 确保连接列匹配(ph.transact、ph.branchid) 大连接

所以,为 salesheader 尝试一个复合索引 (opendate, branchid, memcode),为 salesdetail 尝试一个复合索引 (transact, branchid)

【讨论】:

  • accounting_settings 按应有的方式加入(按分支设置)。您的答案中指定的所有列都已编入索引(甚至是复合连接)还有其他提示吗?
  • 如果运行:“describe index for table salesdetail”和“describe index for table salesheader”,输出是什么?至于accounting_settings,最好使用ra.branchid=ph.branchid。这可能会为优化器提供有关查询的更多信息(虽然在这里不太可能产生影响)。
  • describe index 是 Interactive SQL 中的一个命令。不知道 5.5 有点老了。
  • 是的,我对 sybase 12 中的许多分析工具都很熟悉,但是我对 5.5 没有把握;无论如何,我会尝试使用 sybase 12 db,升级我当前的 db,看看我是否可以分析为什么这个 sql 很慢!然后将尝试在 12 上增强它并在 5.5 上应用它
【解决方案2】:

好的,我已经设法将 sql 从 7-8 秒提高到 188 毫秒,仅通过在 salesheader 和 salesdetail 表之间添加一个外键。但是,我一直在研究这方面的网络,我已经读过外键不会提高查询性能。

外键不会直接加速查询的执行。它们确实有间接影响,因为它们保证引用的列被索引。并且该指数会对性能产生影响。在您描述问题时,所有连接关系都应包括其中一张表的主键。 (Does using Foreign Key speed up table joins)

此外,在创建外键后,我已将其删除并重新测试查询,确实需要 7-8 秒。

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

【讨论】:

    猜你喜欢
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2010-12-18
    • 1970-01-01
    相关资源
    最近更新 更多