gpt4 book ai didi

sql - B 树、数据库、顺序插入与随机插入以及速度。随机就是胜利

转载 作者:行者123 更新时间:2023-12-02 16:21:54 25 4
gpt4 key购买 nike

编辑

@Remus 更正了我的测试模式。您可以在下面看到他的答案的更正版本。

我采纳了用 DECIMAL(29,0) 替换 INT 的建议,结果是:

Decimal: 2133
GUID: 1836

即使行稍微大一些,随机插入仍然获胜。

尽管解释表明随机插入比顺序插入慢,但这些基准测试表明它们显然更快。我得到的解释与基准不一致。因此,我的问题仍然集中在 b 树、顺序插入和速度上。

...

根据经验,我知道当数据按顺序添加到 B 树时(无论方向如何),B 树的性能很差。然而,当数据随机添加时,可以获得最佳性能。

这很容易用 RB 树之类的东西来演示。顺序写入会导致执行最大数量的树平衡。

我知道很少有数据库使用二叉树,而是使用n阶平衡树。从逻辑上讲,我假设它们在顺序输入方面遭受与二叉树类似的命运。

这激发了我的好奇心。

如果是这样,则可以推断写入顺序 ID(例如在 IDENTITY(1,1) 中)将导致树发生多次重新平衡。我见过许多帖子反对 GUID,因为“这些会导致随机写入”。我从不使用 GUID,但令我震惊的是,这个“坏”点实际上是一个点。

所以我决定测试一下。这是我的代码:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[T1](
[ID] [int] NOT NULL
CONSTRAINT [T1_1] PRIMARY KEY CLUSTERED ([ID] ASC)
)
GO

CREATE TABLE [dbo].[T2](
[ID] [uniqueidentifier] NOT NULL
CONSTRAINT [T2_1] PRIMARY KEY CLUSTERED ([ID] ASC)
)

GO

declare @i int, @t1 datetime, @t2 datetime, @t3 datetime, @c char(300)

set @t1 = GETDATE()
set @i = 1

while @i < 2000 begin
insert into T2 values (NEWID(), @c)
set @i = @i + 1
end

set @t2 = GETDATE()
WAITFOR delay '0:0:10'
set @t3 = GETDATE()
set @i = 1

while @i < 2000 begin
insert into T1 values (@i, @c)
set @i = @i + 1
end

select DATEDIFF(ms, @t1, @t2) AS [Int], DATEDIFF(ms, @t3, getdate()) AS [GUID]

drop table T1
drop table T2

请注意,我不会减去任何创建 GUID 的时间,也不会减去相当多的额外行大小的时间。在我的机器上的结果如下:

中断:17,340 毫秒GUID:6,746 毫秒

这意味着在此测试中,随机插入 16 字节顺序插入 4 字节几乎快 3 倍。 p>

有人想对此发表评论吗?

诗。我知道这不是一个问题。这是一个讨论邀请,与学习最佳编程相关。

最佳答案

翻转操作,int更快..你考虑过日志和数据文件的增长吗?分别运行每个

declare @i int, @t1 datetime, @t2 datetime

set @t1 = GETDATE()
set @i = 1

while @i < 10000 begin
insert into T2 values (NEWID())
set @i = @i + 1
END


set @t2 = GETDATE()
set @i = 1

while @i < 10000 begin
insert into T1 values (@i)
set @i = @i + 1
end



select DATEDIFF(ms, @t1, @t2) AS [UID], DATEDIFF(ms, @t2, getdate()) AS [Int]

UUID 的问题是当在它们上进行集群而不使用 NEWSEQUENTIALID() 时,它们会导致分页和表碎片

现在尝试这样,你会发现它几乎是一样的

declare @i int, @t1 datetime, @t2 datetime

set @t1 = GETDATE()
set @i = 1

while @i < 10000 begin
insert into T2 values (NEWID())
set @i = @i + 1
END
select DATEDIFF(ms, @t1, getdate())

set @t1 = GETDATE()
set @i = 1

while @i < 10000 begin
insert into T1 values (@i)
set @i = @i + 1
end



select DATEDIFF(ms, @t1, getdate())

反过来

declare @i int, @t1 datetime, @t2 datetime



set @t1 = GETDATE()
set @i = 1

while @i < 10000 begin
insert into T1 values (@i)
set @i = @i + 1
end

set @t1 = GETDATE()
set @i = 1

while @i < 10000 begin
insert into T2 values (NEWID())
set @i = @i + 1
END
select DATEDIFF(ms, @t1, getdate())

关于sql - B 树、数据库、顺序插入与随机插入以及速度。随机就是胜利,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4598094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com