我有两张桌子在红班:
除此之外,我还有一个名为qry_both_days的视图,定义如下:
CREATE OR REPLACE qry_both_days AS
SELECT * FROM tbl_current_day
UNION SELECT * FROM tbl_previous_day;当我在一个单独的表上运行一个查询时,我得到了预期的很好的性能。例如,以下查询运行5秒:
select count(distinct person_id) from tbl_current_day;
-- (person_id is of type int)解释计划:
XN Aggregate (cost=1224379.82..1224379.82 rows=1 width=4)
-> XN Subquery Scan volt_dt_0 (cost=1224373.80..1224378.61 rows=481 width=4)
-> XN HashAggregate (cost=1224373.80..1224373.80 rows=481 width=4)
-> XN Seq Scan on tbl_current_day (cost=0.00..979499.04 rows=97949904 width=4)请注意,宽度是4个字节,这是应该的,因为我的列是int类型的。
然而,当我在qry_both_days上运行相同的查询时,的运行速度要慢20倍,而我希望它的运行速度要慢2倍,因为它应该再运行两次:
select count(distinct person_id) from qry_both_days;解释计划:
XN Aggregate (cost=55648338.34..55648338.34 rows=1 width=4)
-> XN Subquery Scan volt_dt_0 (cost=55648335.84..55648337.84 rows=200 width=4)
-> XN HashAggregate (cost=55648335.84..55648335.84 rows=200 width=4)
-> XN Subquery Scan qry_both_days (cost=0.00..54354188.49 rows=517658938 width=4)
-> XN Unique (cost=0.00..49177599.11 rows=517658938 width=190)
-> XN Append (cost=0.00..10353178.76 rows=517658938 width=190)
-> XN Subquery Scan "*SELECT* 1" (cost=0.00..89649.20 rows=4482460 width=190)
-> XN Seq Scan on tbl_current_day (cost=0.00..44824.60 rows=4482460 width=190)
-> XN Subquery Scan "*SELECT* 2" (cost=0.00..90675.00 rows=4533750 width=187)
-> XN Seq Scan on tbl_previous_day (cost=0.00..45337.50 rows=4533750 width=187)问题:的宽度现在是190,而不是原来的4字节!有人知道如何使RedShift只选择UNION上的相关列吗?
谢谢!
发布于 2013-11-20 08:58:04
视图是作为SELECT *创建的,因此它总是查询所有列来为视图创建数据。然后使用另一个SELECT,并且只返回来自视图的请求列。
如果所选列的数量有限(就像经常使用的两组、三组),我将为每个列集创建一个单独的视图。
另一种方法(甚至不如以前那样优雅)是调用每个视图,以便它的名称显示包含了哪些列(例如,用‘__’排序和分隔)--类似于qry_both_days__age__name__person_id。然后,在每个查询之前,检查是否存在必需的视图,如果没有创建它。
发布于 2015-04-01 14:40:32
它本身使用的UNION删除重复行,例如,按照SQL规范使用隐含的DISTINCT。
这意味着需要更多的处理来准备输出。
如果不需要DISTINCT结果,那么应该始终使用UNION ALL来确保数据库没有检查潜在的欺骗。
https://stackoverflow.com/questions/20080871
复制相似问题