Sql 什么是限制的有效替代方案?

Sql 什么是限制的有效替代方案?,sql,amazon-web-services,amazon-redshift,sqlperformance,Sql,Amazon Web Services,Amazon Redshift,Sqlperformance,我的问题基本上是:如何告诉我的数据库在第一次匹配WHERE条件后进行seq扫描并停止 假设我想找到某一类型的第一个事件,我可以编写以下查询: select * from installs where country = 'China' order by install_date limit 1 这里的问题是,根据操作顺序,引擎将扫描所有表并生成一个与我的过滤器匹配的数据集,然后以巨大的代价对该数据集进行排序,然后只返回第一行 当然,我可以按特定日期进行过滤,但假设我不知道过滤的时间段-我如何

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

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

select *
from installs
where country = 'China' 
order by install_date
limit 1
这里的问题是,根据操作顺序,引擎将扫描所有表并生成一个与我的过滤器匹配的数据集,然后以巨大的代价对该数据集进行排序,然后只返回第一行

当然,我可以按特定日期进行过滤,但假设我不知道过滤的时间段-我如何在Amazon中优化这种类型的查询?where子句中的某些内容可能会发生红移?

如果您按删除订单,那么它可以有效地工作

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

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


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

Redshift的一般策略是进行大量扫描,但要将其并行化。任何涉及到获得一行的情况都不会是理想的。也就是说,你可以做四件事:

一,。将扫描减少到一定程度

如果country始终是筛选打开的字段,请先将表的sortkey设置为country上的复合sortkey

二,。无需排序

按x限制1排序的更有效方法通常是MAX

然后试试看

SELECT *
FROM installs
WHERE pk = (
  SELECT MAX(pk)  -- or install_date, if install date is unique
  FROM installs
  WHERE country = 'China'
)
三,。在面向行和列之间调整选定列

要求像Redshift这样的列数据库选择*会导致每列的成本。尝试仅选择所需的列

四,。添加更多节点,以便每个节点执行更少的扫描


确保数据未设置为distribution style all

如果您无法在安装日期创建索引或安排其他字段(如记录id)遵循相同的顺序,则您无能为力。数据库将必须检索和排序所有匹配的记录。您可以使用install_date作为表的sortkey。除非数据库查看所有记录,否则它如何知道哪个install_date最小?您可以使用排序键执行所需操作:。这是您尝试执行的实际查询的示例吗?如果是,则红移可能不是适合您的数据库。如果您的行数少于100000000行,那么您可能会发现标准Postgres数据库足以满足您的需要。但是,如果您根据结果删除订单,则不保证返回第一个事件,它可能是与where子句匹配的任何事件。是。但这会很有效非常感谢你的详细回答。我实际上没有在我的查询中选择*,我将在帖子中编辑它。关于max-aggregate函数,它不需要排序作为先决条件?不需要。如果我给你一个列表,比如[8,2,13,4,9,1,7],你是否需要对整个函数进行排序才能找到max?不,你只需要通过它一次,记住一个最高的值,忘记其余的