我正在使用星型模式和单个非规范化表对矢量执行一些测试。在非规范化表中,我有5个额外的列,它们是> varchar(100)。 我是以列为导向的世界的新手,因此想要理解我的事实是正确的。
很少有事实:
查询内存= 20G,缓存内存设置为7G
仅名称列的大小约为6G,6.5G,2.6G和650M。现在显然这些不适合我的缓存内存,所以系统是I / O绑定的。
如果我使用星型模式方法,它的工作速度更快,因为它必须缓存整数列,事实上所有列都可以很容易地放入我的主内存缓存中。
我有几个问题围绕着这个问题:
如果我必须使用单个表,我需要增加RAM以确保所有这些列适合内存?我想知道是否有其他人使用Vertica或任何其他面向列的数据库完成了这种结构。如果是,您使用相同的方法,所有varchar列应该适合RAM吗?
简单星型模式查询
select col1,col2, col3, sum(col4), sum(col5) from fact_table join tabl1 on condition join tab2 on condition where tab1.col1 = 1234 and tab2.col2 = 6789
工作慢于:
select col1,col2,col3,sumcol4, sumcol5 from
(select col1,col2, col3, sum(col4) as sumcol4, sum(col5) as sumcol5 from fact_table where fact_table.col1 = 1234 and fact_table.col2 = 6789) as facts
join tabl1 on condition join tab2 on condition
为什么?
注意:主表格tab1和tab2是主要的内存驻留。
我正在使用 Vectorwise ,但只是想知道这些观察结果是否也适用于Vertica?
答案 0 :(得分:0)
Vertica没有将表保留在内存中的想法。在某些情况下和某些类型的连接中,表数据可能已经存在于内存中或放在那里。但最终,Vertiac性能取决于您如何在磁盘上存储内容。
我不希望Vectorwise中的两个查询的性能与Vertica中类似的查询和表的执行情况有关。也就是说,第二个查询中连接所涉及的行数越少表明它在各种查询执行引擎中表现更好。