【问题标题】:OVER() vs Two Queries - Which is Most EfficientOVER() 与两个查询 - 哪个最有效
【发布时间】:2015-06-09 04:54:16
【问题描述】:

我需要从 10MM 行表中拉回前 300 行,并计算匹配记录的总数。

我可以在两个查询中做到这一点,例如:

SELECT * FROM table WHERE field = value LIMIT 300;
SELECT count(*) FROM table WHERE field = value;

或者我可以使用 OVER():

SELECT *, COUNT(*) OVER() AS total FROM table WHERE field = value LIMIT 300;

哪种方法最有效?我不在乎需要运行两个查询,我追求最有效的解决方案。我不是专家,我试图进行“解释”,但这对我来说没有多大意义。这是在 Amazon Redshift 上运行的。

【问题讨论】:

  • Related - 似乎有一些快速方法可以从 pg_class 获取 PostGres 中的近似行数,而无需计算所有行数。
  • 在性能方面,首先设定目标,然后编写简单明了的代码来表达你想要的。然后衡量性能,只有当它没有达到目标时,你才应该开始深入研究它。
  • 第一行是什么意思?你不需要定义顺序吗?为什么只想要 300 个?
  • 同时运行它们时发生了什么?执行计划(使用explain analyze 而不仅仅是explain)说明了什么? 编辑您的问题并为单个语句添加explain analyze 的输出(确保已格式化)

标签: sql query-optimization amazon-redshift window-functions


【解决方案1】:

如果您的 SortKey 是时间戳字段,则运行效率最高的将是

select *
from(
select * , count(*) over() as total,
row_number () over(order by timestamp) as rank
from table
where filed =value)
where rank<301

【讨论】:

    猜你喜欢
    • 2011-05-23
    • 2012-02-25
    • 1970-01-01
    • 2013-03-30
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多