我被要求使用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。
其他人可以重新创建,拒绝,确认或对结果提出异议,或者指出我是否错过了某些内容?
答案 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秒。
Server2 - 在SQL2000 SP4 EE上...
基本上,INT通常但并不总是比BIGINT快,,但不是我在运行中看到的差异附近的任何东西。
答案 2 :(得分:0)
只是一个猜测:你有没有尝试先测试BIGINT,然后测试INT?数据库服务器喜欢将内容保存在内存中以优化类似的操作...
答案 3 :(得分:0)
我在我的SQL2008上试过了。 INT需要14秒。 BIGINT需要18秒。