【发布时间】: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