Vertica数据库中的PROJECTION

7
有人能够用一个示例查询来解释Vertica数据库中“投影”的概念吗?

1
在vertica.com博客上有关于Vertica投影的很好的解释和如何使用它的建议:-第1部分http://www.vertica.com/2011/09/01/the-power-of-projections-part-1/-第2部分http://www.vertica.com/2011/09/02/the-power-of-projections-part-2/-第3部分http://www.vertica.com/2011/09/06/the-power-of-projections-part-3/Vertica投影的力量:(来自存档)Part#1 :https://web.archive.org/web/20130920020028/http://184.106.12.19:80/2011/09/01/the-power-of-projections-part-1/ Part#2 :https://web.archive.org/web/20140828131329/http://184.106.12.19/2011/09/02/the - Kirzilla
这是一个可以帮助很多人的好问题。不幸的是,这个答案必须被关闭。 - user1559897
4个回答

9

Vertica不使用索引来查找数据。

从概念上讲,您仍然可以使用SQL访问表。但在底层,表中的数据存储在投影中,您可以为不同的查询进行优化。

我喜欢把它想象成一个代表一副牌的桌子。如果玩扑克牌,您可能仍然会说类似于

Select * from CardDeck limit 5;

假设你有一个定义了以下列的表格:
FaceValue int (let's just assume face values are ints),
Suit varchar(10)

我可以创建我的投影(我省略了有关分区、超级投影、伙伴投影等细节)。

create projection CardDeck_p1
(
FaceValue ENCODING RLE,
Suit
)
as 
select FaceValue, Suit from CardDeck order by FaceValue;

create projection CardDeck_p2
(
FaceValue,
Suit
)
as
select FaceValue, Suit from CardDeck order by Suit;

现在,每个列可以获得不同类型的编码方式,这些编码方式在投影中定义。如果您需要设计投影,则可以使用数据库设计师。回到纸牌比喻,假设您想要访问一副纸牌,但希望有不同的洗牌方式。Vertica 中的投影提供了不同的洗牌方式。表实际上是一种构造,允许您访问存储在投影中的数据。但如果您编写 SQL,则需要访问表。

2
我想强调Geoff答案中提到的一点 - 投影是磁盘上的物理结构。为表定义多个投影可以提高查询性能,但代价是增加磁盘空间和较慢的加载时间(因为必须将行放入每个投影中)。
有超级投影,它存储表中的所有列以及部分投影。当您要支持/优化的查询仅需要表中的子集时,应使用部分投影。每个表都需要至少一个超级投影。如果您没有定义超级投影,则Vertica将提供默认超级投影,其性能可能非常差。
建议的做法是使用Database Designer工具帮助您分析带有测试数据和测试查询的表,之后它可以为您建议一个投影。我个人在这方面没有取得很好的结果,但知道如何使用DBD工具应该是任何接受Vertica培训的人的课程的一部分。

2
看起来你对视图很熟悉。投影在概念上与视图非常相似,它们都缓存某些内容,但级别不同。简而言之,视图缓存查询语句,而投影缓存查询结果。 视图缓存查询语句。你可以为预定义的查询命名,然后在此之后调用它们。视图查询在创建时不会执行。当你使用视图执行查询时,它们不会获得任何性能提升,因为它们只是普通的查询。 投影缓存查询结果。投影查询在创建时执行,并将结果持久化存储。当你执行任何可以利用查询结果的查询时,Vertica将使用这些投影来响应查询,从而提高查询性能。创建投影后,你无需进行任何特殊操作,如果可以从中受益,则Vertica会自动选择投影以供查询使用。投影可以用于查询,因为查询使用了投影的子集列、具有相同的排序顺序等。
像视图一样,投影可以选择表列的子集,与其他表进行连接,按特定列排序。但是,不同的投影将占用自己的空间来保存查询结果,创建的投影越多,它们占用的空间就越多。当相关源表更新时,投影会自动更新。更新过程在后台执行,根据查询复杂性和数据大小可能需要很长时间。因此,投影更适合于多读而不是多写。从使用案例的角度来看,与实时Web仪表板相比,投影更适合报告。
在实现细节上,Vertica中的表都是逻辑表。表中的所有数据都存储在每个关联超级投影中。超级投影包含表中的所有列,并且默认情况下会自动创建。所有其他投影都源自超级投影。
Vertica将决定哪些投影将用于查询,但你也可以直接指定投影的名称以强制Vertica使用它们:
-- List all projections
SELECT projection_name FROM projections;

-- Force to use super projection, _super is the suffix of the super projection
SELECT * FROM FACT_TABLE_super;

今日免费次数已满, 请开通会员/明日再来

1

来自 Vertica 文档的 Concepts Guide.pdf(大约在第23页左右)。

投影将数据存储在一种优化查询执行的格式中。它们类似于材料化视图,因为它们将结果集存储在磁盘上,而不是每次在查询中使用时计算它们。

此外

对于 SQL 的最终用户来说,投影是透明的。Vertica 查询优化器会自动选择用于任何查询的最佳投影。

要提高查询性能,只需创建投影即可。Vertica 将自动选择用于该查询的最佳投影。(注意:可以通过针对特定投影而不是表进行查询来强制使用特定投影)

我不知道您对投影的理解程度如何,但有关投影的更具体问题将允许更详细地阐述特定点。如果您想获得概念的一般视图,我建议获取并阅读 Concepts Guide.pdfhttp://my.vertica.com


谢谢Nija。你的回复非常有用。我还有几个问题。我的理解是,PROJECTIONS与VIEWS类似,只是PROJECTIONS将结果集存储在磁盘上,而VIEWS每次在查询中使用时都会计算表中的数据。我可以使用VIEW作为PROJECTION的替代吗?如果可以,是否会出现性能问题? - Murali
@Murali:在Vertica中,“Views”本质上就是查询。 (摘自_SQL参考手册.pdf_)“[在]包含视图的查询中,视图名称被视图的定义查询所替代”。 - QuinnG
谢谢。顺便说一下,我无法从http://my.vertica.com下载Concepts Guide.pdf。似乎只有授权用户才能下载。我已经注册了,但还没有收到激活邮件。是否有其他方法可以获取.pdf指南? - Murali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接