【问题标题】:Indexes in TeradataTeradata 中的索引
【发布时间】:2017-10-13 12:50:04
【问题描述】:

如何在 TERADATA 数据库中启用/禁用索引?

我想禁用索引并进行更新,然后启用 Teradata 中的索引。

如果 Teradata 中没有启用/禁用选项,从某种意义上说,我该如何实现?如果我使用 DROP Indexes,如何为所有表重新创建索引?

【问题讨论】:

  • Teradata 中的索引没有延迟更新。要重新创建索引,您只需再次运行CREATE INDEX。但是你为什么认为你需要这样做呢?
  • 不,实际上我正在使用数据屏蔽,因此我必须禁用/启用加扰索引。那你有什么解决办法吗?
  • 如果数据屏蔽意味着将列中的所有数据更新为新值你最好创建一个新表并插入/选择,这将是数量级更快(永远不要在 PI 上这样做)。否则解决方案是 DROP INDEX & CREATE INDEX

标签: teradata


【解决方案1】:

Teradata 为您提供了一种无需选择主索引即可创建表的方法(如果您确定任何列)。

您可以创建没有主索引的表。以下是如何执行此操作的示例:

Create table <table name> 
(<columnname> <datatype>,
<columnname> <datatype>) 
no primary index ;

【讨论】:

    【解决方案2】:

    Teradata 没有禁用索引功能。

    除非您指定一个,否则所有表都有一个由 RDBMS 选择的主索引 (PI)。

    CREATE INDEX <index name> (<column list>) ON table name;
    
    CREATE UNIQUE INDEX (department) ON tbl_employee;
    
    DROP INDEX ind_dept ON tbl_employee;
    
    DROP INDEX (department,emp_number) ON tbl_employee;
    

    【讨论】:

      【解决方案3】:

      Teradata 中,您不能删除Primary index of a tableprimary index 定义数据将驻留的位置以及哪个 AMP 接收该行。

      要更改表的primary index,您需要delete all 表中的记录( As data is already distributed by the row hash value of the PI) 然后只有您可以使用以下命令更改表的主索引:-

      Alter table table_name modify primary index index_name (column list);
      

      实现目标的步骤

      • 您可以使用所需索引创建一个新表( temp, wrk, intermediate table)插入原始表中的记录并更新 wrk 表。
      • 删除原表,插入wrk表数据。

      你就完成了。

      【讨论】:

        【解决方案4】:

        创建和删除索引是您在这里唯一的选择

        【讨论】:

          【解决方案5】:

          简单的答案 - 您无法在 Teradata 中禁用和重新启用索引。 但是,有一些解决方法。

          删除索引 如果您谈论 PI(主索引) - 您不能放弃它。您所能做的就是制作没有索引的表的副本。 您可以删除二级索引。然后在需要时再次创建它。

          拖放创建表格 这并不适合所有情况,但通常这是完成工作的最快方式,尤其是当您遇到的问题与 PI 有关时。

          顺便说一句:不清楚,你为什么需要这样做?性能还是逻辑还是其他?这可能会影响推荐。

          【讨论】:

          • 请记住,在 Teradata 中,每个索引基本上都是原始表的副本,在 AMP 中以不同方式分布。嗯?
          • 抱歉,这是完全错误的。 Teradata 中的表根据定义的主索引(类似于散列分区)分布在 AMP 中。当您创建二级索引时,只有索引列加上原始行的 ROWID 存储在磁盘上(在一种类似于其他 DBMS 的 BTree 中),在 NUSI 的同一 AMP 上,并由 USI 的索引列分布。创建表的副本会非常愚蠢(当然,您可以在创建基于SELECT * 的连接索引时这样做)。
          • 是的,你是对的。引用文档:“系统为所有 SI 构建子表。子表包含将 SI 值与基表中的一个或多个行相关联的索引行。”
          【解决方案6】:

          由于您没有指定要禁用/启用哪种索引,以下是您可以在任一情况下遵循的方法。

          • 主要索引
            1. 创建具有相同 PI 的新表
            2. 更新的数据插入到新表中
            3. 删除旧表 - DROP TABLE &lt;OldTable&gt;;
            4. 将新表重命名为与旧表相同。 - RENAME TABLE &lt;NewTable&gt; TO &lt;OldTable&gt;;

          主索引的上述建议仅适用于您要更新主索引列值的情况。 如果您要更新其他列(不是 PI 列),那么您可以直接发出 UPDATE 语句。

          • 二级索引
            1. 删除 SI - DROP INDEX &lt;IndexName&gt; ON &lt;TableName&gt;;
            2. 更新表数据
            3. 重新创建 SI - CREATE INDEX &lt;IndexName&gt; (&lt;ColumnList&gt;) ON &lt;TableName&gt;;

          【讨论】:

            猜你喜欢
            • 2013-08-11
            • 2016-07-07
            • 2017-12-19
            • 1970-01-01
            • 2018-04-11
            • 1970-01-01
            • 1970-01-01
            • 2013-07-13
            • 1970-01-01
            相关资源
            最近更新 更多