我应该同时使用一个列作为 distkey 和 sortkey

Posted

技术标签:

【中文标题】我应该同时使用一个列作为 distkey 和 sortkey【英文标题】:Should I use a column both as distkey and sortkey 【发布时间】:2016-09-08 02:27:03 【问题描述】:

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

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

当我查询旧日期时运行速度超快;但不是最新日期!不知道为什么!任何帮助表示赞赏

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

当我在 AWS 控制台上查看详细计划时;我可以看到需要很长时间的查询正在扫描所有十亿行;虽然查询需要几毫秒,但只扫描几千行(即对应于该日期的行)..

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

【问题讨论】:

【参考方案1】:

Dist 键和排序键可以在同一列。没问题! 您在日志表中加载的最新数据,是否根据排序键排序?如果没有,您将不得不在日志表上运行 Vacuum,以便您的排序键列按该顺序排序,并且 redshift 不必扫描不必要的行。 运行以下查询以检查表中是否有任何未排序的区域。select trim(pgdb.datname) as Database, trim(a.name) as Table, ((b.mbytes/part.total::decimal)*100)::decimal(5,2) as pct_of_total, b.mbytes, b.unsorted_mbytes, (unsorted_mbytes/mbytes::decimal)*100 as unsorted_pct from stv_tbl_perm a join pg_database as pgdb on pgdb.oid = a.db_id join (select tbl, sum(decode(unsorted, 1, 1, 0)) as unsorted_mbytes, count(*) as mbytes from stv_blocklist group by tbl) b on a.id=b.tbl join ( select sum(capacity) as total from stv_partitions where part_begin=0 ) as part on 1=1 where a.slice=0 and a.name in ('apilogs') order by 3 desc, db_id, name; 如果您有未排序的区域,请运行Vacuum apilogs to 100 percent

【讨论】:

是的,我正在查询时间戳;并且时间戳是 distkey 和 sortkey 声明排序键不会对您的数据进行排序。您必须按排序顺序加载数据,如果未按排序顺序加载,则必须运行 Vacuum 对数据进行排序和合并。【参考方案2】:

在为最新时间戳添加行之后,您似乎还没有在表上运行 vacuum

这是与您的用例最相关的部分,来自 Redshift documentation:

当数据最初加载到具有排序键的表中时,数据将根据 CREATE TABLE 语句中的 SORTKEY 规范进行排序。但是,当您使用 COPY、INSERT 或 UPDATE 语句更新表时,新行将存储在磁盘上单独的未排序区域中,然后根据需要对查询进行排序。如果磁盘上仍有大量行未排序,则依赖于已排序数据的操作(例如范围限制扫描或合并连接)的查询性能可能会降低。 VACUUM 命令将新行与现有的已排序行合并,因此范围受限的扫描效率更高,并且执行引擎不需要在查询执行期间按需对行进行排序。

P.S.- 你不应该担心你的分发密钥,因为它们只在加入时出现。

【讨论】:

如果我运行真空;然后直到该日期的所有数据都运行得很快..但之后的任何数据仍然很慢...我每小时插入一次日志..所以我应该多久运行一次 vacum !另外,有没有办法只在我的最新数据集上运行 vacum '有没有办法只在我的最新数据集上运行 vacum'- 没有 '我应该多久运行一次 vacum'- 与您的数据更改一样频繁,可能在您每次插入新日志之后。 感谢您的投入...但您不认为这会过分......在插入数万条记录时在十亿行上运行 vacum.. 在此表上运行 vacum 至少需要 24 小时

以上是关于我应该同时使用一个列作为 distkey 和 sortkey的主要内容,如果未能解决你的问题,请参考以下文章

Redshift:sortkey 是不是应该包含 distkey?

Amazon Redshift:查找和修复倾斜的 DISTKEY

Redshift 性能:连接列上的编码

Redshift:sortkey 和 distkey 可以为空吗?

如何将列转换为数字,而它同时包含字符串和数字作为字符串

如何使用不同的列作为外键强制has_many关联