2016-01-21 99 views
1

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

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

如果启用/禁用选项在Teradata中不可用,则从中可以实现此目的?如果我使用DROP索引,我如何重新创建所有表的索引?

+0

毫无延迟更新到Teradata的索引。要重新创建索引,只需再次运行“CREATE INDEX”。但你为什么认为你需要这样做? – dnoeth

+0

不,其实我正在数据屏蔽下工作,所以我必须禁用/启用争夺索引。那么你有什么解决方案吗? –

+1

如果*数据屏蔽*意味着*将列中的所有数据更新为新值*您最好创建一个新表格并插入/选择,这将更快(并且从不在PI上)。否则解决方案是DROP INDEX&CREATE INDEX – dnoeth

回答

1

Teradata没有禁用索引功能。

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

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; 
0

创建& DROP INDEX是唯一的选择,你在这里

1

Teradata不能删除Primary index of a tableprimary index定义数据将驻留在哪里以及哪个AMP接收该行。

要改变,你需要使用下面的命令从表delete all记录(As data is already distributed by the row hash value of the PI)那么只有你可以改变一个表的主索引的表的primary index: -

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

步骤来实现你的目标

  • 您可以用箱子您所需的指数(temp, wrk, intermediate table)新表中插入REC从原始表中选择ords并更新wrk表。
  • 删除原始表并插入wrk表数据。

然后你就完成了。

2

Teradata为您提供了一种创建表格的方式,无需选择主索引(如果您确信任何列)。

您可以创建没有主索引的表格。这里是一个示例:

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

只是另一个小的格式化修补程序,与今天早些时候类似。除此之外:+1 ......欢迎来到upvoting之地。但是,在上下投票时,要小心你遇到的任何问题或答案......祝你好运! –

0

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

删除指数 如果您在谈论PI(主索引) - 您不能删除它。你所能做的就是复制一张没有索引的表格。 尽管可以删除二级索引。然后,只需在需要时重新创建它。

落创建表 这并不适合所有的情况,但通常这是做好工作的最快方法,特别是如果你有问题是与PI。

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

+0

*请记住,在Teradata中,每个索引基本上都是原始表的副本,它们在不同AMP之间的分布不同。 – dnoeth

+0

对不起,但那是完全错误的。 Teradata中的表根据定义的主索引(类似于散列分区)分布在各个AMP中。在创建辅助索引时,只有索引列加上原始行的ROWID存储在磁盘上(类似于其他DBMS),存储在NUSI的同一个AMP中,并由USI的索引列分配。创建表的副本会非常愚蠢(当然,当你创建一个基于'SELECT *'的连接索引时,你可以做到这一点)。 – dnoeth

+0

是的,你是对的。文档引用:“系统为所有SI构建子表,子表包含将SI值与基表中的一行或多行相关联的索引行。” – Alex

0

由于您没有指定要禁用/启用哪种类型的索引,因此下面是您可以在任一情况下执行的方法。

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

以上为主要指标的建议,如果你要更新主索引列的值才适用。 如果您要更新其他列(而不是PI列),那么您可以直接发布UPDATE语句。

  • 二级索引
    1. 降SI - DROP INDEX <IndexName> ON <TableName>;
    2. 更新表数据
    3. 重建SI - CREATE INDEX <IndexName> (<ColumnList>) ON <TableName>;