我有一个GUID Clustered主键 - 有没有办法可以优化或分割可能碎片化的表?

时间:2017-12-26 00:02:43

标签: sql sql-server

这是我的代码。该表实际上还有20个列,但我只是展示了前几个:

eig

从我记得我读过

Fragmentation and GUID clustered key

最好有一个主键的GUID,但现在已经建议它不是一个好主意,因为必须为每个插入重新排序数据 - 导致碎片。 / p>

任何人都可以对此发表评论。现在我的表已经创建了有没有办法对它进行分类?另外,我怎么能阻止这个问题变得更糟。我可以修改现有的表添加NEWSEQUENTIALID吗?

2 个答案:

答案 0 :(得分:1)

看起来这是重复的: INT vs Unique-Identifier for ID field in database

但这是你的问题的重复:

而不是guid并且取决于你的表深度,int或big int将是更好的选择,无论是存储还是优化优势。您也可以考虑将字段定义为" int identity not null"进一步帮助人口。

GUID因其长度而具有相当大的存储影响。

CREATE TABLE [dbo].[Phrase]
(
    [PhraseId] [int] identity NOT NULL 
          CONSTRAINT [PK_Phrase_PhraseId] PRIMARY KEY,
    [PhraseNum] [int] NULL
    [English] [nvarchar](250) NOT NULL,
....
) ON [PRIMARY]
GO

答案 1 :(得分:1)

多数是真的,NEWSEQUENTIALID有助于完全填充数据和索引页面。

但是NEWSEQUENTIALID datasize是4 times而不是int。所以要求的页数比int要多4倍。

declare @t table(col int 
,col2  uniqueidentifier DEFAULT NEWSEQUENTIALID())
insert into @t (col) values(1),(2)

select DATALENGTH(col2),DATALENGTH(col) from @t

假设int要保存100行,则需要x数据页 如果是NEWSEQUENTIALID 4x,则需要保留100 rows数据页。 因此,查询将读取更多页面以获取相同数量的记录。

所以,如果你可以改变表,那么你可以添加int identity列并使其成为PK + CI。你可以根据你的要求或需要删除[uniqueidentifier]。