120K 条记录的 SQL 查询耗时 9 小时
Posted
技术标签:
【中文标题】120K 条记录的 SQL 查询耗时 9 小时【英文标题】:SQL Query Takes 9 Hours for 120K Records 【发布时间】:2019-05-12 08:21:43 【问题描述】:我有一个小查询,我需要在其中进行一些简单的计算;然而,它需要很长时间才能完成。我之前在更大的数据上使用过类似的查询,而且性能要好得多。我尝试对源表进行排序,但同样的情况发生在我的 ETL 每秒移动 2 行...下面是我的查询(任何关于调整它的建议都非常受欢迎)
SELECT
t1.APPID,
t1.APP_INS_ID,
t1.APP_INS_ID_DUE_DTAE,
TRUNC(LAST_DAY(ADD_MONTHS(t1.APP_INS_ID_DUE_DTAE, -1))) +1 AS EndDateOfPaymentMOnth,
t1.APP_INS_ID_PAYMENT_DATE,
t1.ispaid,
(SELECT COUNT(APP_INS_ID)
FROM tbl1 t2
WHERE t1.APPID = t2.APPID
AND t2.APP_INS_ID <= t1.APP_INS_ID
AND T2.Is_due = 1
AND ispaid = 'Y'
AND TRUNC(APP_INS_ID_PAYMENT_DATE) <= TRUNC(LAST_DAY(ADD_MONTHS(t1.APP_INS_ID_DUE_DTAE, -1))) + 1) AS TOTAL_PAID
FROM
tbl1 t1
WHERE
t1.is_due = 1
AND t1.APP_INS_ID_DUE_DTAE < TRUNC((SYSDATE - (EXTRACT(DAY FROM SYSDATE)) + 1))
基本上,我正在尝试计算在分期付款到期日之前支付了多少分期付款。
非常感谢您的帮助!
这是一个具有预期输出的简单数据:
APPID APP_INS_ID APP_INS_ID_DUE_DTAE EndDateOfPaymentMOnth
APP_INS_ID_PAYMENT_DATE ispaid TOTAL_PAID
1| 1| 1-Aug-14| 1-Aug-14| 2-Oct-14| Y| 0|
1| 2| 1-Sep-14| 1-Sep-14| 2-Oct-14| Y| 0|
1| 3| 1-Oct-14| 1-Oct-14| 2-Oct-14| Y| 0|
1| 4| 1-Nov-14| 1-Nov-14| 2-Oct-14| Y| 4|
1| 5| 1-Dec-14| 1-Dec-14| 24-Nov-14| Y| 5|
1| 6| 1-Jan-15| 1-Jan-15| 9-Dec-14| Y| 6|
【问题讨论】:
您应该避免对主查询的每一行使用子查询(count(APP_INS_ID) .. 尝试添加适当的(简化的)数据样本和预期的结果 请生成Explain Plan 并将其附加到问题中。只需运行EXPLAIN PLAN FOR your_query
,然后运行 SELECT * FROM table( dbms_xplan.display )
并复制最后一个查询的结果 - 作为文本,而不是位图 !!! 并将其附加到问题中
也许执行计划不是最好的。也许 tbl2 上的索引会有所帮助。谁知道,没有关于执行计划和所涉及的表的详细信息?
查询性能不佳的原因有很多。请阅读this answer to understand how to provide the information we need to provide assistance。
【参考方案1】:
感谢大家的帮助。我通过在该表上应用索引解决了问题。现在我的工作每秒移动 30k 条记录。
【讨论】:
以上是关于120K 条记录的 SQL 查询耗时 9 小时的主要内容,如果未能解决你的问题,请参考以下文章