对于IDENTITY列,将INT与BIGINT进行比较时出现意外的性能结果

时间:2009-04-18 17:04:36

标签: sql-server performance

我被要求使用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。

其他人可以重新创建,拒绝,确认或对结果提出异议,或者指出我是否错过了某些内容?

4 个答案:

答案 0 :(得分:1)

为了更进一步,使用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测试运行得更快。

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

答案 1 :(得分:1)

Server1 - 在SQL2005 SP3上64位...我刚尝试过它(INT然后是BIGINT)并获得了2.9和2.6秒。然后将行增加到500000我得到15.2和15.3秒。

  • 更多500K INT / BIGINT运行:14.0 / 14.6s; 14.0 / 15.3s;和14.7 / 15.3s。因此INT比BIGINT快5.8%。
  • 将订单撤销至BIGINT / INT:15.4 / 13.8s; 15.3 / 15.4s;和12.9 / 12.7s。 INT在这里快了4%。

Server2 - 在SQL2000 SP4 EE上...

  • INT / BIGINT:13.7 / 10.9s; 10.4 / 13.9s; 9.9 / 10.2s。 INT快2.9%。
  • 然后切换到BIGINT / INT:10.2 / 13.3s; 10.2 / 10.1s;和11.2 / 10.0s。 BIGINT快了5.7%。

基本上,INT通常但并不总是比BIGINT快,,但不是我在运行中看到的差异附近的任何东西。

答案 2 :(得分:0)

只是一个猜测:你有没有尝试先测试BIGINT,然后测试INT?数据库服务器喜欢将内容保存在内存中以优化类似的操作...

答案 3 :(得分:0)

我在我的SQL2008上试过了。 INT需要14秒。 BIGINT需要18秒。