琐碎的任务 - 复杂的解决方案?

时间:2011-10-26 17:38:58

标签: sql cassandra large-data-volumes

有一个小问题:

  • 将uniqueidentifier分配给任何externalId
  • 一旦分配了uniqueidentifier,就不会覆盖它 - 只返回现有的uniqueidentifier

想象一个表

  ExternalId | Guid
--------------------------------
   some1     | accf-0334-dfdf-....

现在,扭曲是规模。我们希望像这样映射数十亿个externalIds,我们需要能够快速分配这些标识符(千/秒)

我们从一个简单的SQL Server表开始,但效果不佳。我们将相同的模式移动到Cassandra ColumnFamily - 写入速度超快且分片但是:在写入之前我们必须读取(以确保externalId尚未分配),因此我们再次达到读取搜索I / O限制。 / p> 遗憾的是,Hashing(以确定uniqueidentifier)是不可能的,因为我们已经分配了数亿。缓存是有问题的,因为在大多数情况下,我们正在分配一个'全新的externalId',因此根本不会在数据库中。

有人对此解决方案有任何建议吗?

2 个答案:

答案 0 :(得分:1)

使用SQL server,并像这样创建表:

  • UNIQUE 在ExternalID上的群集
  • Guid for NEWID()
  • 的默认值
  • 确保ExternalID上的唯一聚簇索引具有IGNORE_DUP_KEY = ON

在这种情况下,您始终执行相同的两个(超快速)操作:

1 - 插入ExternalID
2 - 查询GUID

ExternalID

它不允许重复,但它们不会抛出错误。由于聚集索引,它也将是一个高度优化的搜索。

您需要经常重建索引,因为随着时间的推移,您将获得高度的碎片(因为您在非增量varchar上进行聚类),但它应该满足您的其他要求。

答案 1 :(得分:0)

这是一个有趣的问题,老实说,超出了我的知识范围。但是,我发现它很有趣,偶然发现了这个链接 - http://blogs.msdn.com/b/miah/archive/2008/02/17/sql-if-exists-update-else-insert.aspx

似乎此方法会跳过初始全表扫描,这会提高性能。这不是最好的答案,但也许您可以自定义用于特定数据库实现的一般想法。 (我从来没有听说过Cassandra,所以看起来我需要做一些研究。)即使它没有,也可能会给你一些想法(我希望)。不知道你是否尝试过这样的东西,但我想我会分享这个链接。祝你好运。