2014-09-01 40 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

相關問題