Amazon web services 正在使用我的排序密钥吗?

Amazon web services 正在使用我的排序密钥吗?,amazon-web-services,amazon-redshift,Amazon Web Services,Amazon Redshift,我有一个表,其中有一列更新了,这是一个排序键。在表上运行VACUUM和ANALYZE之后,这是我在更新的\u上过滤时得到的查询计划: 我的理解是,尽管有sort键,查询执行引擎仍在对表进行顺序扫描,因此sort键没有做任何事情?顺序扫描在Amazon Redshift上是完全正常的,因为它不使用索引 系统足够聪明,可以跳过不包含所需值的块,因为每个只包含一列数据的块都存储块中每个值的最小值和最大值。因此,所有日期在2018-01-01之前的区块将自动跳过 这将不会出现在解释计划中,因为它取决于每

我有一个表,其中有一列更新了,这是一个排序键。在表上运行VACUUM和ANALYZE之后,这是我在更新的\u上过滤时得到的查询计划:

我的理解是,尽管有sort键,查询执行引擎仍在对表进行顺序扫描,因此sort键没有做任何事情?

顺序扫描在Amazon Redshift上是完全正常的,因为它不使用索引

系统足够聪明,可以跳过不包含所需值的块,因为每个只包含一列数据的块都存储块中每个值的最小值和最大值。因此,所有日期在2018-01-01之前的区块将自动跳过

这将不会出现在解释计划中,因为它取决于每个块中存储的实际数据

最好的办法是运行一些测试,看看它是否像您预期的那样运行得很快。您可能希望将启用\u结果\u缓存\u for \u会话设置为关闭,以停止缓存影响结果

另外,尽量避免将排序键强制转换为其他类型的情况。在上面的示例中,如果列是日期,但查询使用它作为时间戳,那么它可能无法跳过块,因为它必须在从磁盘读取该值后转换该值。因此,如果存在使用完全相同的数据类型的位置,它可能会工作得更好。

连续扫描在Amazon Redshift上是完全正常的,因为它不使用索引

系统足够聪明,可以跳过不包含所需值的块,因为每个只包含一列数据的块都存储块中每个值的最小值和最大值。因此,所有日期在2018-01-01之前的区块将自动跳过

这将不会出现在解释计划中,因为它取决于每个块中存储的实际数据

最好的办法是运行一些测试,看看它是否像您预期的那样运行得很快。您可能希望将启用\u结果\u缓存\u for \u会话设置为关闭,以停止缓存影响结果

另外,尽量避免将排序键强制转换为其他类型的情况。在上面的示例中,如果列是日期,但查询使用它作为时间戳,那么它可能无法跳过块,因为它必须在从磁盘读取该值后转换该值。因此,如果WHERE使用完全相同的数据类型,它可能会工作得更好。

请查看红移文档中的。它展示了如何使用SVL_QUERY_SUMMARY视图观察每个查询执行的极其详细的度量

对于最有效的排序键用法,您应该看到rr_扫描范围限制扫描列设置为t,num_rows_pre_过滤器应该非常接近行数。num_rows_pre_filter是应用谓词筛选器之前从磁盘扫描的行数。注意:根据您的具体数据,在这种情况下,相当接近会有所不同

SELECT stm,seg,step,TRIM(LEFT(label,30))"label"
      ,rows_pre_filter,rows,avgtime,bytes,is_rrscan 
FROM svl_query_summary 
WHERE query  = 123456
ORDER BY stm ,seg ,step; 

| stm | seg | step |             label             | rows_pre_filter | rows | avgtime | bytes | is_rrscan |
|-----|-----|------|-------------------------------|-----------------|------|---------|-------|-----------|
|   0 |   0 |    0 | scan   tbl=428142 name=my_tbl |          103665 |    6 |   52814 |  1273 | t         |
|   0 |   0 |    1 | project                       |               0 |    6 |   52814 |     0 | f         |
|   0 |   0 |    2 | sort   tbl=303                |               0 |    6 |   52814 |  1288 | f         |
|   1 |   1 |    0 | scan   tbl=303 name=Internal  |               0 |    6 |      74 |  1288 | f         |
|   1 |   1 |    1 | return                        |               0 |    6 |      74 |     0 | f         |
|   1 |   2 |    0 | merge                         |               0 |    0 |     275 |     0 | f         |
|   1 |   2 |    1 | project                       |               0 |    6 |     275 |     0 | f         |
|   1 |   2 |    2 | return                        |               0 |    6 |     275 |  1387 | f         |
请查看红移文档中的。它展示了如何使用SVL_QUERY_SUMMARY视图观察每个查询执行的极其详细的度量

对于最有效的排序键用法,您应该看到rr_扫描范围限制扫描列设置为t,num_rows_pre_过滤器应该非常接近行数。num_rows_pre_filter是应用谓词筛选器之前从磁盘扫描的行数。注意:根据您的具体数据,在这种情况下,相当接近会有所不同

SELECT stm,seg,step,TRIM(LEFT(label,30))"label"
      ,rows_pre_filter,rows,avgtime,bytes,is_rrscan 
FROM svl_query_summary 
WHERE query  = 123456
ORDER BY stm ,seg ,step; 

| stm | seg | step |             label             | rows_pre_filter | rows | avgtime | bytes | is_rrscan |
|-----|-----|------|-------------------------------|-----------------|------|---------|-------|-----------|
|   0 |   0 |    0 | scan   tbl=428142 name=my_tbl |          103665 |    6 |   52814 |  1273 | t         |
|   0 |   0 |    1 | project                       |               0 |    6 |   52814 |     0 | f         |
|   0 |   0 |    2 | sort   tbl=303                |               0 |    6 |   52814 |  1288 | f         |
|   1 |   1 |    0 | scan   tbl=303 name=Internal  |               0 |    6 |      74 |  1288 | f         |
|   1 |   1 |    1 | return                        |               0 |    6 |      74 |     0 | f         |
|   1 |   2 |    0 | merge                         |               0 |    0 |     275 |     0 | f         |
|   1 |   2 |    1 | project                       |               0 |    6 |     275 |     0 | f         |
|   1 |   2 |    2 | return                        |               0 |    6 |     275 |  1387 | f         |
实际上,列是TIMESTAMP实际上,列是TIMESTAMP