Sql Amazon红移执行哈希连接,即使在同时是Dist键和Sort键的列上进行连接

Sql Amazon红移执行哈希连接,即使在同时是Dist键和Sort键的列上进行连接,sql,join,amazon-web-services,hash,amazon-redshift,Sql,Join,Amazon Web Services,Hash,Amazon Redshift,我有一个红移的事实表,它有大约13亿行,分布键c1和排序键c1,c2 我需要用c1上的join子句将这个表与其自身连接起来,即表的第一个实例的c1=表的第二个实例的c1 当我看到我的查询的查询计划时,Redshift似乎正在与DS\u DIST\u NONE进行哈希连接。虽然应该是DS_DIST_NONE,因为我在列c1上有DIST key和sort key,但是出于同样的原因,我希望Redshift再次执行合并联接而不是散列联接 我相信这会减缓我的质疑 有谁能解释一下为什么Redshift可能

我有一个红移的事实表,它有大约13亿行,分布键c1和排序键c1,c2

我需要用c1上的join子句将这个表与其自身连接起来,即表的第一个实例的c1=表的第二个实例的c1

当我看到我的查询的查询计划时,Redshift似乎正在与DS\u DIST\u NONE进行哈希连接。虽然应该是DS_DIST_NONE,因为我在列c1上有DIST key和sort key,但是出于同样的原因,我希望Redshift再次执行合并联接而不是散列联接

我相信这会减缓我的质疑


有谁能解释一下为什么Redshift可能会执行哈希连接而不是合并连接,尽管我在连接列上有DIST Key和SORT Key,并且Redshift正在为查询执行DS_DIST_NONE?

结果是,由于我们没有按照该表的SORT Key和Redshift定义的排序顺序在表中插入数据不会自动按排序键对表中的行进行排序,红移无法对表执行合并联接。在表上运行完全真空后,Redshift开始执行合并联接

结果是,由于我们没有按照表的排序键定义的排序顺序在表中插入数据,并且Redshift不会自动按排序键对表中的行进行排序,所以Redshift无法在表上执行合并联接。在表上运行完全真空后,Redshift开始执行合并联接

为什么c1上同时有dist键和sort键?dist键应位于高基数列上,用于在节点上均匀分布数据,而sort键应位于低基数列上,因为它用于更快地扫描和跳过数据。在c1上连接时,必须使dist键和sort键具有相同的列c1才能实现合并排序。亚马逊红移文档中提到了这一点。我也不明白为什么需要c1的低基数,以便更快地扫描和跳过数据。您能解释一下吗?对于联接,您需要将联接表的两个键定义为分发键,以允许在每个节点中并置联接。排序键允许在筛选位置时更快地扫描数据以查找相关数据。。。。将c1作为联接查询的排序键没有什么好处。排序键告诉红移如何对磁盘上的数据进行排序。例如,它使每个数据块的元数据最小值和最大值与忽略大多数未在WHERE子句中定义值的数据块的查询相关。根据红移,使用一列作为排序键和距离键是一种有效的方法,特别是如果您希望经常连接两个表。当然,如果表更多地用于过滤查询,那么在最有可能被过滤的列上设置一个排序键可能是更好的选择。这两种方法都是有效的。至于为什么查询计划不使用合并联接:有许多可能的原因。发布查询、表架构和解释是调试的第一步。事实证明,由于我们没有按照表的排序键定义的排序顺序在表中插入数据,并且Redshift不会自动按排序键对表中的行进行排序,因此Redshift无法对表执行合并联接。在表上运行完全真空后,Redshift开始执行合并联接。为什么c1上同时有dist键和sort键?dist键应位于高基数列上,用于在节点上均匀分布数据,而sort键应位于低基数列上,因为它用于更快地扫描和跳过数据。在c1上连接时,必须使dist键和sort键具有相同的列c1才能实现合并排序。亚马逊红移文档中提到了这一点。我也不明白为什么需要c1的低基数,以便更快地扫描和跳过数据。您能解释一下吗?对于联接,您需要将联接表的两个键定义为分发键,以允许在每个节点中并置联接。排序键允许在筛选位置时更快地扫描数据以查找相关数据。。。。将c1作为联接查询的排序键没有什么好处。排序键告诉红移如何对磁盘上的数据进行排序。例如,它使每个数据块的元数据最小值和最大值与忽略大多数未在WHERE子句中定义值的数据块的查询相关。根据红移,使用一列作为排序键和距离键是一种有效的方法,特别是如果您希望经常连接两个表。当然,如果表更多地用于过滤查询,那么在最有可能被过滤的列上设置一个排序键可能是更好的选择。这两种方法都是有效的。至于为什么查询计划不会使用合并联接:有很多p
可能的原因。发布查询、表架构和解释是调试的第一步。事实证明,由于我们没有按照表的排序键定义的排序顺序在表中插入数据,并且Redshift不会自动按排序键对表中的行进行排序,因此Redshift无法对表执行合并联接。在表上运行完全真空后,Redshift开始执行合并联接。