什么是 LIMIT 的有效替代品?

What's an Efficient Alternative to LIMIT?

我的问题基本上是:如何告诉我的数据库进行序列扫描并在第一次匹配我的 WHERE 条件后停止?

假设我想查找某种类型的第一个事件,我可以编写以下查询:

select *
from installs
where country = 'China' 
order by install_date
limit 1

这里的问题是,根据操作顺序,引擎将扫描所有 table 并生成一个与我的过滤器匹配的数据集,然后对该数据集进行排序(具有巨大的成本),然后 return 仅第一行。

我当然可以按特定日期过滤,但假设我不知道要过滤的时间段 - 我如何在 Amazon Redshift 中优化此类查询(可能在 where 子句中)?

如果您删除 ORDER BY,那么它可以有效地工作。

要求对结果进行排序意味着它需要检查国家为中国的所有行,这对于返回一个项目来说效率不高。

如果 SORTKEY = countrywhere country = 'China' 子句是有效的,因为它可以跳过任何不包含所需值的存储块。如果匹配的行相对较少,这将非常有效。

如果您经常查询单行结果,那么可能值得 将此类信息存储在单独的 table 中以加快查找速度。根据需要,可以每天或每小时计算该值。

Redshift 的总体策略是进行大量扫描,但将其并行化。任何涉及获取单行的情况都不会是理想的。也就是说,您可以做四件事:

1.减少扫描,到点

如果国家/地区始终是过滤的字段,请首先将 table 的排序键设置为国家/地区的复合排序键。

2。消除排序的需要

更有效的方法 ORDER BY x LIMIT 1 通常是 MAX。

然后尝试

SELECT *
FROM installs
WHERE pk = (
  SELECT MAX(pk)  -- or install_date, if install date is unique
  FROM installs
  WHERE country = 'China'
)

3。在面向行和列

之间定制 selected 列

要求像 Redshift 这样的列式数据库 select * 会产生每列的成本。尝试 select 仅输入您需要的列。

4.添加更多节点,因此每个节点扫描更少

(确保数据没有全部设置为分布样式)