首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RedShift / ParAccel中UNION select查询性能极差

RedShift / ParAccel中UNION select查询性能极差
EN

Stack Overflow用户
提问于 2013-11-19 19:58:07
回答 2查看 7.3K关注 0票数 1

我有两张桌子在红班:

  • tbl_current_day -大约450万行
  • tbl_previous_day -大约450万行,数据与tbl_current_day完全相同

除此之外,我还有一个名为qry_both_days的视图,定义如下:

代码语言:javascript
复制
CREATE OR REPLACE qry_both_days AS 
SELECT * FROM tbl_current_day
UNION SELECT * FROM tbl_previous_day;

当我在一个单独的表上运行一个查询时,我得到了预期的很好的性能。例如,以下查询运行5秒:

代码语言:javascript
复制
select count(distinct person_id) from tbl_current_day;
-- (person_id is of type int)

解释计划:

代码语言:javascript
复制
 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倍,因为它应该再运行两次:

代码语言:javascript
复制
select count(distinct person_id) from qry_both_days;

解释计划:

代码语言:javascript
复制
 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上的相关列吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-20 08:58:04

视图是作为SELECT *创建的,因此它总是查询所有列来为视图创建数据。然后使用另一个SELECT,并且只返回来自视图的请求列。

如果所选列的数量有限(就像经常使用的两组、三组),我将为每个列集创建一个单独的视图。

另一种方法(甚至不如以前那样优雅)是调用每个视图,以便它的名称显示包含了哪些列(例如,用‘__’排序和分隔)--类似于qry_both_days__age__name__person_id。然后,在每个查询之前,检查是否存在必需的视图,如果没有创建它。

票数 1
EN

Stack Overflow用户

发布于 2015-04-01 14:40:32

它本身使用的UNION删除重复行,例如,按照SQL规范使用隐含的DISTINCT

这意味着需要更多的处理来准备输出。

如果不需要DISTINCT结果,那么应该始终使用UNION ALL来确保数据库没有检查潜在的欺骗。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20080871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档