当我将大量数据写入磁盘时,使用zure vm上的sql server性能不佳

时间:2014-09-01 06:47:17

标签: sql sql-server azure azure-virtual-machine

我需要将现有应用程序移动到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时,我得到了适合第二个查询结果的结果(带有事务)。

我的应用程序必须在没有事务的情况下运行。

有人知道如何解决这个问题吗? 谢谢。

1 个答案:

答案 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