【问题标题】:Keys/indexes for revisions of user submitted text用户提交文本修订的键/索引
【发布时间】:2010-07-05 13:34:02
【问题描述】:

我有一张桌子:

id:int
revision:int
text:ntext

一般来说,我需要检索特定 id 的文本的最新修订版,或者(相当不频繁地)添加一个包含特定 id 的新修订版的新行。考虑到这一点,最好将索引放在id 和revision 列上。我在实现这个方面没有问题,但我想知道在这种情况下使用由id 和revision 组成的复合(多字段)索引/键是否明智,或者是否有其他适合我的用例的策略?

【问题讨论】:

    标签: sql sql-server-2008 indexing primary-key


    【解决方案1】:

    我认为复合索引和两个单独索引之间的性能差异不会很明显,但是,像往常一样,如果需要绝对最佳性能,我建议尝试两者并进行分析。

    您可能总是在这两个字段上进行查询,偶尔会使用明确的id 和未知的revision(当需要为id 查找最大revision 时)。如果您的复合索引是(id,revision),那么索引支持此用例。单独查询 id 而不关心 revision 也可以。

    如果您可能只在revision 上查询而不考虑id,那么您将需要两个单独的索引。

    您还需要分析任一索引对insert 性能的影响。复合索引将在两个字段上聚集,而两个单独的索引将仅在 id 上聚集。

    编辑:错别字。

    【讨论】:

      【解决方案2】:

      在大多数情况下,您将根据 id 和 revision 选择记录 - 因此,为了最快的查找,您应该将 id 和 revision 作为复合主键。

      【讨论】:

      • 当然可以,但考虑到我不会提前知道最新版本是什么,这会有什么好处吗?
      • 您的主键将被聚集在一起,这意味着数据将物理地放在磁盘上。这对于选择来说更快,因为它不必跨越整个磁盘。不过,您的插入可能会受到影响,这是一种权衡。
      【解决方案3】:

      如果 id 是主键,它已经被索引(我不使用 SqlServer) 我似乎你的修订也很独特。 所以我认为最好使用单独的索引并对修订设置唯一约束(如果需要)。

      【讨论】:

        猜你喜欢
        • 2015-11-24
        • 2010-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-19
        相关资源
        最近更新 更多