2016-07-07 58 views
1

我们创建了ID列具有数据类型标识的Vertica表。从Vertica的标识到标识(1,1,1)的ALTER数据类型

问题是每次会话关闭或表截断ID值跳转到250000,500000等等(vertica中的缓存默认为250000)。我明白,如果我们将缓存更改为1,这不会是一个问题。

所以我的问题是我们如何改变列以将数据类型从身份更改为身份(1,1,1)?或者正在创建一个新表并将数据加载到我拥有的唯一选项?

有什么方法重新生成标识列?

回答

1

在我告诉你如何做到这一点之后,请仔细阅读警告。这非常重要。我会为演讲提前道歉。

您不能在更新版本的Vertica中修改IDENTITYAUTO_INCREMENT列......至少不能直接修改。但是,您可以通过更改引擎盖下生成的序列来解决您的问题。

要找到您的序列:

SELECT * FROM SEQUENCES 
WHERE identity_table_name = 'mytable'; 

那么你应该查找对应于您的身份字段(如果您重命名您的列,但名称可能不匹配)自动生成的序列。

从那里你可以改变它并改变缓存值。

ALTER SEQUENCE mytable_id_seq CACHE 1000; 

您也可以重新启动值(如截断后)。

ALTER SEQUENCE mytable_id_seq RESTART WITH 1; 

您必须重新启动已经使用这些序列使更改生效的任何会议。一旦缓存被拉出,该缓存仍然是会话的一部分。

这就是说,我觉得在Vertica中提及一些关于序列的东西非常重要。序列缓存非常重要。来自序列的每个未缓存的拉是全局编录锁。如果过于频繁,这将阻止群集上发生的某些非常重要的操作。

作为一个例子,假设您将缓存设置为1,然后在一堆时间内进行插入/选择。你只是反复锁定你的全局编录。孤立起来,你可能甚至没有注意到这一点,但是在一个繁忙的集群上工作很多,你绝对会这样做。

另一个例子是糟糕的会话处理。比方说,我做了一些像登录一样疯狂的事情,插入一行并注销(从不了解单行插入通常对Vertica不利的事实)。不管你拥有多少缓存,你仍然会重复支付该目录锁。

因此,如果您在Vertica中使用它们,请注意如何计划使用序列。另一种替代方法是使用UUID(Vertica中不提供),使用HASH(),使用自然键访问数据,或在数据到达Vertica之前使用它们生成它们。

除非您每隔一段时间才真正插入一行,否则请勿这样做。

另一个需要提及的重要的事情是,你应该不使用序列作为排序的一种形式。这对于任何数据库来说都是最佳实践,而且确实如此。首先,如果你并行加载,由于使用了缓存块(并且没有缓存,你可以因为我提到的原因而忽略任何类型的性能,除了通过并行序列拉动大大加剧)之外,它并不具有代表性。其次,这就是时间戳的用途。你甚至可以默认这个。

对此的一个必然结果是,在使用序列时总是期望有空位。有太多的情况会导致序列差距。几乎所有的数据库都是如此。我可能是错的,但我不相信任何数据库在事务回滚时回滚序列拉。

+0

因此,没有直接的方式重新设置/重置Vertica中的IDENTITY列?即使使用SEQUENCES,'RESTART WITH 1'也仅在我将所述序列的缓存限制为1时才起作用。 – NitheshKHP

+0

当然,您可以重新启动。以上相同的过程应该工作。如果您将缓存设置为1,我并不真正遵循唯一的工作方式。它会将它重置为你所告诉的任何内容,但缓存值总是会在每次会话的每次拉取时拉出很多序列号。 – woot

+0

我可能会过多地将注意力集中在缓存上,而不是1部分。如果你正在寻找的是重置它截断,一切手段......重新启动。但缓存仍然会创建大的差距,并出于上述所有原因,我不会将缓存设置为1. – woot