【问题标题】:AWS Redshift Query too long exceptionAWS Redshift 查询过长异常
【发布时间】: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                     |

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

【问题讨论】:

    标签: amazon-web-services amazon-redshift


    【解决方案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 的正确轨道。你是对的。
    猜你喜欢
    • 2021-08-19
    • 1970-01-01
    • 2017-09-21
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2016-09-12
    • 1970-01-01
    相关资源
    最近更新 更多