【发布时间】:2019-06-30 04:44:22
【问题描述】:
我有一个缓慢变化的维度来表示我们所有文章主数据的变化,并且非常庞大:150 亿行并且还在增长。
该表目前分布在(国家、供应商)等自然集合中。
由于表的性质,使用它的大多数查询都是范围连接,例如在变化的文章属性上简单地计算订单:
SELECT x.article_id, x.changing_article_season, COUNT(*) counting_orders
FROM article_slow_changing_dimension x
LEFT JOIN orders y ON x.article_id=y.article_id
AND y.order_timestamp BETWEEN x.from_timestamp AND y.to_timestamp
在这里选择排序键有什么有趣的策略? 我正在考虑做 SORTKEY(from_timestamp, to_timestamp) 但我不确定。
我尝试了一些方法,但任何测试都需要很长时间才能设置,而且实际上很难凭经验进行评估。有什么想法吗?
编辑:添加一些基于 cmets 的细节 1/ 桌子被吸尘 2/ 集群非常小(4 个节点),查询运行速度非常快,但它不在生产环境中,所以基本上只有我的开发人员在运行一些查询。我想在投入生产之前进行优化 3/ 现在大约有 150 亿行,聚合一个特定的时间戳需要 1 分钟;但我想把它推到 20 秒
【问题讨论】:
-
该查询真的执行了吗?
-
特别是 - 检查“BETWEEN x.from_timestamp=y.to_timestamp”的语法 - 这是正确的吗?订单有多少行?你的红移集群的大小是多少?运行大约需要多长时间?你的桌子被吸尘和分析了吗?请用这些东西编辑你的问题。
-
我的错;我修复了示例查询;概念问题仍然存在:)
-
你在 x.from_timestamp 和 y.to_timestamp 之间加入??所以 from 时间戳在 x 表上,而 to_timestamp 在 y 表上?你确定吗?
-
您说“集群非常小(4 个节点),查询运行速度非常快,但它不在生产环境中,所以基本上只有我的开发人员在运行一些查询。我想优化在投入生产之前” - 不幸的是,这将很难在测试数据上执行 - 在 prod 上运行它,然后返回有关性能和表大小的信息。
标签: sql query-optimization amazon-redshift distributed-transactions