如何在TERADATA数据库中启用/禁用索引?
我想禁用索引并执行更新,然后在Teradata中启用索引。
如果启用/禁用选项在Teradata中不可用,那么我该如何实现?如果我使用DROP索引,如何重新创建所有表的索引?
答案 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 index
。 delete 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表。你已经完成了。
答案 3 :(得分:0)
创建&amp; Drop index是你在这里唯一的选择
答案 4 :(得分:0)
简单回答 - 您无法在Teradata中禁用和重新启用索引。 但是,有一些解决方法。
删除索引 如果你在谈论PI(主要索引) - 你不能放弃它。您所能做的就是制作一个没有索引的表的副本。 您可以删除二级索引。然后在需要时再次创建它。
Drop-Create Table 这并不适合所有情况,但通常这是完成工作的最快方式,特别是如果您遇到的问题是PI。
顺便说一下:目前尚不清楚,你为什么要这样做?性能或逻辑还是其他什么?这可能会影响推荐。答案 5 :(得分:0)
由于您没有指定要禁用/启用的索引类型,因此以下是您可以遵循的方法。
DROP TABLE <OldTable>;
RENAME TABLE <NewTable> TO <OldTable>;
主要索引的建议仅适用于您要更新主索引列值的情况。 如果您要更新其他列(不是PI列),那么您可以直接发布UPDATE语句。
DROP INDEX <IndexName> ON <TableName>;
CREATE INDEX <IndexName> (<ColumnList>) ON <TableName>;