这是我的代码。该表实际上还有20个列,但我只是展示了前几个:
eig
从我记得我读过
Fragmentation and GUID clustered key
最好有一个主键的GUID,但现在已经建议它不是一个好主意,因为必须为每个插入重新排序数据 - 导致碎片。 / p>
任何人都可以对此发表评论。现在我的表已经创建了有没有办法对它进行分类?另外,我怎么能阻止这个问题变得更糟。我可以修改现有的表添加NEWSEQUENTIALID吗?
答案 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]。