Amazon web services AWS红移查询太长异常
一直在尝试在AWS Redshift(类型:RA3.4xlagle)中运行合并查询,其中查询长度约为6k个字符(我知道,非常大!!) 现在,此查询失败,错误如下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
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提供正确的信息。你是对的。