amazon-web-services - 我应该使用列作为 distkey 和 sortkey

标签 amazon-web-services amazon-redshift

我在 redshift 中有一个表,其中包含十亿条记录(日志文件条目)。它有一个时间戳列 ts,上面有 distkey 和 sortkey。以下查询:

 select ts from apilogs where date(ts) = '2016-09-08'  limit 10;

当我查询旧日期时,运行速度非常快;但不适用于最新日期!不知道为什么!感谢任何帮助

我如何放置日志:我已将所有旧日志文件一次性放入此表中;而我每小时放置的每个增量日志文件。

当我在AWS控制台查看详细计划时;我可以看到查询花费很长时间扫描所有十亿行;而花费几毫秒的查询只扫描几千行(即与该日期对应的行)..

所以,现在的问题是为什么它要扫描整个表以获取最新时间戳!

最佳答案

分布键和排序键可以位于同一列上。没问题!
您的日志表中最新加载的数据是根据排序键排序的吗?如果没有,您将必须在日志表上运行 Vacuum,以便您的排序键列按该顺序排序,并且 Redshift 不必扫描不必要的行。

运行以下查询来检查表中是否有任何未排序的区域。
选择trim(pgdb.datname)作为数据库, 修剪(a.name)作为表,((b.mbytes/part.total::decimal)*100)::decimal(5,2)作为pct_of_total,b.mbytes,b.unsorted_mbytes,(unsorted_mbytes/mbytes::十进制)*100 作为 unsorted_pct 来自 stv_tbl_perm a 将 pg_database 作为 pgdb 加入 pgdb.oid = a.db_id join (select tbl, sum(decode(unsorted, 1, 1, 0)) as unsorted_mbytes, count(*) as mbytes 来自 stv_blocklist group by tbl) b on a.id=b.tbl 加入(选择总和(容量)作为总计 来自 stv_partitions 其中 part_begin=0 ) 作为 1=1 的一部分 其中 a.slice=0 和 a.name 在 ('apilogs') 按 3 desc、db_id、名称排序;

如果您有未排序的区域,请运行
将 apilog 真空至 100%

关于amazon-web-services - 我应该使用列作为 distkey 和 sortkey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39381688/

相关文章:

postgresql - 如何从 PostgreSQL 查询中获取列名和类型(不运行它)?

amazon-web-services - 限制全局对 Amazon S3 URL 的访问

amazon-web-services - 使用 AWS Cognito 执行 IdP 启动登录时出错

java - 使用 gradle 任务构建镜像时无法在 docker 容器内设置环境变量

postgresql - 在 Redshift 中合并具有非空值的多行

postgresql - Redshift 中的多字节字符问题

SQL 将行数据放入列中(长格式到宽格式)

amazon-web-services - 是否可以使用 AWS API 为 Lambda 函数设置 AWS API Gateway 端点?

xml - 使用 Perl 解析 XML 元素和属性

binary - 计算 Redshift 列中每个位位置中 '1' 值的数量