Amazon web services AWS红移查询太长异常

Amazon web services AWS红移查询太长异常,amazon-web-services,amazon-redshift,Amazon Web Services,Amazon Redshift,一直在尝试在AWS Redshift(类型:RA3.4xlagle)中运行合并查询,其中查询长度约为6k个字符(我知道,非常大!!) 现在,此查询失败,错误如下 psycopg2.errors.InternalError_: Value too long for character type DETAIL: ----------------------------------------------- error: Value too long for character type

一直在尝试在AWS Redshift(类型:RA3.4xlagle)中运行合并查询,其中查询长度约为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
表记录集群上运行的每个查询,这在
querytext
列上有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                     |

因此,这里的问题是(除了减少查询长度外),是否有任何工作可以解决这种情况?还是我把这整件事都推错了?

你的分析偏离了正轨——我已经处理过许多大小超过4K的红移查询(不幸的是)。除非他们在最近发布的版本中破坏了某些东西,否则这不是你的问题

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

现在,您的错误指向一个varchar(1),一个字节大小的varchar,作为问题的来源。我将查看您的查询和表,以查找varchar(1)大小的列,并查看它们中的内容。您可能需要了解插入的字符串的长度以及找到解决方案的原因

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

  • length()-以字符为单位查找字符串的长度
  • octet_length()-查找字符串的长度(以字节为单位)

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

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

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

现在,您的错误指向一个varchar(1),一个字节大小的varchar,作为问题的来源。我将查看您的查询和表,以查找varchar(1)大小的列,并查看它们中的内容。您可能需要了解插入的字符串的长度以及找到解决方案的原因

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

  • length()-以字符为单位查找字符串的长度
  • octet_length()-查找字符串的长度(以字节为单位)

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

谢谢比尔。让我进一步研究一下基本查询。“我会回复您的。@比尔很好奇,在红移中,数据类型部分有数据的大小(例如:
name varchar(10)-name列最多可以容纳10个字节
),那么如何才能插入超过
1个字节的数据(根据问题)以及在选择数据时给出的错误?一个varchar(10)最多可容纳10个ascii字符,但较少的字符是多字节字符。非ascii字符可能需要存储2、3或4个字节。一个字符无法填充一个varchar(10),但3个字符可能可以。(2字节字符相当常见,但4字节字符很少。)这些信息有用吗?感谢@BillWeiner提供正确的信息。你说得对,谢谢你,比尔。让我进一步研究一下基本查询。“我会回复您的。@比尔很好奇,在红移中,数据类型部分有数据的大小(例如:
name varchar(10)-name列最多可以容纳10个字节
),那么如何才能插入超过
1个字节的数据(根据问题)以及在选择数据时给出的错误?一个varchar(10)最多可容纳10个ascii字符,但较少的字符是多字节字符。非ascii字符可能需要存储2、3或4个字节。一个字符无法填充一个varchar(10),但3个字符可能可以。(2字节字符相当常见,但4字节字符很少。)这些信息有用吗?感谢@BillWeiner提供正确的信息。你是对的。