vertica 最佳实践之 Reading Query Plans

Reading Query Plans

    • Query Plans
    • The EXPLAIN Statement
      • EXPLAIN Output Options
    • EXPLAIN Results
      • Textual Output for EXPLAIN
      • Graphical Output for EXPLAIN
    • EXPLAIN LOCAL VERBOSE Results
      • EXPLAIN LOCAL VERBOSE的图形输出
      • EXPLAIN LOCAL VERBOSE的简化加入顺序
      • EXPLAIN LOCAL VERBOSE的资源信息
    • Estimated resources for plan:

Reading Query Plans

这是有关性能调优的三部分系列文章中的第一篇,其中包含以下文章:

第1部分:阅读查询计划

第2部分: 使用系统表对Vertica查询性能进行故障排除

第3部分:重新设计投影以进行查询优化

Query Plans

查询计划是Vertica查询优化器为在Vertica数据库中执行语句而选择的一系列阶梯状的路径。Vertica可以以多种不同的方式执行查询以达到相同的结果。查询优化器创建一个计划,以最低的执行成本执行查询。Vertica用户对查询运行EXPLAIN,以分析数据库如何处理查询并查看Vertica用于执行查询的路径的直观表示。

The EXPLAIN Statement

EXPLAIN语句返回指定sql的执行步骤,该步骤会被优化器进行优化。您可以使用此信息来分析和研究查询。默认情况下,EXPLAIN 将查询计划表示为层次结构。每个级别表示优化器为执行查询而定义的单个数据库操作。解释输出还将. dot语言附加到源文件中,使您能够以图形方式显示此输出。

考虑以下带有EXPLAIN语句的查询。

EXPLAIN SELECT DISTINCT s.product_key,p.product_description 
 FROM store.store_sales_fact S,public.product_dimension p 
 WHERE s.product_key = p.product_key 
 AND s.product_version = p.product_version 
 AND s.store_key INSELECT store_key 
 FROM store.store_dimension 
 WHERE store_state ='MA'ORDER BY s.product_key; 

下一节将提供有关EXPLAIN语句和输出选项的详细信息。

EXPLAIN Output Options

EXPLAIN语句具有以下类型的输出:

EXPLAIN option:EXPLAIN 返回有关查询执行计划的详细信息,而不执行查询。您可以将输出查看为文本输出还是图形输出。
EXPLAIN LOCAL VERBOSE option:EXPLAIN LOCAL VERBOSE 返回用于分析复杂查询的详细信息。详细信息包括成本和每个资源的内存使用情况。您可以将输出查看为文本输出还是图形输出。

EXPLAIN Results

EXPLAIN option 返回有关查询执行计划的详细信息,而不执行查询。查询优化器考虑不同的查询sql,投影组合和JOIN顺序,从而导致不同的执行计划。

然后,为了选择最佳查询计划,优化器将执行统计分析。它为每个操作分配成本,并选择成本最低的计划作为执行计划。Vertica使用两种不同的EXPLAIN option 返回所选的查询计划:

Textual output:查询计划的纯文本表示。查询计划详细列出了步骤,Vertica从下到上执行查询计划。
Graphical output:查询计划使用.DOT语言。
您可以使用管理控制台查看树路径。
您可以使用Graphviz等Web可视化工具来查看图形表示。
与纯文本计划相比,此表示提供了更多细节,并为复杂查询提供了更好的可读性和表示形式。

Textual Output for EXPLAIN

本文档前面显示的示例查询的访问路径信息描述了该查询的运算符,成本,投影,用到的列名和路径ID。

运算符:Vertica使用从下到上的方法执行查询计划中指定的JOIN,SORT,FILTER,LIMIT等运算符。这些操作可以:
是单线程或者多线程
将数据流传输到下一个运算符
例如,某些运算符需要先完成计算,然后再移至下一个运算(如SORT或GROUPBYHASH)。其他人可以在完成计算之前以流的方式传输数据,例如JOIN。

成本:优化器使用估计CPU、内存和网络资源的算法来计算每个操作符的成本。资源使用量的估计基于统计数据。统计信息的一些示例如下:

•表中的行数。
•每个列的不同值的数量。
•每个列的最小值或最大值。
•每一列值分布的直方图。
•每个列的磁盘空间。

定期更新统计数据。如果没有准确的统计信息,优化器可能会选择影响查询性能的次优计划。

通过运行以下任一命令来更新统计信息:

=> SELECT ANALYZE_STATISTICS   
=> SELECT ANALYZE_HISTOGRAM 

投影:优化器分析满足查询要求的可能投影组合,以确定哪个投影的计算成本最低。当计划一个查询时,优化器为每个表选择一个投影。然而,如果一个节点宕机,优化器可以为同一个表选择两个投影。

Column Materialization:Column Materialization为执行操作符提供对列的访问。访问是指打开列文件、编码和基于投影列定义的解压缩。

