Sql server SQL Server“;“写一次”;表聚集索引

Sql server SQL Server“;“写一次”;表聚集索引,sql-server,clustered-index,Sql Server,Clustered Index,我在SQL Server数据库中有一个非常独特的表,它不遵循“典型”的使用约定,我正在寻找一些关于聚集索引的建议 这是一个虚构的例子,但与真实数据非常接近 该表有一个3列主键,它实际上是其他表的外键,还有一个包含相关数据的第四个字段。对于本例,假设该表如下所示: CREATE TABLE [dbo].[WordCountsForPage]( [AuthorID] [int] NOT NULL, [BookID] [int] NOT NULL, [PageNumber] [int] NOT

我在SQL Server数据库中有一个非常独特的表,它不遵循“典型”的使用约定,我正在寻找一些关于聚集索引的建议

这是一个虚构的例子,但与真实数据非常接近

该表有一个3列主键,它实际上是其他表的外键,还有一个包含相关数据的第四个字段。对于本例,假设该表如下所示:

CREATE TABLE [dbo].[WordCountsForPage](
 [AuthorID] [int] NOT NULL,
 [BookID] [int] NOT NULL,
 [PageNumber] [int] NOT NULL,
 [WordCount] [int] NOT NULL
)
所以,我们有一个层次主键,唯一的数据是第四个字段

在实际应用程序中,总共有28亿条可能的记录,但仅此而已。这些记录是随着时间的推移计算数据而动态创建的,实际上可能只有这些记录的1/4会被实际计算。它们存储在DB中,因为计算是一个昂贵的操作,我们只想为每个唯一的组合执行一次

今天,数据每分钟被读取数千次,但(至少现在)随着表的填充,每分钟也有数百次插入(这将持续相当长的一段时间)。我要说的是(今天)每插入一页有10读

我想知道我们是否因为聚集索引而对所有这些插入的性能造成了影响

聚集索引“长期”是有意义的,因为表最终将成为只读的,但这需要一些时间

我想我可以在大量插入期间将索引设置为非聚集索引,并在填充表时将其更改为聚集索引,但您如何确定何时会出现交叉点(以及我如何在将来通知自己“时间到了”)

我真正需要的是一个可转换指数,它在未来的某个神奇时刻从非聚集指数过渡到聚集指数


关于如何处理这个问题,有什么建议吗?

事实上,我不会先尝试使用非聚集索引,然后再将其转换为聚集索引(这本身就是一件非常麻烦的事情!)

正如索引女王金伯利·特里普(Kimberly Tripp)在她的文章中解释的那样,在表上拥有聚集索引实际上可以提高插入性能

与堆相比,在集群表中(但仅在“右”集群表中)插入速度更快。这里的主要问题是,在IAM/PFS中查找以确定堆中的插入位置比在集群表中查找要慢(其中插入位置已知,由集群键定义)。插入到定义了顺序(CL)且顺序不断增加的表中时,插入速度更快

堆是一个没有定义聚集索引的表


考虑到这一点,以及从堆到具有聚集索引的表所需的工作量和麻烦,我甚至不会费心。只需定义索引,然后开始使用该表

谢谢你,马克。是的,我在这里提问之前确实读过那篇文章。问题在于该指数并没有“不断上升”。进入表格的数据没有顺序。嘿,marc_。我感谢你的答复。无论哪种方式,我都没有真正的性能问题,所以我接受你的回答,认为这是最好的(眨眼)。谢谢