我正在调整网络分析工具以Vertica用作数据库.我遇到了真正的问题optimizing joins.我尝试为我的一些查询创建预连接投影,虽然它确实使查询快速,但它减慢了数据加载到事实表中的速度.
INSERT INTO ... SELECT * FROM我们用来从临时表中将数据加载到事实表中的一个简单过程需要大约5秒钟才能完成20多分钟.
因此,我删除了所有预连接投影,并尝试使用Database Designer设计查询特定的投影,但这还不够.即使使用这些投影,简单的连接也需要大约14秒,这需要约1秒的预连接投影.
我的问题是:预连接预测是否正常减慢数据插入这一点,如果不是,那可能是罪魁祸首?如果这是正常的,那么它对我们来说是一个显示阻止,是否有其他技术可以用来加速连接?
我们在5节点集群上运行Vertica,每个节点具有2 x四核CPU和32 GB内存.我的示例查询中的表分别有188,843,085和25,712,878行.
EXPLAIN输出如下所示:
EXPLAIN SELECT referer_via_.url as referralPageUrl, COUNT(DISTINCT sessio
n.id) as visits FROM owa_session as session JOIN owa_referer AS referer_vi
a_ ON session.referer_id = referer_via_.id WHERE session.yyyymmdd BETWEEN
'20121123' AND '20121123' AND session.site_id = '49' GROUP BY referer_via_
.url ORDER BY visits DESC LIMIT 250;
Access Path:
+-SELECT LIMIT 250 [Cost: 1M, Rows: 250 (STALE STATISTICS)] (PATH ID: 0)
| Output Only: …Run Code Online (Sandbox Code Playgroud) 我有十个连接表的大查询问题.我正在将数据从广泛的事实表(f1)迁移到星型模式中.我首先从f1填充维度表,然后用一个连接到维度表来填充新的事实表(f2)以获得相应的ID.
不幸的是我收到了一个错误,"内部分区不适合内存".从日志我看到:
2012-10-18 16:20:31.607 Init Session:0x2aac6c02b250 [EE] <INFO> ENABLE_JOIN_SPILL may allow this query to run, with reduced performance
2012-10-18 16:20:31.607 Init Session:0x2aac6c02b250 [EE] <INFO> Query Retry action: Setting add_vertica_options('EE','ENABLE_JOIN_SPILL');
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为后来我得到:
2012-10-18 16:23:31.138 Init Session:0x2aac6c02b250 [EE] <INFO> Join ((public.owa_search_term_dim x public.page_impressions_with_session) using owa_search_term_dim_projection_node0001 and previous join (PATH ID: 7)) inner partition did not fit in memory; value
2012-10-18 16:23:31.138 Init Session:0x2aac6c02b250 [EE] <INFO> Query Retry action: Swapping join order with override: 1|7|0
Run Code Online (Sandbox Code Playgroud)
这种情况持续了一段时间,而Vertica显然试图找到一种方法来执行连接,但最终会因为连接不适合内存而出现错误.
是否有关于如何最小化执行连接所需的内存或为什么溢出到磁盘不起作用的提示?我可以处理性能损失,我只需要能够执行查询.