我们已经使用ID列创建了具有数据类型Identity的vertica表。
问题是每次会话关闭或表截断ID值跳转到250000,依此类推500000(缓存在vertica中默认为250000)。我知道如果我们将缓存更改为1,这不是问题。
所以我的问题是我们如何改变列以将数据类型从标识更改为标识(1,1,1)?或者是创建一个新表并加载数据我唯一的选择?
有没有办法重新种植Identity列?
答案 0 :(得分:1)
请在告诉您如何操作后阅读警告。这非常重要。我会提前为讲座道歉。
您无法在最新版本的Vertica中修改IDENTITY
或AUTO_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之前生成它们。
除非您经常只是经常插入一行,否则不要这样做。
另一个值得一提的重要事项是,你真的不应该使用序列作为一种排序形式。这更像是一种最佳实践,对任何数据库都是如此。首先,如果你并行加载,它将不具有代表性,因为使用了缓存块(并且没有缓存,你可以忘记任何类型的性能,因为我提到的原因除了通过执行并行序列拉动而大大加剧)。其次,那是什么时间戳。你甚至可以默认这个。
这样做的必然结果是,在使用序列时总是会出现间隙。有太多情况导致序列缺口。几乎任何数据库都是如此。我可能是错的,但我不相信任何数据库都会回滚事务回滚上的序列拉动。