sql-server - 有效日期历史表的键和索引设计
问题描述
我对 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. 哪种设置将在查询和加载数据方面产生最佳性能?
谢谢。
解决方案
推荐阅读
- android - 如何使用 ARCore Android SDK 在 SceneViewer 上加载我的 glTF 文件
- angular - 如何在组件中注册管道而不是角度的模块?
- google-diff-match-patch - 如何在 google / diff-match-patch C# 中实现 Word Level
- gtkmm - 在运行时使用拖放重新定位小部件
- javascript - 使用 reactjs 对 html dom 中的元素进行条件渲染时,输入字段值不会改变
- vb.net - 关于 FontStyle 和 ControlText 的 Visual Studio 2019 错误
- python - 使用 pySpark 比较两个大型数据帧
- python - 替换字符串并忽略大小写 Python
- elasticsearch - ElasticSearch 简单查询
- rust - 将东西(移动)放入结构中会产生生命周期错误