AWS Redshift 查询过长异常

Posted

技术标签:

【中文标题】AWS Redshift 查询过长异常【英文标题】:AWS Redshift Query too long exception 【发布时间】:2020-11-24 06:45:54 【问题描述】:

一直在尝试在 AWS Redshift(类型:RA3.4xLarge)中运行合并查询,其中查询的长度约为 6k 个字符(我知道,非常大!!)。

现在此查询失败并出现以下错误。

psycopg2.errors.InternalError_: Value too long for character type
DETAIL:  
  -----------------------------------------------
  error:  Value too long for character type
  code:      8001
  context:   Value too long for type character varying(1)
  query:     388111
  location:  string.cpp:175
  process:   query0_251_388111 [pid=13360]
  -----------------------------------------------

进一步挖掘,发现stl_query 表记录了集群上运行的每个查询,这对querytxt 列有4k 个字符的限制,导致上述整个查询失败。

                     View "pg_catalog.stl_query"
           Column           |            Type             | Modifiers
----------------------------+-----------------------------+-----------
 userid                     | integer                     |
 query                      | integer                     |
 label                      | character(320)              |
 xid                        | bigint                      |
 pid                        | integer                     |
 database                   | character(32)               |
 querytxt                   | character(4000)             |
 starttime                  | timestamp without time zone |
 endtime                    | timestamp without time zone |
 aborted                    | integer                     |
 insert_pristine            | integer                     |
 concurrency_scaling_status | integer                     |

所以,这里的问题是(除了减少查询长度),有没有解决这种情况的方法?还是我把这整件事都推错了?

【问题讨论】:

【参考方案1】:

您的分析偏离了轨道 - 我处理过许多大小超过 4K 的 Redshift 查询(很遗憾)。除非他们在最近的版本中破坏了某些东西,否则这不是您的问题。

首先,stl_query 只存储查询的前 4K 个字符 - 如果您想查看整个长查询,您需要查看表 stl_querytext。请注意,stl_querytext 将查询分成 200 个字符块,您需要使用序列值重新组合它们。

现在您的错误指向一个 varchar(1),一个字节大小的 varchar,作为问题的根源。我会查看您的查询和表以查找 varchar(1) 大小的列,并查看其中放入了什么。您可能需要了解插入的字符串长度以及为什么要找到解决方案。

请记住,在 Redshift 中,非 ascii 字符存储在多个字节中,并且 varchar(1) 是一个字节列。因此,如果您尝试在此列中插入单个非 ascii 字符,它将不适合。如果问题与非 ascii 字符有关,则可以使用两个函数:

length() - 在 CHARACTERS 中查找字符串的长度 octet_length() - 以 BYTES 计算字符串的长度

如果您仍然无法找到问题,您可能需要发布您正在使用的 DDL 和 SQL,以便获得更具体的建议。

【讨论】:

谢谢比尔。让我进一步了解基本查询。会尽快回复您。 @bill 只是好奇,在红移中,数据类型部分具有数据的大小(例如:name varchar(10) - name column can hold up to 10 bytes)那么如何插入超过1 bytes(根据问题) 及其在选择数据时给出的错误? 一个 VARCHAR(10) 最多可以容纳 10 个 ascii 字符,但更少的字符是多字节的。一个非 ascii 字符可能需要 2、3 或 4 个字节来存储。单个字符不可能填充 varchar(10) 但 3 可能可以。 (2 字节字符相当常见,但 4 字节字符很少见。)这些信息有帮助吗? 感谢@BillWeiner 的正确轨道。你是对的。

以上是关于AWS Redshift 查询过长异常的主要内容,如果未能解决你的问题,请参考以下文章

Redshift 终止长时间运行的查询

我可以使用 AWS Glue 将 S3 上的 json 数据转换为列格式并将其推送到 Redshift 吗?

AWS Redshift SQL 中日期时间的异常日期格式(字符串)

AWS Redshift 中的查询结果大小

优化 AWS RedShift 查询

AWS Redshift SQL 使用查询结果执行另一个查询