SQL Server - 在这里使用复合主键的任何优势?

时间:2014-09-13 09:13:12

标签: sql sql-server database

以下是我的表

Rate表:

rate_id   start_date   end_date     rate1   rate2  rate3
---------------------------------------------------------
  1       2014-08-24   2014-08-28     50     40      30
  4       2014-08-28   2014-08-23     45     36      46
  1       2014-08-29   2014-08-31     60     45      66

rate_id是外键。

此表上的大部分搜索查询如下所示

select * 
from Rate 
where rate_id = 1 
  and start_date between 'xxx' and 'yyy'

rate_idstart_date的组合是唯一的。

  1. 我可以在(rate_id, start_date)上创建复合主键吗?它有用吗?
  2. 或者我是否需要在3列上创建非聚集索引?

2 个答案:

答案 0 :(得分:2)

是的,按顺序在这两列上的复合聚簇主键对于该查询非常有用。

它允许在覆盖索引上使用简单范围搜索。要声明为主键,列必须都不可为空,组合必须是唯一的,但我认为是这种情况。

rate1,rate2,rate3虽然看起来很可疑,但可能表示你的表格不是第一种正常形式。

答案 1 :(得分:1)

主键的选择不应取决于您的工作负载。主键是一个元组,它在行集中使行唯一。

就性能优化而言,它取决于您的查询工作量.IF您使用的是rate_id&在大多数查询中都是start_date。然后在索引中使用这两列是有意义的。否则你应该只有rate_id。

在您的情况下,您的过滤谓词同时使用rate_id和amp;在大多数查询中都是start_date,因此你应该将rate_id + start_date作为复合主键。它将为你保存索引存储空间并且具有更少的更新/插入成本。因为sql只需要更新一个索引(复合键)而不是2个索引。