有人可以通过示例查询向我解释Vertica数据库中PROJECTION的概念吗?
答案 0 :(得分: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,则可以访问表。
答案 1 :(得分:1)
来自Vertica文档的 Concepts Guide.pdf (第23页左右)。
Projections以优化查询执行的格式存储数据。 它们与物化视图类似,因为它们存储结果集 在磁盘上,而不是每次在查询中使用它们时计算它们。
也
预测对SQL的最终用户是透明的。 Vertica查询 优化器会自动选择最适合的投影 查询。
为提高查询性能而需要进行的所有操作都是创建投影。 Vertica将自动选择用于该查询的最佳投影。 (注意:可以通过专门而不是表格来查询特定的投影)
我不知道您对预测的理解在哪里,但有关预测的更具体问题将允许更详细地阐述具体要点。如果您希望获得概念的一般视图,我建议您阅读并阅读 Concepts Guide.pdf 。 http://my.vertica.com
答案 2 :(得分:1)
我想强调杰夫答案中的观点 - 预测是磁盘上的物理结构。为表定义多个投影可以提高查询性能,但代价是磁盘空间增加和加载时间较慢(因为必须将行放入每个投影中)。
有超级投影可以存储表格中的所有列以及部分投影。当您要支持/优化的查询只需要表中列的一部分时,您将使用部分投影。每张桌子至少需要一个超级投影。如果您没有定义一个,Vertica将提供一个默认的,性能非常差。
建议的做法是让Database Designer工具帮助您使用测试数据和测试查询分析您的表,之后它可以为您建议投影。我个人没有以这种方式取得好成绩,但是知道如何使用DBD工具应该成为Vertica培训人员课程的一部分。
答案 3 :(得分:0)
您似乎对视图很熟悉。预测与概念中的观点非常相似,它们既可以缓存某些内容,也可以在不同的级简而言之,视图缓存查询语句,而投影缓存查询结果。
视图缓存查询语句。您为预定义查询指定名称,然后再调用它们。查看查询在创建时不会执行。当您使用视图执行查询时,它们不会获得任何性能提升,因为它们只是普通的查询。
投影缓存查询结果。投影查询在您创建时执行,结果将保留在存储上。当您执行任何可以利用查询结果的查询时,Vertica将使用这些投影来响应查询,从而提高查询性能。创建投影后,您无需执行任何特殊操作,如果可以使查询受益,Vertica将自动选择投影。投影可用于查询,因为查询使用投影的子集列,具有相同的排序顺序等。
像视图一样的投影,您可以选择表列的子集,与其他表执行连接,按特定列排序。但是,不同的投影会占用自己的空间来保存查询结果,创建的投影越多,消耗的空间就越多。在更新相关源表时,预测将自动更新。更新过程在后台执行,可能需要很长时间,具体取决于查询复杂性和数据大小。因此,投影更适合于许多读取而不是许多写入。从用例角度来看,与实时网络仪表板相比,投影更适合报告。
在实现细节中,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语句查看查询计划中使用的投影。这有助于您提高查询效果。