sql-server – 将ID与INTENTITY列的INT与BIGINT进行比较的意外性能结果

我被要求使用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测试运行得更快.

我从中得到的是,无论你扔什么,将记录插入空表都会非常快.未来表现的影响,即表上的其他索引,当表已经有大量数据时插入行等,可能是一个更重要的考虑因素.

点赞