什么是有效的替代限制?

问题描述 投票:0回答:2

我的问题主要是:我怎么知道我的数据库做一个序列扫描和第一场比赛时,停止我的WHERE条件?

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

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

这里的问题是,根据操作顺序引擎会扫描所有的表格,并生成我的过滤器匹配的数据集,然后进行排序该数据集(拥有巨大的成本),然后只返回第一行。

我可以通过特定的日期当然过滤器,但让我们假设我不知道作为筛选依据的时期 - 如何优化这种类型的查询在亚马逊红移(where子句中的东西,也许)?

sql amazon-web-services amazon-redshift sqlperformance
2个回答
1
投票

红移的一般策略是做了很多的扫描,但并行化。这包括获得一个单行无论如何是不会理想。这就是说,你可以做四两件事:

1.减少扫描,一个点

如果国家将永远领域过滤,先表的排序关键字设置为打开全国复合排序关键字。

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.裁缝行取向和柱状之间的选择的列

问一个柱状数据库像红移选择*退订,每列费用。尝试仅仅选择您需要的列。

4.添加更多的节点,所以每个节点确实少扫描

(确保数据没有被设置为分布样式的所有)


0
投票

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

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

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

如果您经常查询一个行的结果,那么它可能是值得保存在单独的表这样的信息更快地查找。该值可以每天计算,或者每隔一小时,是必要的。

© www.soinside.com 2019 - 2024. All rights reserved.