【发布时间】:2013-09-23 15:48:20
【问题描述】:
我不明白我做错了什么。我正在尝试获取满足条件 A 或条件 B 的每个 ID 的每周 COUNT 次。
select CREATE_WEEK, count ( A.PK )
from TABLE1 A
where ( A.PK not in (select distinct ( B.FK )
from TABLE2 B
where B.CREATE_TIMESTAMP > '01-Jan-2013')
or A.PK in (select A.PK
from ( select A.PK, A.CREATE_TIMESTAMP as A_CRT, min ( B.CREATE_TIMESTAMP ) as FIRST_B
from TABLE1 A, TABLE2 B
where A.PK = B.FK
and A.CREATE_TIMESTAMP > '01-Jan-2013'
and B.CREATE_TIMESTAMP > '01-Jan-2013'
group by A.PK, A.CREATE_TIMESTAMP)
where A_CRT < FIRST_B) )
and A.CREATE_TIMESTAMP > '01-Jan-2013'
and CREATE_WEEK >= 2
and THIS_WEEK - CREATE_WEEK >= 1
group by CREATE_WEEK
order by CREATE_WEEK asc
**注意:table1 中的 PK = table2 中的 FK,所以在第一个子查询中,我正在检查 table1 中的 PK 是否作为 FK 存在于 table2 中。周来自 TO_CHAR (TO_DATE (TRUNC (A.CREATE_TIMESTAMP, 'IW')), 'IW')
当我取出 OR 并对任一子查询运行查询时,结果会在 1-2 秒内返回。但是当我尝试运行组合查询时,20 分钟后没有返回结果。
我知道我可以单独运行它们,然后将它们汇总到电子表格中,但我宁愿只得到一个数字。
【问题讨论】:
-
哪个数据库和数据库版本?
-
"我知道我可以单独运行它们,然后将它们汇总到电子表格中,":如果子查询 A 中不存在任何 ID,但在子查询 B 中,则它们将被计算两次那。仅仅因为你知道情况不会如此,并不意味着数据库知道。数据库必须进行检查才能为您提供正确的结果,不幸的是,它似乎并没有以最有效的方式这样做。
-
这是一个与性能相关的问题。您需要确定导致性能不佳的原因 - 即检查查询计划以查看哪些更改。例如,没有 OR 的查询可能正在执行某种哈希反连接(即运行一次子查询,然后对
table进行扫描),而具有 OR 的查询可能正在执行嵌套循环连接table中每一行的两个子查询(A和B)。 -
没有完整代码很难回答性能问题。
-
@JoelCoehoorn - 我在此期间使用联合,但这需要在电子表格中求和。我宁愿避免这种情况,直接得到总和。
标签: sql oracle count database-performance