表上的索引在sql中具有重复值

时间:2013-11-29 12:40:07

标签: sql sql-server tsql

我有两张桌子

  1. 主要表格PostInfo列,如(PostIDPostSubjectPostedDateIsProcessed)。每个帖子ID的一个条目

  2. 交易表Post_Transaction

     PostID   PostComments     Post_InsertedOn               UserID
     --------------------------------------------------------------------
     10000    VRDFHFGFTR     2013-10-26 21:08:19.817          43434
     10000    GFDGDFSDFF     2013-10-26 21:12:32.323          67576
     10000    HGFHGFBNBF     2013-10-26 21:43:43.545          3232
     10000    JNFNGHFGHG     2013-10-26 21:45:46.656          768
     10000    MJHJNGJHGH     2013-10-26 21:56:32.767          9897
     10001    XCVGFDGDFG     2013-10-26 22:54:54.868          3424
     10001    YTUGFGHHGF     2013-10-26 13:32:54.132          12313
     10001    HGFHFGHGHF     2013-10-26 18:08:32.878          6565
    
  3. clustered unique index表格中的PostID列上有PostInfo

    Clustered non unique index表格PostID列上的

    Post_Transaction。这个non unique clustered index(Post_Transaction)可以有效运行多远,因为PostID表格中的每个Post_Transaction都会有50000多个条目。

    Or

    我需要在IdentID table.so中创建一个标识列(Post_Transaction),我可以在Clustered unique indexIdentID列创建Non clustered non unique indexPostID表格Post_Transaction上。

    我需要继续哪种方式,请提出建议。 : - )

1 个答案:

答案 0 :(得分:0)

仅向其上的群集添加身份可能是一个糟糕的选择。

使用非唯一的聚簇索引,Sql会为每一行(4个字节)添加一个隐藏的uniquifier,这不是一个大问题。群集密钥的选择是根据该表上的查询以及应该排序的事实来完成的,以便不根据应用程序分割太多并且在范围中检索(通常选择身份或日期)。 如果您经常在PostInsertedOn上搜索,那么它可能是一个不错的选择。 如果在PostId上完成了更多的查询,那么它最好是第一个。 我猜PostTransactions经常通过 PostId + PostInsertedOn 进行搜索,这可能是一个不错的选择(如果PostInsertedOn可以复制,则非唯一)。

但最好的方法是使用您的应用程序和查询计划的查询来检查。

另请注意,群集密钥将是作为表的查找键添加的所有其他索引的隐藏部分。