Teradata的索引

时间:2016-01-21 07:58:36

标签: teradata

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

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

如果启用/禁用选项在Teradata中不可用,那么我该如何实现?如果我使用DROP索引,如何重新创建所有表的索引?

6 个答案:

答案 0 :(得分:2)

Teradata为您提供了一种在不选择主索引的情况下创建表的方法(如果您确定任何列)。

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

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

答案 1 :(得分:1)

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;

答案 2 :(得分:1)

primary index中,您无法删除primary indexdelete all定义数据将驻留的位置以及哪个AMP接收该行。

要更改表格( 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) 中的记录,然后才能更改表的主索引使用以下命令: -

import static org.junit.Assert.*;
import java.io.UnsupportedEncodingException;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
import org.junit.Test;

public class test {

  @Test
  public void java_functions_currying() throws UnsupportedEncodingException {
    A a = new A(1);
    Double[] b = {2d};
    Double[] c = {3d};
    Double[] d = {4d};
    double res = B.g(a::f, b, c, d);
    double res1 = B.g1(a::f1, b, c, d);

    assertEquals(5, res, .01d);
    assertEquals(5, res1, .01d);
  }

  public class A {
    private double a;

    public A(double a) {
      this.a = a;
    }

    // f has type Function<Double[], BiConsumer<Double[], Double[]>>
    // Function<T, R> where 
    // T = Double[]
    // R = BiConsumer<Double[], Double[]>
    public BiConsumer<Double[], Double[]> f(Double[] b) {
      return (c, d) -> d[0] = a * (b[0] + c[0]);
    }

    // f1 has type Function<Double[], Function<Double[], Consumer<Double[]>>>
    // Function<T, R> where 
    // T = Double[]
    // R = Function<Double[], Consumer<Double[]>>
    public Function<Double[], Consumer<Double[]>> f1(Double[] b) {
      return c -> d -> d[0] = a * (b[0] + c[0]);
    }

  }

  public static class B {
    public static double g(Function<Double[], BiConsumer<Double[], Double[]>> funct, Double[] b, Double[] c, Double[] d) {
      funct.apply(b).accept(c, d);
      return d[0];
    }

    public static double g1(Function<Double[], Function<Double[], Consumer<Double[]>>> funct, Double[] b, Double[] c, Double[] d) {
      funct.apply(b).apply(c).accept(d);
      return d[0];
    }
  }
}

实现目标的步骤

  • 您可以创建一个包含所需索引的新表 BiFunction<T, U, R> <=> Function<T Function<U, R>> BiConsumer<T, U> <=> Function<T, Consumer<U> TriFunction<S, T, U, R> <=> Function<S, Function<T, Function<T, R>>> TriConsumer<S, T, U> <=> Function<S, Function<T, Consumer<U>>> 插入原始表中的记录并更新wrk表。
  • 删除原始表并插入wrk表数据。

你已经完成了。

答案 3 :(得分:0)

创建&amp; Drop index是你在这里唯一的选择

答案 4 :(得分:0)

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

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

Drop-Create Table 这并不适合所有情况,但通常这是完成工作的最快方式,特别是如果您遇到的问题是PI。

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

答案 5 :(得分:0)

由于您没有指定要禁用/启用的索引类型,因此以下是您可以遵循的方法。

  • 主要指数
    1. 使用相同的PI
    2. 创建新表
    3. 更新数据插入新表格
    4. 删除旧表 - DROP TABLE <OldTable>;
    5. 重新命名与旧表相同的新表。 - RENAME TABLE <NewTable> TO <OldTable>;

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

  • 次级指数
    1. DROP SI - DROP INDEX <IndexName> ON <TableName>;
    2. 更新表格数据
    3. 重新开始SI - CREATE INDEX <IndexName> (<ColumnList>) ON <TableName>;