Sql server 具有群集GUID PKs的SQL Server数据库-切换群集索引还是切换到顺序(comb)GUID?
我们有一个数据库,其中所有的PK都是GUID,大多数PK也是表的聚集索引。我们知道这是不好的(由于guid的随机性)。因此,这里似乎基本上有两种选择(除了把guid作为PKs一起扔掉,这是我们无法做到的(至少现在不行))Sql server 具有群集GUID PKs的SQL Server数据库-切换群集索引还是切换到顺序(comb)GUID?,sql-server,guid,uniqueidentifier,clustered-index,Sql Server,Guid,Uniqueidentifier,Clustered Index,我们有一个数据库,其中所有的PK都是GUID,大多数PK也是表的聚集索引。我们知道这是不好的(由于guid的随机性)。因此,这里似乎基本上有两种选择(除了把guid作为PKs一起扔掉,这是我们无法做到的(至少现在不行)) 我们可以将GUID生成算法更改为NHibernate使用的算法,如中所述,或 对于使用量最大的表,我们可以更改为不同的聚集索引,例如标识列,并将“随机”guid保留为PKs 在这种情况下,是否有可能给出一般性建议 所讨论的应用程序有500多个表,其中最大的一个表目前大约有1
- 我们可以将GUID生成算法更改为NHibernate使用的算法,如中所述,或
- 对于使用量最大的表,我们可以更改为不同的聚集索引,例如标识列,并将“随机”guid保留为PKs
谢谢 我的观点很清楚:使用INT标识作为集群键。这是迄今为止最好、最优化的聚类键,因为它:
- 小的
- 稳定(永不改变)
- 独特的
- 不断增加
Marc如果您能够轻松地将guid生成更改为顺序guid生成,那么这可能是您的快速获胜选项。顺序guid将停止表上的碎片,同时保留为聚集索引。但是,顺序guid的主要缺点是,它们会变得容易猜测,这通常是不需要的,而且首先使用guid的原因是 如果您使用集群主键的标识路径,然后只使用guid列上的一个索引,那么guid索引上仍然会出现大量碎片。然而,该表不再支离破碎的事实将是一个巨大的收益
最后,我知道你说现在不能这样做,但是,如果你根本不需要使用guid作为索引,那么你就可以解决所有这些问题。谢谢你的回答。只是一个简短的评论/澄清:我不关心guid的可猜测性,只关心它们在安装过程中的唯一性。然后,只需将您的guid更改为顺序guid,如SQL Server中的NEWSEQUENTIALID(),就可以解决大多数眼前的问题。但是,不要推迟对标识进行完整的重新考虑。因此,考虑到我们选择了顺序GUID:对于在许多表中有100K行的客户来说,这样的更改会使他们受益吗?还是情况会像今天一样糟糕,因为表和索引已经充满了“随机”属性数据?一旦您重建索引,情况就会改善,并且将使用顺序guid进行后续插入。看见