首页 > 解决方案 > 有效日期历史表的键和索引设计

问题描述

我对 SQL 数据库设计和体系结构相当陌生。我正在创建一个表来保存来自我的源系统的 6 个月的每日快照文件。可以使用以下脚本创建数据表的截断版本:

CREATE TABLE AccountHist 
(
    EffectiveDate datetime not null,
    AccountNumber bigint not null,
    Balance float not null,
    Status char(3) not null,
    IntRate real not null,
  etc......
)

EffectiveDate 和 AccountNumber 一起是唯一的,不应该重复,所以我想在表中添加一个 PK 约束,但我对它应该是 CLUSTERED 还是 NONCLUSETERD 感到困惑:

CONSTRAINT PK_AcctEffDate PRIMARY KEY (?) (EffectiveDate, AccountNumber)

我对聚集索引和非聚集索引之间的差异有一个按书本定义的理解。我觉得我应该使用集群,因为,嗯,这是我认为最常见的,但让数据按 EffectiveDate 排序也是有意义的。

让我感到困惑的是,我认为我还需要 EffectiveDate 和 AccountNumber 的非聚集索引。以下是我希望运行的 2 个常见查询:

select AccountNumber, Balance from AccountHist
where EffectiveDate = (select max(EffectiveDate) from AccountHist)
and Status = 'ACT'

select EffectiveDate, Avg(IntRate) AvgRate from AccountHist
where EffectiveDate >= '01/01/2019' and EffectiveDate < '02/01/2019'
group by EffectiveDate

这归结为三个主要问题: 1. 我可以在也构成我的 PK 的 2 列上创建单独的索引吗?如果是这样,哪个应该是集群的还是非集群的?2. 我应该使用代理键吗?3. 哪种设置将在查询和加载数据方面产生最佳性能?

谢谢。

标签: sql-serverdatabase-design

解决方案


推荐阅读