【发布时间】:2015-11-12 07:40:29
【问题描述】:
我正在尝试在 Amazon Redshift 中创建索引,但收到错误消息
create index on session_log(UserId);
UserId 是一个整数字段。
【问题讨论】:
标签: sql amazon-web-services indexing amazon-redshift
我正在尝试在 Amazon Redshift 中创建索引,但收到错误消息
create index on session_log(UserId);
UserId 是一个整数字段。
【问题讨论】:
标签: sql amazon-web-services indexing amazon-redshift
如果您尝试在 Redshift 表上创建索引(带有名称):
create index IX1 on "SomeTable"("UserId");
您将收到错误消息
执行 SQL 命令时出错: 在“SomeTable”(“UserId”)上创建索引 IX1 错误:Redshift 表不支持 SQL 命令“在“SomeTable”(“UserId”) 上创建索引 IX1”。
这是因为,与其他 data warehouses 一样,Redshift 使用 columnar storage,因此其他 RDBMS 中使用的许多索引技术(如添加非聚集索引)不适用。
但是,您可以选择为每个表提供一个 sort key,您还可以使用 distribution key 来影响性能以对数据进行分片,并为每列选择适当的 compression encodings 以最小化存储和 I/ O 开销。
例如,在您的情况下,您可以选择使用UserId 作为排序键:
create table if not exists "SomeTable"
(
"UserId" int,
"Name" text
)
sortkey("UserId");
【讨论】:
您可以Define Constraints,但仅供参考,正如亚马逊所说:它们不受 Amazon Redshift 强制执行。尽管如此,主键和外键被用作计划提示,如果您的 ETL 流程或应用程序中的其他流程强制执行它们的完整性,则应声明它们。
某些服务,例如具有插入模式 (REPLACE_EXISTING) 的管道,需要在您的表中定义一个主键。
出于其他性能目的,Stuart 的回答是正确的。
【讨论】:
Redshift 允许创建主键
create table user (
id int ,
phone_number int,
primary key(id))
但由于 Redshift 不强制执行此约束,因此主键接受重复值。
关于该问题的附加文章
http://www.sqlhaven.com/amazon-redshift-what-you-need-to-think-before-defining-primary-key/
【讨论】: