【问题标题】:How to create an Index in Amazon Redshift如何在 Amazon Redshift 中创建索引
【发布时间】:2015-11-12 07:40:29
【问题描述】:

我正在尝试在 Amazon Redshift 中创建索引,但收到错误消息

create index on session_log(UserId);

UserId 是一个整数字段。

【问题讨论】:

    标签: sql amazon-web-services indexing amazon-redshift


    【解决方案1】:

    如果您尝试在 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");
    

    您可能想阅读一些入门书likethese

    【讨论】:

    • 破碎:“像这些”
    • @Faiz 谢谢 - 我已经更新了,虽然对于那些习惯于更传统的 Sql 数据库的人来说,我真的无法在 AWS 上找到一个好的“思维转变”参考。
    【解决方案2】:

    您可以Define Constraints,但仅供参考,正如亚马逊所说:它们不受 Amazon Redshift 强制执行。尽管如此,主键和外键被用作计划提示,如果您的 ETL 流程或应用程序中的其他流程强制执行它们的完整性,则应声明它们。

    某些服务,例如具有插入模式 (REPLACE_EXISTING) 的管道,需要在您的表中定义一个主键。

    出于其他性能目的,Stuart 的回答是正确的。

    【讨论】:

      【解决方案3】:

      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/

      【讨论】:

      • 该问题专门要求创建“索引”而不是“主键”。
      猜你喜欢
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2017-10-01
      • 2019-07-17
      • 2014-08-17
      相关资源
      最近更新 更多