7

有人可以通过示例查询向我解释 vertica 数据库中 PROJECTION 的概念吗?

4

4 回答 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,您将访问表。

于 2012-04-18T21:44:58.063 回答
2

我想强调杰夫的回答中提出的观点——投影是磁盘上的物理结构。为表定义多个投影可以提高查询性能,但代价是磁盘空间增加和加载时间变慢(因为必须将行放入每个投影中)。

存在将所有列存储在表中的超级投影以及部分投影。当您寻求支持/优化的查询只需要表中的列子集时,您将使用部分投影。每张桌子至少需要一个超投影。如果您没有定义一个,Vertica 将提供一个默认的,它的性能可能很差。

推荐的做法是让 Database Designer 工具帮助您使用测试数据和测试查询来分析您的表,然后它可以为您建议一个投影。我个人在这种情况下并没有取得很好的结果,但是知道如何使用 DBD 工具应该是任何在 Vertica 培训的人的课程的一部分。

于 2012-04-19T05:54:54.813 回答
2

看来您对视图很熟悉。投影在概念上很像视图,它们都缓存一些东西,但在不同的层次上。简而言之,视图缓存查询语句,而投影缓存查询结果。

视图缓存查询语句。您为预定义的查询命名,然后调用它们。视图查询在创建时不会执行。当您使用视图执行查询时,它们不会获得任何性能改进,因为它们只是普通查询。

Projections 缓存查询结果。投影查询在您创建它们时执行,结果保存在存储中。当您执行任何可以利用查询结果的查询时,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;

您可以使用 explain 语句查看查询计划中使用了哪些投影。这将帮助您提高查询的性能。

于 2017-05-13T09:14:08.573 回答
1

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

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

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

投影以提高查询性能所需要做的就是创建投影。Vertica 将自动选择用于该查询的最佳投影。(注意:可以通过专门查询而不是表来强制特定投影)

我不知道你对预测的理解在哪里,但是关于预测的更具体的问题将允许对具体点进行更详细的阐述。如果您想了解概念的一般视图,我建议您获取并阅读Concepts Guide.pdfhttp://my.vertica.com

于 2012-04-18T15:45:55.563 回答