我想在vertica数据库中优化查询。我有这样的表
CREATE TABLE data (a INT, b INT, c INT);
并且其中有很多行(数十亿)
我使用whis query获取一些数据
SELECT b, c FROM data WHERE a = 1 AND b IN ( 1,2,3, ...)
但运行缓慢。查询计划显示类似这样的内容
[费用:3M,行:3B(无统计数据)]
当我在
上执行解释时,会显示相同的内容SELECT b, c FROM data WHERE a = 1 AND b = 1
看起来像扫描桌子的某些部分。在其他数据库中,我可以创建一个索引来快速进行此类查询,但是我可以在vertica中做什么?
答案 0 :(得分:4)
Vertica没有索引的概念。如果这是您认为足够频繁运行的查询,则可能需要使用Database Designer创建特定于查询的投影。每次创建投影时,数据都会物理复制并存储在磁盘上。
我建议您在文档中查看projection concepts。
如果您在计划中看到NO STATISTICS
消息,则可以在该对象上运行ANALYZE_STATISTICS
。
要进一步优化,您可能需要使用JOIN
而不是IN
。如果合适,请考虑使用partitions。
答案 1 :(得分:0)
创造良好的预测是"秘密酱"如何使Vertica表现良好。投影设计有点像艺术形式,但有三个基本概念需要牢记:
1)SEGMENTATION:对于每一行,它根据分段键确定存储数据的节点。这有两个重要原因:a)DATA SKEW - 如果数据严重偏差,那么一个节点将做太多工作,从而减慢整个查询的速度。 b)LOCAL JOINS - 如果您经常加入两个大型事实表,那么您希望以相同方式对数据进行分段,以便连接的记录存在于相同的节点上。这非常重要。
2)ORDER BY:如果您在where子句中执行频繁的FILTER操作,例如在查询WHERE a = 1中,则首先考虑通过此键对数据进行排序。订购也将改进GROUP BY操作。在您的情况下,您可以按列a a b来预测投影。正确排序允许Vertica执行MERGE连接而不是HASH连接,这将使用更少的内存。如果您不确定如何订购色谱柱,那么通常会针对从低到高的基数,这也会显着提高您的压缩率。
3)PARTITIONING:通过使用在查询中经常使用的列(例如transaction_date等)对数据进行分区,可以允许Vertica执行分区修剪,从而读取更少的数据。它还有助于插入操作,只允许影响一个小的ROS容器,而不是整个文件。
这是一张图片,可以帮助说明这些概念如何协同工作。