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