【发布时间】:2017-09-05 13:59:20
【问题描述】:
我是 RedShift 的新手,现阶段只是在尝试帮助进行表格设计。
我们有一个非常简单的表,大约有 600 万行和 2 个整数字段。
两个整数字段都在排序键中,但计划有一个警告 - “非常有选择性的查询过滤器”。
STL_Alert_Event_Log 条目是: '非常有选择性的查询过滤器:ratio=rows(61)/rows_pre_user_filter(524170)=0.000116'
我们正在运行的查询是:
select count(*)
from LargeNumberofRowswithUniKey r
where r.benchmarkid = 291891 and universeid = 300901
我们的表 DDL 是:
CREATE TABLE public.LargeNumberofRowswithUniKey
(
benchmarkid INTEGER NOT NULL DISTKEY,
UniverseID INTEGER NOT NULL
)
SORTKEY
(
benchmarkid,UniverseID
);
我们还在桌子上运行了以下命令:
Vacuum full public.LargeNumberofRowswithUniKey;
Analyze public.LargeNumberofRowswithUniKey;
计划截图在这里:[查询计划图片][1] 我的期望是,包括 Benchmark 和 Universe 在内的多重排序键以及两者都是过滤谓词的一部分这一事实将确保设计对于示例查询是最优的。情况似乎并非如此,因此所附图像中的红色警告符号。有人能解释一下吗?
谢谢
乔治
2017 年 9 月 7 日更新 我有更多信息可能会有所帮助:
如果我运行一个更简单的查询,它只过滤排序键的第一列。
select r.benchmarkid
from LargeNumberofRowswithUniKey r
where r.benchmarkid = 291891
这会导致根据来自控制台的实际查询计划扫描 524,170 行。当我使用 STV_BLOCKLIST 查看块时。满足我的查询可能需要的相关块是:
|slice|col|tbl |blocknum|num_values|minvalue|maxvalue|
| 1| 0|346457| 4| 262085| 291881| 383881|
| 3| 0|346457| 4| 262085| 291883| 344174|
| 0| 0|346457| 5| 262085| 291891| 344122|
那么不应该扫描 786,255 行 (3 x 262,085) 而不是计划中列出的 524,170 (2 x 262,085) 行吗?
【问题讨论】:
标签: amazon-web-services amazon-redshift