什么是 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 = country
,where 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.添加更多节点,因此每个节点扫描更少
(确保数据没有全部设置为分布样式)
我的问题基本上是:如何告诉我的数据库进行序列扫描并在第一次匹配我的 WHERE 条件后停止?
假设我想查找某种类型的第一个事件,我可以编写以下查询:
select *
from installs
where country = 'China'
order by install_date
limit 1
这里的问题是,根据操作顺序,引擎将扫描所有 table 并生成一个与我的过滤器匹配的数据集,然后对该数据集进行排序(具有巨大的成本),然后 return 仅第一行。
我当然可以按特定日期过滤,但假设我不知道要过滤的时间段 - 我如何在 Amazon Redshift 中优化此类查询(可能在 where 子句中)?
如果您删除 ORDER BY
,那么它可以有效地工作。
要求对结果进行排序意味着它需要检查国家为中国的所有行,这对于返回一个项目来说效率不高。
如果 SORTKEY = country
,where 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.添加更多节点,因此每个节点扫描更少
(确保数据没有全部设置为分布样式)