执行INSERT时,Redshift不允许您插入比表中的目标字段更长/更宽的字符串值.注意:
CREATE TEMPORARY TABLE test (col VARCHAR(5));
-- result: 'Table test created'
INSERT INTO test VALUES('abcdefghijkl');
-- result: '[Amazon](500310) Invalid operation: value too long for type character varying(5);'
Run Code Online (Sandbox Code Playgroud)
解决此问题的一种方法是转换值:
INSERT INTO test VALUES('abcdefghijkl'::VARCHAR(5));
-- result: 'INSERT INTO test successful, 1 row affected'
Run Code Online (Sandbox Code Playgroud)
令人讨厌的部分是,现在我的所有代码都必须在每个INSERT上为每个VARCHAR字段提供这些转换语句,或者应用程序代码必须在尝试构造查询之前截断字符串; 无论哪种方式,这意味着列的宽度规范必须进入应用程序代码,这很烦人.
使用Redshift有没有更好的方法?如果有一些选项可以让服务器截断字符串并执行(并可能引发警告),就像它对MySQL的做法一样.
我能做的一件事就是将这些特定字段声明为非常大的VARCHAR,甚至可能是65535(最大值).
create table analytics.testShort (a varchar(3));
create table analytics.testLong (a varchar(4096));
create table analytics.testSuperLong (a varchar(65535));
insert into analytics.testShort values('abc');
insert into analytics.testLong values('abc');
insert into analytics.testSuperLong values('abc');
-- Redshift reports the size for each …Run Code Online (Sandbox Code Playgroud) 在亚马逊的指南中,他们提到为所有表指定主键和外键,然后在有意义的地方指定分配键,例如通常用于将表连接在一起的列。我知道即使使用单个表查询,正确的 DISTKEY 规范也有助于执行 GROUP BY,但是对于 JOINing 两个或多个表,DISTKEY 列是否也必须指定为 FOREIGN KEY?或者 Redshift 是否会根据用作 DISTKEY 的列的数据类型(可能还有名称)将不同表中的行共同定位到相同节点?
我问的原因是因为我并没有在我的应用程序中真正使用维度表。我可以创建它们只是用作外键引用来帮助分配,但随后必须维护维度表。
考虑以下示例,其中我有两个经常连接的表:
CREATE TABLE motorcycles
(
id INT,
hexcolor CHAR(6)
);
CREATE TABLE helmets
(
id INT,
hexcolor CHAR(6)
);
Run Code Online (Sandbox Code Playgroud)
现在假设在我的应用程序中,我们经常将摩托车表连接到hexcolor列上的头盔表。那么使用和使用就有意义了,对吗?但是,您不能真正说摩托车表中的hexcolor列是头盔表的外键,反之亦然。我可以创建一个维度表,其中包含所有可能的十六进制颜色值的列表,然后摩托车和头盔表都可以具有此维度表的外键,但维护此维度表将是一件痛苦的事情(亚马逊的指南还警告不要指定未正确维护的主键或外键,因为它会使查询规划器感到困惑)。DISTSTYLE KEYDISTKEY (hexcolor)
那么,以我的摩托车和头盔为例,维度表的外键是否必要?或者 Redshift 是否会基于用作分配键的列的数据类型相同这一事实,假设它应该以相同的方式分配这两个表的行?
定义Redshift查询队列时,可以分配分配给每个队列的内存比例.因此,例如,如果您有5个队列,则可以为每个队列分配20%的内存.但是,您还允许分配内存,使其中的一部分保持未分配状态.
在本文档中:http: //docs.aws.amazon.com/redshift/latest/dg/cm-c-defining-query-queues.html 它说: "任何未分配的内存都由Amazon Redshift管理,可以暂时给出如果队列请求额外的内存进行处理,则为队列.例如,如果配置四个队列,则可以按如下方式分配内存:20%,30%,15%,15%.剩余的20%未分配和管理服务."
在文档的前面,它说,"如果特定查询需要的内存多于分配给单个查询槽的内存,则可以通过增加wlm_query_slot_count参数来增加可用内存.以下示例将wlm_query_slot_count设置为10,执行真空,以及然后将wlm_query_slot_count重置为1."
这与内存分配有关吗?可以使用查询插槽计数调整来暂时消耗比通常允许的整个队列更多的内存吗?
我认为我的问题实际上是关于第一个引用的这一部分,"任何未分配的内存都由Amazon Redshift管理,如果队列请求额外的内存进行处理,可以暂时将其分配给队列."
这是否意味着运行查询的用户必须专门请求额外的内存?这是否意味着除非您提出这些特定请求,否则保留一些未分配的内存是没有用的?