【发布时间】:2019-04-17 16:55:42
【问题描述】:
对不起,我的描述很糟糕,但问题很容易解释。我有一个名为 BigTable 的大型表(超过 20 亿行),它按日期分区,如下所示:
ID 对象日期 --- -------- ---------- 1个 2018-10-01 1 B 2018-10-01 1 C 2018-10-01 1 天 2018-10-01 2 M 2018-10-01 2 否 2018-10-01 2 O 2018-10-01 3 X 2018-10-01 3 B 2018-10-01我需要一个 SQL 来返回 ID 的所有行,其中 Object = "B" 和 date = '2018-10-01' 因此结果将是:
ID 对象日期 --- -------- ---------- 1个 2018-10-01 1 B 2018-10-01 1 C 2018-10-01 1 天 2018-10-01 3 X 2018-10-01 3 B 2018-10-01SQL 很简单,只需将表连接到自身即可:
SELECT t2.id,t2.object, t2.date
FROM BigTable T1
join BigTable T2 on t2.id = t1.id
AND t2.transaction_date = '01-OCT-2018'
AND t2.object = 'B'
where t1.date = '01-OCT-2018'
不过,这会持续 HOURS。子查询并没有让它变得更好。 返回包含 object = 'B' 的 ID 的所有行的最有效方法是什么?
【问题讨论】:
-
使用
t2.transaction_date = DATE '2018-10-01'和t1.date = DATE '2018-10-01'避免隐式转换。在(date, id, transaction_date, object)上创建一个本地索引 -
@KaushikNayak 你应该把它放在一个答案中,因为隐式类型转换很可能是他真正的问题。
-
请检查我的答案,如果它对你有用,请接受/投票,这样它也可以帮助其他人寻求答案。请阅读:stackoverflow.com/help/someone-answers
-
很遗憾,索引已经存在,建议的更改并没有提高性能。
标签: sql oracle performance join