Redshift中是否有这样的功能?交错密钥可以某种方式缓解这种情况。 如果可以混合按化合物排序然后交错,那么这将是理想的。
使用分区视图是否有缺点。示例我的意思如下。
https://sqlsunday.com/2014/08/31/partitioned-views/
但是,我想用其他字段类型进行分区,而不是使用日期。例如产品类型或国家。
所以视图将是
选择' 1'作为Prod_type,' USA'作为国家,* 来自fact_Sales_1_USA 联合所有 选择' 2'作为Prod_type,' UK'作为国家,* 来自fact_Sales_2_UK
这样可以防止查询读取整个表,只是限制特定的产品类型和区域。
还有一个功能可以选择多个名称相似的表。
所以代替上面的观点 它只是,但这需要将分区列包含在表中。
从事实_ *
中选择*缺点之一是我们的数据更新稍微复杂一些?
如果我不使用上面的字段,它会减慢查询速度吗?
答案 0 :(得分:0)
Redshift中的分区视图没有内置函数。它的开发人员认为sort和dist键模型和编码可以处理大多数性能问题。特定的解决方案在很大程度上取决于您的数据的性质和您执行的典型查询。
在您提到的一个特定示例中,如果产品类型/国家/地区不在排序键中,则根据产品类型/国家/地区生成多个表并按其他列排序会阻止查询计划程序扫描所有表。 AFAIK Redshift对于不参与sort / dist键的列的值分布是不可知的,因此它将扫描参与联合的每个表,即使所需的值只是设计在一个表中。如果您要按产品类型 AND 国家/地区频繁过滤,请创建复合排序键(product_type,country,timestamp)
。这样,Redshift将仅扫描满足搜索条件的数据块。如果您要按产品类型 OR 国家/地区频繁过滤,请在相同列上创建交错排序键。交错密钥在这里更好,因为如果您按国家/地区(第二列)过滤上面提到的复合排序键,则不会使用密钥。
如果这没有解决问题,则意味着您的数据太大,以至于您的公司可以负担得起在Redshift之上构建应用程序,该应用程序将在SQL之外处理此逻辑(将不同的产品类型/国家/地区保存在单独的表中生成基于过滤器值查询这些特定表的动态SQL。
对于从具有相似名称的表中进行选择的功能,没有这样的功能。在Postgres中,您可以查询系统表,根据查询结果生成SQL并立即运行,但Redshift不支持动态SQL。解决方案在上面(右键排序键或Redshift顶部的应用程序)。