【问题标题】:DB2 performance issue while executing select query执行选择查询时出现 DB2 性能问题
【发布时间】:2019-07-03 20:24:05
【问题描述】:

我有这个问题:

SELECT INVOICE_NUMBER, INVOICE_SEQ_NUMBER, FILE_NUMBER, MAX(INVOICE_SEQ_NUMBER) OVER (PARTITION BY INVOICE_NUMBER) AS MAX_INV_SEQ_NUM
FROM (SELECT A.INVOICE_NUMBER, A.INVOICE_SEQ_NUMBER, B.FILE_NUMBER,
             DENSE_RANK() OVER (ORDER BY A.INVOICE_NUMBER) as seqnum
      FROM TABLE1 A JOIN
           TABLE2 B 
           ON A.INVOICE_NUMBER = B.INVOICE_NUMBER AND 
              A.INVOICE_SEQ_NUMBER = B.INVOICE_SEQ_NUMBER
     ) t
WHERE seqnum <= 500;

在表格中有 10000 条记录时运行良好,但我们今天添加了更多(+30k)并计划在表格中添加更多(+250-300k)。现在我收到此错误:

DB2 SQL Error: SQLCODE=-905, SQLSTATE=57014, SQLERRMC=ASUTIME;000000000007;000000009000;SYSTEM PARAMETER, DRIVER=3.65.77

查询是否不正确或未针对具有大量记录的表进行优化?我们应该如何处理?索引某些列或重组查询?

更新:显然,我记错了添加到表中的记录数,此时我们在 TABLE1 中有 200 万条记录,在 TABLE2 中有 400 万条记录,而不是我最初提到的 30k。

【问题讨论】:

  • 看起来该错误意味着您的资源限制已超出。我建议限制和分页结果。您是在本地托管还是在云中托管?可能是一种增加记忆的方法。是的,索引会有所帮助。
  • 时间是一种资源,查询超出了限制。您加入表 A 和 B,但您要寻找什么条件?有没有办法限制结果集(并加快查询)?
  • 我会重组查询并检查解释计划,尤其是 INVOICE_NUMBER、INVOICE_SEQ_NUMBER 对上的连接...估计的基数是否正确?
  • @IsaacVidrine 我使用了日期,但即便如此,它最多只能获得两天。如果我尝试更多,它会给我同样的错误。表格有过去 5 年的记录。我无法增加内存,这不是一个选择。索引已完成。
  • @Foxy 您的查询结果集太大,您需要限制和分页查询结果。所以一次取 100 行,处理它们,然后继续下 100 行。当查询可以返回大量数据集时,应始终使用分页。否则,您将在数据库级别或应用程序级别遇到内存问题。想象一下尝试将 100 万行读入应用程序的内存?即使它在数据库中没有失败,您的应用程序也可能会崩溃。因此,分页对于缩放来说是极其重要的。

标签: db2 query-performance db2-zos


【解决方案1】:

SQL0905N, ASUTIME resource limit exceeded for query against mainframe

您遇到了资源限制问题。

问题

本文档提供了故障排除信息 应用程序针对 DB2 UDB for z/OS 数据库运行查询,并且 遇到错误:SQL0905N 由于资源问题,执行不成功 超出限制。资源名称 = "ASUTIME"...

原因

超出的资源是在 DB2® 中找到的 ASUTIME 参数 用于 z/OS® 表 SYSIBM.DSNRLST01 的 Universal Database™ (DB2 UDB)。 ASUTIME 指定每个允许的最大处理器服务单位 动态 SQL 语句(例如,SELECT、UPDATE、INSERT 或 DELETE)。

问题详情完整的错误信息示例如下:

COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI 驱动程序][DB2] SQL0905N 由于超出资源限制,执行失败。资源 名称 = “ASUTIME”,限制 = “000000000184” CPU 秒数(“000005206074” 服务单元)源自“SYSIBM.DSNRLST01”。 SQLSTATE=57014

回答

重写复杂查询,以减少处理器服务单元 消耗或增加 ASUTIME 参数。 ASUTIME 参数 除动态 SQL 外,还适用于存储过程。

【讨论】:

    【解决方案2】:

    我在一个简单地返回记录计数的 DB2 查询中遇到了这个问题。我可以运行 select 语句,但不能运行相同连接的计数。这是一个只有几个连接的简单查询。我能够使用不同的 DB2 驱动程序运行相同的查询。

    【讨论】:

    • 这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    相关资源
    最近更新 更多