热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Axapta数据库上查询的性能问题-PerformanceissuewithqueryonAxaptadatabase

IwroteaqueryonourAxaptadatabaseandrewroteitahundredtimes,buttheissueremains.Itper

I wrote a query on our Axapta database and rewrote it a hundred times, but the issue remains. It performs very bad. After 15 minutes there is still no results while almost bringing the server down.

我在Axapta数据库上写了一个查询并重写了一百次,但问题仍然存在。它表现非常糟糕。 15分钟后,几乎没有结果,几乎使服务器关闭。

Any idea on how to improve this statement is most welcome.

关于如何改进这种说法的任何想法都是最受欢迎的。

SELECT
  J.INVOICEID,
  T.AMOUNTCUR,
  T.RECID,
  T.ACCOUNTNUM,
  CASE WHEN O.DATAAREAID IS NULL THEN 0 ELSE 1 END hasOpenTrans,
  CASE WHEN P.DATAAREAID IS NULL THEN 0 ELSE 1 END hasPayment
FROM
  CUSTINVOICEJOUR J
  LEFT JOIN CUSTTRANS T ON
    T.DATAAREAID = J.DATAAREAID AND
    T.INVOICE = J.INVOICEID AND
    T.ACCOUNTNUM = J.INVOICEACCOUNT AND
    T.TRANSDATE = J.INVOICEDATE
  LEFT JOIN (
    SELECT
      DATAAREAID,
      REFRECID,
      ACCOUNTNUM
    FROM
      CUSTTRANSOPEN
    GROUP BY
      DATAAREAID,
      REFRECID,
      ACCOUNTNUM
    HAVING
      COUNT(*) > 0) O ON
        O.DATAAREAID = T.DATAAREAID AND
        O.REFRECID = T.RECID AND
        O.ACCOUNTNUM = T.ACCOUNTNUM
  LEFT JOIN (
    SELECT
      S.DATAAREAID,
      S.TRANSCOMPANY,
      S.TRANSRECID,
      S.ACCOUNTNUM
    FROM CUSTSETTLEMENT S 
      INNER JOIN CUSTTRANS C ON 
        C.DATAAREAID = S.DATAAREAID AND 
        C.RECID = S.OFFSETRECID AND 
        C.TRANSTYPE IN (0, 8, 15) AND 
        S.CANBEREVERSED = 1
    GROUP BY
      S.DATAAREAID,
      S.TRANSRECID,
      S.TRANSCOMPANY,
      S.ACCOUNTNUM
    HAVING
      SUM(S.SETTLEAMOUNTCUR) > 0) P ON
        P.DATAAREAID = T.DATAAREAID AND
        P.TRANSRECID = T.RECID AND
        P.ACCOUNTNUM = T.ACCOUNTNUM AND
        P.TRANSCOMPANY = T.DATAAREAID
WHERE
  J.DATAAREAID = '011' AND
  J.INVOICEDATE >= '2014-06-01'

Since it might matter: here are the existing indexes on the table involved:

因为它可能很重要:这里涉及的表上的现有索引:

CUSTINVOICEJOUR
Index Name               Columns                                                        Clustered   Primary Key   Unique
I_062INVOICEACCOUNTIDX   DATAAREAID, INVOICEACCOUNT, INVOICEDATE                        False       False         False
I_062INVOICENUMIDX       DATAAREAID, INVOICEID, INVOICEDATE, NUMBERSEQUENCEGROUP, RECID True        False         True
I_062ORDERACCOUNTIDX     DATAAREAID, ORDERACCOUNT, INVOICEDATE                          False       False         False
I_062PARMIDX             DATAAREAID, PARMID                                             False       False         False
I_062RECID               DATAAREAID, RECID                                              False       True          True
I_062SALESIDDATEIDX      DATAAREAID, SALESID, REFNUM, INVOICEDATE                       False       False         False
I_062VATNUMIDX           DATAAREAID, VATNUM                                             False       False         False

CUSTTRANS
Index Name               Columns                                    Clustered   Primary Key   Unique
I_078ACCOUNTDATEIDX      DATAAREAID, ACCOUNTNUM, TRANSDATE          True        False         False
I_078BILLOFEXCHANGEIDX   DATAAREAID, BILLOFEXCHANGEID               False       False         False
I_078INVACCOUNTDATEIDX   DATAAREAID, INVOICE, ACCOUNTNUM, TRANSDATE False       False         False
I_078INVOICEACCOUNTIDX   DATAAREAID, INVOICE, ACCOUNTNUM            False       False         False
I_078PAYMIDDATEIDX       DATAAREAID, PAYMID, TRANSDATE              False       False         False
I_078RECID               DATAAREAID, RECID                          False       True          True
I_078VOUCHERDATEIDX      DATAAREAID, VOUCHER, TRANSDATE             False       False         False

CUSTTRANSOPEN
Index Name            Columns                           Clustered   Primary Key   Unique
I_865ACCOUNTDATEIDX   DATAAREAID, ACCOUNTNUM, TRANSDATE True        False         False
I_865RECID            DATAAREAID, RECID                 False       True          True
I_865REFRECIDX        DATAAREAID, REFRECID              False       False         False

