【发布时间】:2021-10-22 22:20:54
【问题描述】:
我有一个要在 Oracle 中执行的查询,由于数据量大,这需要更多时间。 CUSTOMER_ADDRESS 表有接近 450K 的记录,而 CONTROL_REC 有接近 1.7M 的记录。 这可能是因为 GROUP BY 和子查询。 即使在使用并行线程之后,它也不起作用。
有人可以帮忙简化查询以更快地运行吗?
SELECT /*+ parallel(A,8) */
A.SETID, A.CUST_ID, A.ADDRESS_SEQ_NUM,
A.ALT_NAME1, A.ALT_NAME2,
A.LANGUAGE_CD, A.COUNTRY, A.ADDRESS1,
A.ADDRESS2, A.ADDRESS3, A.ADDRESS4,
A.CITY, A.NUM1, A.NUM2, A.ADDR_FIELD1,
A.ADDR_FIELD2, A.ADDR_FIELD3,
A.COUNTY, A.STATE, A.POSTAL,
A.IN_CITY_LIMIT, A.COUNTRY_CODE,
A.PHONE, A.EXTENSION, A.FAX,
B.SETCNTRLVALUE, MAX(A.EFFDT) AS EFFDT
FROM CUSTOMER_ADDRESS A,
CONTROL_REC B
WHERE B.RECNAME = 'CUST_ADDRESS'
AND A.EFFDT = (
SELECT MAX(A_ED.EFFDT)
FROM CUSTOMER_ADDRESS A_ED
WHERE A.SETID = A_ED.SETID
AND A.CUST_ID = A_ED.CUST_ID
AND A.ADDRESS_SEQ_NUM = A_ED.ADDRESS_SEQ_NUM
AND A_ED.EFFDT <= SYSDATE)
AND A.SETID = B.SETID
GROUP BY A.SETID, A.CUST_ID,
A.ADDRESS_SEQ_NUM, A.ALT_NAME1,
A.ALT_NAME2, A.LANGUAGE_CD,
A.COUNTRY, A.ADDRESS1, A.ADDRESS2,
A.ADDRESS3, A.ADDRESS4, A.CITY,
A.NUM1, A.NUM2, A.ADDR_FIELD1,
A.ADDR_FIELD2, A.ADDR_FIELD3,
A.COUNTY, A.STATE, A.POSTAL,
A.IN_CITY_LIMIT, A.COUNTRY_CODE,
A.PHONE, A.EXTENSION, A.FAX, B.SETCNTRLVALUE;
【问题讨论】:
-
请描述查询应该做什么。样本数据和期望的结果也会有所帮助。
-
运行解释计划并发布结果。您可能还想格式化查询,使其可读。