路径ID:路径ID是一个整数值,优化器将其分配给特定事务的每个查询操作。当查询计划包含多个操作符时,分析路径ID的概要信息有助于优化器在每个实例中识别操作符。

Graphical Output for EXPLAIN

使用管理控制台查看查询计划的图形表示形式。管理控制台附带了Vertica。有关如何使用管理控制台查看查询计划的更多信息,请参阅Vertica文档。如果您没有访问管理控制台的权限,您可以使用开放源码的web可视化工具来查看图形。图形输出提供了关于查询计划的详细信息,以便更好地理解查询计划。

下图显示了图形可视化工具Graphviz如何显示本文档前面的示例查询的图形。下图是完整图的摘录。
vertica 最佳实践之 Reading Query Plans_第1张图片

图中的每个对象都对应于一个操作符,框中提供了关于该操作符的详细信息。方框的不同形状和颜色有助于您直观地理解数据流。

颜色 描述
绿色 将数据从其自己的运算符传递到另一个运算符的单线程操作。
棕色 多线程运算符。可以在执行查询的资源池的设置上管理的线程数。
紫色 合并的数据流或存储。
蓝色 写入磁盘的数据目标。
形状 描述
椭圆形或圆形 Push model。操作员将信息发送到其上方的下一个操作员。
长方形 Pull model。下一个运算符从运算符数据缓冲区中查找信息。
查询开始的根对象。

下表列出了上述图形计划中最重要的运算符。

操作 描述 使用注意事项
Copy 在加载期间为buddy projections复制数据。
DataTarget 在加载期间将数据从WOS写入ROS。
ExprEval 计算表达式,例如C1 + C2。 仅选择所需的列。
Filter 将Vertica元组过滤到下一个运算符。
GroupByHash 在将数据流传输到下一个运算符之前,先在内存中的哈希中聚合元组。 GroupByHash使用所有可能的内存。如果数据超出可用内存,则会导致磁盘溢出。操作员必须先完成所有操作,然后再将数据传递给下一个操作员。
GroupByPipe 聚集排序后的元组,然后再将数据流传输到下一个运算符。 GroupByPipe对内存的需求比GroupbyHash少,并将数据流传输到下一个运算符。
Join Merge-Join 加入预排序的元组。 使用更少的内存。
Join Hash-Join 通过在内存中加载连接操作符的内部来连接未排序的元组。 如果内部很大,并且数据不适合内存,则查询将失败。如果内侧较小,则操作比合并联接要快。
Load 从磁盘加载数据并解析输入。
merge 将多个数据流合并为一个排序的流。
NetworkRec NetworkSend 网络发送有关发送到另一个节点的数据或从另一个节点接收的数据的信息。 对于每一对网络操作符(发送和接收),查询需要更多的内存。
ParallelMerge 合并排序的数据流。
ParallelUnion 合并未排序的数据流。
Root 第一个运算符。
scan 从磁盘读取数据以应用过滤器。
Sort 排序数据流。
StorageMerge 在保持排序顺序的同时合并数据存储。
StorageUnion 合并数据存储而无需保持排序顺序。
Top-K 返回Top-K元组的解析函数。
ValExpr 评估联接表达式。

接下来,让我们详细研究示例查询的三个运算符。

发送或接收:计划中间的发送和接收绿色部分表示网络操作,例如广播或分段,这可能表示投影设计不正确。
vertica 最佳实践之 Reading Query Plans_第2张图片

在图中,如颜色所示,数据通过网络单线程移动。在计划的中间,此单线程会减慢查询速度,因为此操作上方的运算符要等到第一个Send操作完成后才能完成执行。

此外,这个网络操作需要更多的内存,因为每个Send/Recv组合需要一个网络缓冲区来保存元组。集群的节点越多,需要的缓冲区就越多。避免使用Send/Recv操作符。为此,重新设计您的投影,以便在执行join或group by时可以在节点中使用数据。

GROUPBYHASH: GROUPBYHASH是单线程操作,而不是数据流操作。Vertica必须完成整个GROUPBY计算,才能将信息发送到GROUPBYHASH运算符之上的运算符。在图形计划中,您可以看到以下顺序:
vertica 最佳实践之 Reading Query Plans_第3张图片

本例中,当Vertica在同一路径中执行GROUPBYHASH操作时,它还将执行GROUPBYPIPE来从存储容器启动聚合。STORAGEUNIONSTEP(紫色框)将这些操作符的结果组合起来,将数据发送到GROUPBYHASH,以完成此路径中语句的聚合。这些详细信息只在图形化计划中可用,而不出现在文本查询计划中。

SIP:图形化计划还提供了关于侧向信息传递(SIP)的信息。在图形化计划中,SIP显示了Vertica可以用来减少元组导数的过滤器。减少通过连接操作符传递的元组的数量可以降低资源消耗,从而提高查询性能。