CUSTSETTLEMENT
Index Name                       Columns                                                               Clustered   Primary Key   Unique
I_075OFFSETCOMPANYRECTRANSREC7   DATAAREAID, OFFSETCOMPANY, OFFSETRECID, TRANSRECID, SETTLEMENTGROUP   False       False         False
I_075OFFSETVOUCHERIDX            DATAAREAID, OFFSETTRANSVOUCHER                                        False       False         False
I_075RECID                       DATAAREAID, RECID                                                     False       True          True
I_075SETTLEMENTGROUPIDX          DATAAREAID, SETTLEMENTGROUP                                           False       False         False
I_075TRANSINDEX                  DATAAREAID, TRANSRECID, TRANSDATE                                     True        False         False

Also the size of the tables might matter, or at least gives an idea of the number of records I'm dealing with:

表格的大小也可能很重要,或者至少可以了解我正在处理的记录数量:

CUSTINVOICEJOUR
DATAAREAID       Nbr
011          1513668
012                2
ash           355735
bar           268795
euk           692242
hlm           866154
lil           136163
prv             3180

CUSTTRANS
DATAAREAID       Nbr
011          2383870
012                4
ash           428161
bar           367620
bol               45
euk           630029
hlm          1377005
lil           167405
prv             4148

CUSTTRANSOPEN
DATAAREAID    Nbr
011          6119
012             4
ash          5845
bar          1876
bol            29
euk          8077
hlm          2426
lil          2173
prv           190

CUSTSETTLEMENT
DATAAREAID       Nbr
011          2469546
ash           462982
bar           415329
bol               18
euk           684421
hlm          1419857
lil           178551
prv             4325

2 个解决方案

#1


0  

Without knowing more about the execution plan, or the selectivity of the data of the individual columns, and taking into account the query and indexes you posted, it might be worthwhile trying to create covering indexes on the tables.

如果不了解执行计划或单个列数据的选择性,并考虑到您发布的查询和索引,则可能值得尝试在表上创建覆盖索引。

A quick glance at the query leads me to the following index for the tables involved (basically using every column involved in a WHERE clause, or JOIN:

快速浏览一下查询会引出我所涉及的表的以下索引(基本上使用WHERE子句中涉及的每个列,或者JOIN:

CUSTINVOICEJOUR - DATAAREAID, INVOICEID, NVOICEACCOUNT, INVOICEDATE, RECID, ACCOUNTNUM
CUSTTRANS - DATAAREAID, INVOICE, ACCOUNTNUM, TRANSDATE, RECID
CUSTTRANSOPEN - DATAAREAID, REFRECID, ACCOUNTNUM
CUSTSETTLEMENT - DATAAREAID, RECID, TRANSTYPE, CANBEREVERSED, TRANSRECID, ACCOUNTNUM, TRANSCOMPANY

Keep in mind the above order of the columns is based on the order in which I spotted them in the query. To figure out the ideal order, determine the selectivity per column, and order them in the order based on that, from high selectivity to low.

请记住,列的上述顺序基于我在查询中发现它们的顺序。为了找出理想的顺序,确定每列的选择性,并根据它从高选择性到低的顺序对它们进行排序。

Try and record the selectivity path before adding a new index, then add the index and check the execution path again to see whether or not the new index is being used (they should be. If they aren't it might indicate a column is missing). When then moving onto the next index, also keep an eye on the indexes you might have just added, just to see if the index you just added might impact the execution path from a moment ago (It shouldn't happen if you caught all the columns used, but this type of behavior could never be ruled out 100%).

在添加新索引之前尝试并记录选择性路径,然后添加索引并再次检查执行路径以查看是否正在使用新索引(它们应该是。如果不是,则可能表示缺少列)。然后转到下一个索引,同时关注你刚刚添加的索引,看看你刚刚添加的索引是否会影响刚刚执行的路径(如果你抓到所有索引,就不会发生这种情况)使用的列,但这种行为永远不能排除100%)。

Another good thing to keep an eye on is the statistics returned by the server. When adding new indexes, the goal should be to lower the amount of physical reads (disk-based search), and convert them to logical reads (from memory, which is cheaper).

另一个值得关注的好处是服务器返回的统计信息。添加新索引时,目标应该是降低物理读取量(基于磁盘的搜索),并将它们转换为逻辑读取(从内存中更便宜)。

Your mileage might vary, but the above get you off on a good start.

您的里程可能会有所不同,但上述情况会让您有个好的开始。

#2


0  

Maybe somthing is misconfigured or some other process is locking a table? I executed your query on a local db and it executed in about 1 second.

也许somthing配置错误或其他一些进程锁定表?我在本地数据库上执行了您的查询,并在大约1秒内执行。

Have a look at your running processes on the SQL server and search for locks. And you could make use of the query analyser which is part of the SSMS.

查看SQL服务器上的运行进程并搜索锁。您可以使用查询分析器,它是SSMS的一部分。

Execution plan from this place: enter image description here

来自这个地方的执行计划:


推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • MongoDB用户验证auth的权限设置及角色说明
    本文介绍了MongoDB用户验证auth的权限设置,包括readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase、cluster相关的权限以及root权限等角色的说明和使用方法。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
author-avatar
lanterwhile_557
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有