Sql server 表中具有VARBINARY(MAX)列的标识列上的PK索引碎片

Sql server 表中具有VARBINARY(MAX)列的标识列上的PK索引碎片,sql-server,primary-key,varbinarymax,large-data,Sql Server,Primary Key,Varbinarymax,Large Data,我有一些表(表a和表B),其中包含一个BIGINT,标识规范作为主键。 在这些表中,我有2个VARBINARY(MAX)列。更新和删除非常罕见 它们的行数几乎相同,表B的行数略少,但VARBINARY(MAX)列中的数据却显著增多 我惊讶地发现表B中PK使用的存储空间远远高于表A中PK使用的存储空间。 做一些阅读,纠正我,如果我错了,在这个问题上澄清,这是有一些事情与最大行大小约8k。因此,有一些分页正在进行,其中包含一个字节引用,然后将其包含在索引中。因此表B中PK使用了更大的存储空间。它约占

我有一些表(表a和表B),其中包含一个BIGINT,标识规范作为主键。 在这些表中,我有2个VARBINARY(MAX)列。更新和删除非常罕见

它们的行数几乎相同,表B的行数略少,但VARBINARY(MAX)列中的数据却显著增多

我惊讶地发现表B中PK使用的存储空间远远高于表A中PK使用的存储空间。 做一些阅读,纠正我,如果我错了,在这个问题上澄清,这是有一些事情与最大行大小约8k。因此,有一些分页正在进行,其中包含一个字节引用,然后将其包含在索引中。因此表B中PK使用了更大的存储空间。它约占DB总大小的30%。 我认为只有BIGINT是索引的一部分

我的问题是,是否有解决办法?是否有任何设计、技术或黑客可以防止这种情况

问候


Vilma

PK是一个聚集索引:数据与密钥一起存储。每个表只能有一个聚集索引,因为数据只能存储在一个位置。因此,任何聚集索引(如PK)都将比非聚集索引占用更多的空间

如果B中有更多的varbinary表,那么我希望PK会占用更多的空间

然而,由于这个varbinary是(MAX),那么最初的想法是只有数据指针应该与键一起存储。但是,如果行足够小(即<8000字节),我认为SQL Server会通过使用键保留数据来优化存储/检索,从而增加索引的大小。我不知道这种情况会发生,但我找不到任何可以说它不会发生的事情;因为优化似乎是合理的


不管它值多少钱

主键是一个聚集索引:数据与键一起存储。每个表只能有一个聚集索引,因为数据只能存储在一个位置。因此,任何聚集索引(如PK)都将比非聚集索引占用更多的空间

如果B中有更多的varbinary表,那么我希望PK会占用更多的空间

然而,由于这个varbinary是(MAX),那么最初的想法是只有数据指针应该与键一起存储。但是,如果行足够小(即<8000字节),我认为SQL Server会通过使用键保留数据来优化存储/检索,从而增加索引的大小。我不知道这种情况会发生,但我找不到任何可以说它不会发生的事情;因为优化似乎是合理的


不管它值多少钱

我明白了。因此,假设在这种情况下,VARBINARY(MAX)数据嵌入到PK聚集索引中。那是多余的吗?我猜测在某些情况下(当varbinary足够短时),它将与索引一起存储,是的;当它变得足够长以至于不可能时,它被分流到存储大数据的地方,并在索引中替换为指向大数据存储的指针。我明白了。因此,假设在这种情况下,VARBINARY(MAX)数据嵌入到PK聚集索引中。那是多余的吗?我猜测在某些情况下(当varbinary足够短时),它将与索引一起存储,是的;当它变得足够长以至于不可能时,它被分流到存储大数据的地方,并在索引中替换为指向大数据存储的指针。