【发布时间】:2015-01-12 18:50:36
【问题描述】:
我有一个看起来像这样的查询:
SELECT COUNT(DISTINCT A) as a_distinct,
COUNT(DISTINCT B) as b_distinct,
COUNT(DISTINCT A)/COUNT(DISTINCT B) as a_b_ratio
FROM
sometable_ab
我们可以看到这看起来非常低效,因为聚合函数运行两次,即使它们已经被计算过。我只能想到一种解决方案,将其分解为两个查询。这是唯一可能的解决方案。或者他们是可以完成的更好更有效的解决方案。我正在使用 Redshift DB,它主要使用 postgresql,但即使是 MYSQL 的解决方案也是可以接受的,因为我无法在任何数据库中有效地做到这一点。
【问题讨论】:
-
"...聚合函数运行两次..."你怎么知道的?
-
@MikeSherrill'CatRecall' 我如何知道它是如何执行的?解释计划让我感到困惑。
-
使用
EXPLAIN (ANALYZE, TIMING OFF)在一个大表上运行所有查询变体几次,然后比较最佳执行时间以找出答案。您甚至不需要查询计划,只需要执行时间。 -
好像 Redshift 只支持基本的
EXPLAIN。没有ANALYZE。您需要另一种方法来测试执行时间。 -
它给出了一个查询所涉及的全面成本,尽管它确实给出了一个平均的想法,我已经分析过无论我在问题中使用该方法还是在子查询中使用该方法,我总是得到相同的结果成本。
标签: mysql sql database postgresql amazon-redshift