我需要将现有应用程序移动到windows azure VM。该应用程序将大量数据(插入)写入DB。
因此,我在Azure VM上创建了一台SQL Server计算机,并根据Microsoft在Azure VM上的最佳SQL Server实践(http://msdn.microsoft.com/en-us/library/azure/dn133149.aspx)配置了该环境。
我在我的计算机和我的SQL Server上测试了这个SQL查询:
WHILE @i <= 100000 BEGIN
INSERT INTO sales (id, created) VALUES (@i, GETDATE());
SET @i = @i + 1;
END
当我在我的机器上运行此查询时,它在43秒后完成。 当我在天蓝色VM上运行此查询时,它需要10分钟! (我尝试使用单个磁盘并使用2和4个磁盘进行条带化)。
我尝试使用事务测试更多场景代码:
WHILE @i <= 100000 BEGIN
-- Start a transaction
IF @i % 10000 = 1
BEGIN TRANSACTION;
INSERT INTO sales (id) VALUES (@i);
SET @i = @i + 1;
-- Commit after each 10,000 row
IF @i % 10000 = 0
COMMIT;
END
这种情况在两种环境(我的电脑和天蓝色VM)上都可以正常工作。
当我在sql azure VM服务器上运行SQLIO时,我得到了适合第二个查询结果的结果(带有事务)。
我的应用程序必须在没有事务的情况下运行。
有人知道如何解决这个问题吗? 谢谢。
答案 0 :(得分:1)
由于同一事务中的许多插入,逐个插入100.000将会很慢。试试这个。它只有一个插入:
;WITH d as
(
SELECT rn
FROM (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(0)) x(rn)
), numbers as
(
SELECT
row_number() over (order by (select 1)) rn
FROM d d1,d d2,d d3,d d4,d d5
)
INSERT sales (id, created)
SELECT
rn,
getdate()
FROM
numbers