【发布时间】:2019-12-01 11:48:45
【问题描述】:
我正在 Amazon Redshift 上创建一个表,用于每天存储大量数据。
我尝试使用排序键尽可能优化数据库性能。
我们的想法是能够通过对这些数据执行选择查询的 API 为 wep 应用程序提供这些数据。
在使用了多个不同的排序键之后,我根本不相信我使用了正确的排序键。我一定是错过/误解了一些东西......
表定义:
CREATE TABLE test_table(
date date NOT NULL,
country char(2) NOT NULL,
application_id integer NOT NULL,
device smallint NOT NULL,
category smallint NOT NULL,
subcategory smallint DEFAULT NULL,
rank smallint DEFAULT NULL,
subrank smallint DEFAULT NULL,
is_free smallint NOT NULL,
downloads integer DEFAULT NULL)
distkey(application_id)
数据上下文:
- 存储 10 000 000 到 20 000 000 行/天
- 保留2年历史
我已经尝试过的排序键:
- 复合排序键(设备、is_free、日期、国家、类别、子类别)
- 交错排序键(设备、is_free、国家、类别、子类别)
执行的性能测试(在 1800 万个生成的行上):
使用这些排序键中的任何一个,以下示例查询始终在 3 秒和 7 秒期间执行,具体取决于给定国家/类别的数量和日期范围。
查询示例:
SELECT country, category, sum(downloads)
FROM test_table
WHERE country IN ('fr','jp', 'de', 'gb', 'us')
AND category in (6014, 6005, 6011, 6004, 6017)
AND device = 0
AND is_free = 1
AND date >= '2019-01-01' AND date <= '2019-04-01'
GROUP BY country, category;
SELECT category, country, rank, avg(downloads)
FROM test_table
WHERE country IN ('br','co', 'ru')
AND category in (6009, 6008, 6000)
AND device = 1
AND is_free = 0
AND rank IN (1, 10, 100)
AND date BETWEEN '2019-03-01' AND '2019-04-01'
GROUP BY category, country, rank;
SELECT category, country, application_id, sum(downloads)
FROM test_table
WHERE country IN ('us', 'cn', 'jp')
AND category in (6010, 6003, 6002)
AND device = 1
AND is_free = 1
AND date BETWEEN '2019-04-01' AND '2019-06-01'
GROUP BY category, country, application_id
有没有可能让它更快? 选择的排序键是坏的吗? 我可以将日期字段放在交错排序键中吗? (即使我读过这是一个坏主意)
如果您认为 Redshift 没有针对这种情况,您是否有其他数据库建议(我对技术没有限制)?
提前感谢您的帮助:)
【问题讨论】:
-
如果您正在寻找比几秒钟更快的性能和/或希望通过 Web 应用程序为许多用户提供服务,那么 Redshift 可能不是正确的架构选择。您正在寻找什么最大响应(以秒为单位)以及您期望有多少用户?您还需要考虑如何加载数据? (您将希望您的排序键与加载记录的顺序相匹配,以减少重新排序的需要)
-
@JonScott 感谢您的快速回复。几秒钟就可以了,我只是想知道这是否是由于排序键错误以及是否可以改进:限制是 30 秒,但不是 1800 万,这大约是 1/2 天的数据,但 1/2 年的数据数据
-
如果我每天增加 10/20 百万行,我担心一年中性能下降很多
-
数据将插入每组国家/日期/设备:所以我将首先插入 50 000 行,例如 - 01/08/19 - iphone,然后 40 000 行用于 cn - 07 /09/19 - ipad ,...此时,没有订单,但如果更好,我可以执行所有日期为 be 然后为 cn 的所有日期
-
有多少用户(每 24 小时有多少查询)?
标签: database indexing bigdata amazon-redshift database-performance