一个相当简单的sql查询,连接6个表,其中一个简单的where子句在2秒内完成,如下所示(为了清楚起见,省略细节):
Select (tab1.col1 & ',' & tab1.col2) as COMPUTED_COLUMN
From <join clause for 6 tables>
Where tab1.col3=4 AND tab2.col1=1 AND tab3.col1=21 AND tab1.col2<>-1
太好了!在数据库中tab2有120k条记录并返回280条记录,在2秒内完成。
现在,我只想为计算的列计算不同的值。我知道答案是140。
所以我认为
Select DISTINCT (tab1.col1 & ',' & tab1.col2) as COMPUTED_COLUMN
...
会很好的。需要9分钟以上!
所以我去掉了distinct,而是添加了
GROUP BY (tab1.col1 & ',' & tab1.col2)
在where子句之后。它也需要9分钟以上!
所以,很明显,这不是实现我想做的事情的正确方法。
我做错什么了?或者,计算tab1.col1和tab1.col2组合的唯一值的正确方法是什么?
3条答案
按热度按时间lzfw57am1#
我认为您最好执行初始选择,然后将结果插入临时表。从那里,处理你的
DISTINCT
指挥应该非常迅速。完成后不要忘记删除/清理临时表。h5qlskok2#
我可以建议首先使用您当前的查询及其
WHERE
子句,然后子查询以生成计算列:如果这样做有用的话,这里的想法是我们可以首先在子查询中丢弃许多记录,然后只需要在外部查询中聚合很少的记录。
tktrz96b3#
在子查询中进行数据选择,其中包括
GROUP BY tab1.col1, tab2.col2
---这将只返回这两个字段的不同组合,并且对于这两个字段以及JOIN
以及WHERE
子句字段。然后进行连接以导出
COMPUTED_COLUMN
在外部查询中。