vertica 最佳实践之 Reading Query Plans_第4张图片

EXPLAIN LOCAL VERBOSE Results

EXPLOAIN LOCAL VERBOSE是查看有关用于执行查询的优化程序建议的详细信息的另一种方法。EXPLAIN LOCAL VERBOSE选项会添加更多信息,这些信息对于复查复杂查询很有用。EXPLAIN LOCAL VERBOSE输出提供有关以下内容的详细信息:

文本输出:查询计划的纯文本表示。查询计划列出了步骤细节,Vertica使用自下而上的方法执行查询计划。该计划具有与EXPLAIN输出中出现的相同的操作符和路径。但是,它还包含更多的细节,例如每个操作的成本、内存和网络信息。
图形输出:查询计划使用.DOT语言。
您可以使用管理控制台查看树路径。
您可以使用Graphviz等Web可视化工具来查看图形表示。
与纯文本计划相比,图形表示提供了更多细节,并为复杂查询提供了更好的可读性和表示方式。EXPLOAIN LOCAL VERBOSE选项将生成多个图形计划。以下每个都是单独的图形计划。

Simplified join order:简化的计划仅包含了解查询所必需的最少连接信息。查看该计划对于理解复杂的语句很有用。下一部分包含简化的连接顺序的示例。
JOIN graph:该计划由查询计划中的联接描述组成。
Plan for each node
启动器节点
执行程序节点。如果您有多个节点,您将有多个计划-每个节点一个。
每个节点的资源信息:有关在每个节点上执行计划的资源的详细信息。优化器计算资源,执行引擎分配资源。下一部分包含一个示例,该示例显示给定节点的资源信息。
考虑以下带有EXPLAIN语句的查询。

EXPLAIN LOCAL VERBOSE SELECT DISTINCT s.product_key, p.product_description
FROM store.store_sales_fact s, public.product_dimension p
WHERE s.product_key = p.product_key
AND s.product_version = p.product_version
AND s.store_key IN (
SELECT store_key
FROM store.store_dimension
WHERE store_state = 'MA')
ORDER BY s.product_key;

解释本地语言的文本输出
EXPLAIN LOCAL VERBOSE返回的查询计划与EXPLAIN的查询计划具有相同的信息,并带有其他详细信息,例如成本和不同资源的权重。在以下示例中,粗体字表示每个资源的额外成本,网络和内存使用情况。

Access Path:
 Sort Key: (store_sales_fact.product_key, product_dimension.product_description)
  LDISTRIB_UNSEGMENTED
 +-GROUPBY HASH (SORT OUTPUT) (GLOBAL RESEGMENT GROUPS) (LOCAL RESEGMENT GROUPS) [Cost: 2662115.000000, 
Rows: 15000000.000000 Disk(B): 2400000000.000000 CPU(B): 2280000000.000000 Memory(B): 4560000000.000000 Netwrk(B): 
4440000000.000000 Parallelism: 3.000000] [OutRowSz (B): 144] (PATH ID: 2)
 |  Group By: s.product_key, p.product_description
 |  Execute on: All Nodes
 |  Sort Key: (store_sales_fact.product_key, product_dimension.product_description)
 |  LDISTRIB_SEGMENTED
 | +---> JOIN HASH [Semi] [Cost: 1387361.000000, Rows: 15000000.000000 Disk(B): 5436997632.000000 CPU(B): 4800001024.000000
Memory(B): 2304.000000 Netwrk(B): 768.000000 Parallelism: 3.000000] [OutRowSz (B): 152] (PATH ID: 3) Inner (BROADCAST)

EXPLAIN LOCAL VERBOSE的图形输出

下图显示了图形可视化工具Graphviz如何显示本文档前面的示例查询的图形。每个框提供的信息都比EXPLAIN语句的图形输出更多。下图是完整图的摘录。

vertica 最佳实践之 Reading Query Plans_第5张图片

EXPLAIN LOCAL VERBOSE的简化加入顺序

简化的联接顺序框以易于阅读的格式提供有关运算符(SORT,JOIN,MERGE和GROUPBY)的信息。在具有多个联接的复杂查询中,该计划可以帮助您了解查询的执行情况。

vertica 最佳实践之 Reading Query Plans_第6张图片

EXPLAIN LOCAL VERBOSE的资源信息

EXPLAIN LOCAL VERBOSE选项返回有关每个节点的资源信息。查询计划生成估计的资源。以下示例显示了启动程序节点执行查询所需的估计资源。

Estimated resources for plan:

Scratch Memory MB: 1474
File Handles: 64
Worker Threads: 38
Blocking Threads: 22
Externalizing Ops: 4
Unbounded Mem Ops: 2
Max Threads: 2

你可能感兴趣的:(vertica,大数据,数据库)