Sql oracle查询获取速度非常慢
我正在尝试运行以下sql:。但它并没有获取结果,运行了5个多小时Sql oracle查询获取速度非常慢,sql,oracle,performance,query-optimization,Sql,Oracle,Performance,Query Optimization,我正在尝试运行以下sql:。但它并没有获取结果,运行了5个多小时 SELECT TD.TIME_KEY, CUST.SITE_ID, CUST.NODE, COUNT(CUST.ACCOUNT_NUMBER) AS CUSTOMER_CNT FROM TIME_DIM TD INNER JOIN OSP_ACTIVE_SUB_STAGE CUST ON TIME_KEY BETWEEN CUST.CONNECT_DATE AND (CASE WHEN CUST.CUSTOMER_
SELECT TD.TIME_KEY, CUST.SITE_ID, CUST.NODE,
COUNT(CUST.ACCOUNT_NUMBER) AS CUSTOMER_CNT
FROM
TIME_DIM TD INNER JOIN
OSP_ACTIVE_SUB_STAGE CUST ON TIME_KEY BETWEEN CUST.CONNECT_DATE AND (CASE WHEN CUST.CUSTOMER_STATUS_CODE = 'A' THEN SYSDATE ELSE CUST.STATUS_DATE END)
WHERE TD.TIME_KEY >= '01-JAN-14'
GROUP BY TD.TIME_KEY, CUST.SITE_ID, CUST.NODE
表OSP_活动_子_阶段的结构:
Name Null Type
--------------------- ---- -----------
SITE_ID NUMBER(3)
NODE VARCHAR2(5)
HOUSE_NUMBER NUMBER(10)
HOUSE_RESIDENT_NUMBER NUMBER(10)
ACCOUNT_NUMBER NUMBER(10)
CONNECT_DATE DATE
STATUS_DATE DATE
CUSTOMER_STATUS_CODE VARCHAR2(1)
时间维度是正常的时间维度表
如何改进和增加此查询的运行时间或重写此查询
谢谢这是您的问题:
SELECT TD.TIME_KEY, CUST.SITE_ID, CUST.NODE, COUNT(CUST.ACCOUNT_NUMBER) AS CUSTOMER_CNT
FROM TIME_DIM TD INNER JOIN
OSP_ACTIVE_SUB_STAGE CUST
ON TIME_KEY BETWEEN CUST.CONNECT_DATE AND
(CASE WHEN CUST.CUSTOMER_STATUS_CODE = 'A' THEN SYSDATE ELSE CUST.STATUS_DATE END)
WHERE TD.TIME_KEY >= '01-JAN-14';
GROUP BY TD.TIME_KEY, CUST.SITE_ID, CUST.NODE
哎呀!那里有很多计算。你需要一种不同的方法。创建一个包含连接和结束的表,然后使用累积和,而不是在期间的每一天进行连接
假设所有站点/节点组合每天都有连接或结束,您可以执行以下操作:
select site_id, node, dte, sum(inc) as ActivesOnDate
from ((select oass.site_id, oass.node, oass.connect_date as dte, 1 as inc
from osp_active_sub_stage oass
) union all
(select oass.site_id, oass.node,
(case when oass.customer_status_code = 'A'
then trunc(sysdate)
else oass.status_date + 1
end) , -1 as inc
from osp_active_sub_stage oass
)
)
group by site_id, node, dte;
此查询的运行速度应比原始版本快一点。此查询未与time\u dim表联接以获取大于1-JAN-14的行。@User146831。的确如此。如果您在每个日期至少有一个连接/结束,那么这是不必要的。