2014-09-01 80 views
0

我需要将现有的应用程序移至windows azure虚拟机。此应用程序将大量数据(插入到)写入数据库。当我向磁盘写入大量数据时,Azure虚拟机上的sql server性能不佳

因此,我在Azure虚拟机上创建了一个SQL Server计算机,并根据Azure虚拟机上的SQL Server的Microsoft最佳实践(http://msdn.microsoft.com/en-us/library/azure/dn133149.aspx)配置了该环境。

我测试这个SQL查询我的电脑上,并在Azure VM我的SQL Server上:

WHILE @i <= 100000 BEGIN 
INSERT INTO sales (id, created) VALUES (@i, GETDATE()); 
SET @i = @i + 1; 
END 

当我跑我的机器43秒后其完成此查询。 当我在蔚蓝的虚拟机上运行这个查询时,它需要花费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

如果你只是比较物理硬件的速度与虚拟机,这个问题不适合在StackOverflow。也许ServerFault可能会更好?无论如何,在目前的形式下,您甚至不包括机器大小,无论是为自己的机器还是部署的VM。即使您将此内容发布到ServerFault,它仍然是无法回答的。 – 2014-09-01 11:09:46

+0

那么日志存储在磁盘上呢?通过尝试在单个事务中一次写入一行,会给日志造成巨大的压力。无论如何,如果你想写这样的数据到数据库,有更好的方法,比如做一个INSERT/SELECT来一次从源数据中提取数据。也许,如果您发布了* actual *查询,我们可以帮助您解决它 – 2014-09-01 11:22:48

回答

1

100.000逐一插入会很慢,因为同一个事务中有很多插入。试试这个。它只有1插入:

;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 
+0

谢谢您的回答,但我无法更改简单查询,因为实际上,我转而使用Azure与MSSQL交谈的应用程序抛出动态CRM API,并与我的第一个查询场景一起工作。我不明白为什么在我的机器中,我在40秒后获得了结果,而在10分钟内获得了Azure VM。 – 2014-09-01 07:37:50

+1

好,如果你想优化你的脚本,你需要重写它,它写得不好。 – 2014-09-01 07:42:34

+0

@ t-clausen.dk - 我不认为这与这个问题有关(它不属于SO) - OP将比较一台物理机器和一台Azure VM,这两者都不是规格' d问题中,并询问为什么会出现性能差异。脚本的内容是无关紧要的,目前的问题是无法回答的。 – 2014-09-01 11:12:51

相关问题