gpt4 book ai didi

sql-server - 比较 IDENTITY 列的 INT 与 BIGINT 时出现意外的性能结果

转载 作者:行者123 更新时间:2023-12-03 03:29:37 25 4
gpt4 key购买 nike

我被要求使用 SQL Server 2008 执行性能测试。作为测试的一部分,我使用 INT 和 BIGINT 比较 IDENTITY 列作为 PK 的速度。我有一个简单的例程,为每种类型创建 100,000 行并计算插入速度。该脚本如下所示:

SET NOCOUNT ON

CREATE TABLE TestData
(
PK INT IDENTITY PRIMARY KEY,
Dummy INT
)

DECLARE @Rows INT
DECLARE @Start DATETIME

SET @Rows = 100000
SET @Start = GETDATE()

WHILE @Rows > 0
BEGIN
INSERT INTO TestData (Dummy) VALUES (@Rows)
SET @Rows = @Rows - 1
END

SELECT @Start, GETDATE(), DATEDIFF(MS, @Start, GETDATE())

DROP TABLE TestData

为了测试 BIGINT 身份,我使用了一个稍微修改过的版本:

SET NOCOUNT ON

CREATE TABLE TestData
(
PK BIGINT IDENTITY PRIMARY KEY,
Dummy INT
)

DECLARE @Rows INT
DECLARE @Start DATETIME

SET @Rows = 100000
SET @Start = GETDATE()

WHILE @Rows > 0
BEGIN
INSERT INTO TestData (Dummy) VALUES (@Rows)
SET @Rows = @Rows - 1
END

SELECT @Start, GETDATE(), DATEDIFF(MS, @Start, GETDATE())

DROP TABLE TestData

令我惊讶的是,BIGINT 版本的运行速度明显快于 INT 版本。我的测试套件上的 INT 版本大约需要 30 秒,BIGINT 大约需要 25 秒。假设测试套件具有 64 位处理器。但是,它运行的是 32 位 Windows 和 32 位 SQL Server 2008。

其他人可以重新创建、否认、确认或质疑结果,或者指出我是否遗漏了某些内容吗?

最佳答案

要更进一步,请对 VARCHAR 执行相同的操作,如下所示:

SET NOCOUNT ON

CREATE TABLE TestData
(
PK VARCHAR(8) PRIMARY KEY,
Dummy INT
)

DECLARE @Rows INT
DECLARE @Start DATETIME

SET @Rows = 100000
SET @Start = GETDATE()

WHILE @Rows > 0
BEGIN
INSERT INTO TestData (PK, Dummy) VALUES (CONVERT(VARCHAR(8), @Rows), @Rows)
SET @Rows = @Rows - 1
END

SELECT @Start, GETDATE(), DATEDIFF(MS, @Start, GETDATE())

DROP TABLE TestData

我预计这会慢得多,因为脚本正在确定“身份”列,并且存在字符串转换。另外,我制作了 VARCHAR(8) 以将字节数与 bigint 相匹配。然而,在我的测试中,它比上面的 INT 测试运行得更快。

我从中得出的结论是,无论您向空表中插入记录什么,都会非常快。 future 性能的影响,即表上的其他索引、当表已经有大量数据时插入行等可能是更重要的考虑因素。

关于sql-server - 比较 IDENTITY 列的 INT 与 BIGINT 时出现意外的性能结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/763773/

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