2015-05-08 22 views
2

我需要檢索一系列我應該跳過的記錄。但是,我在本地SQL Server和SQL Azure上運行的結果都是一樣的,但時間不同。兩個數據庫都有相同的索引。例如,我有一個包含700萬條記錄的表,我有這樣的查詢: SELECT TOP(100)a.Time,a.SiteID FROM(SELECT a.Time,a.SiteID,row_number()OVER (ORDER BY a.Time DESC)AS [row_number] FROM [Table] AS a WHERE a.SiteID = 1111)作爲WHERE row_number> 632900雲上的SQL Azure在本地運行查詢比SQL Server慢,我能做些什麼來改進?

在SQL Azure中:它在30秒內給出1分鐘的結果。 在場所中的SQL Server:它在近實例時間內給出結果。

我該怎麼做才能改善SQL Azure上的執行時間?

問候 格雷斯

+0

您使用的是什麼版本的sql azure?請查看性能等級@ https://msdn.microsoft.com/en-us/library/azure/dn741336.aspx查詢計劃對於Azure和內部部署是否都是相同的? –

+0

在SQL Azure中,我使用「標準」,性能級別爲S0(10DTUS)。我檢查執行計劃,Cloud和On-premises在[Table]的密鑰查詢(Clustered)[PK_Table_1]上具有相同的99%,這是[Table]列「ID」的主鍵,它是一個獨特的自動增量列。 –

+1

這解釋了緩慢的原因,因爲您在預訂中獲得的資源必須遠遠高於您在Azure中爲標準S0層獲得的資源。您可以嘗試的幾件事是壓縮表格以減少要掃描的頁面數量(這可以稍微增加CPU)。將結果緩存在應用程序中,而不是每次查詢。此外,您可能需要擴大比較性能增益..如果您的數據庫尚未在V12中,您可能想升級以獲得更好的性能,因爲它使用SSD –

回答

1

根據計劃,該查詢需要讀取至少632900個紀錄。如果沒有合適的索引,則可能需要讀取並整理整個表格。

SQL Azure內存有限。這經常會將工作負載從內存中狀態轉移到需要磁盤IO。 IO很容易比內存慢100倍,特別是在Azure上使用嚴重節制的IO。

優化查詢以減少緩衝池內存。可能你應該創建一個合適的索引。還要考慮使用更高效的分頁策略。例如,不是按行號查找,您可以通過處理的最後一個a.Time值查找。這樣,所需的緩衝池內存很小,因爲表訪問只是在正確的位置開始。

+0

我已經有下面這個索引,任何想法? : CREATE NONCLUSTERED INDEX [NonClusteredIndex-20141224-124138] ON [表] ( \t [SITEID] ASC, \t [時間] DESC )WITH(PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,SORT_IN_TEMPDB = OFF,DROP_EXISTING = OFF,ONLINE = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)ON [PRIMARY] –

+0

給usr,我已經找到了解決這個問題。你是對的,我修改了索引,現在運行得很快。([SiteID] ASC,[Time] DESC),但是,當我更改爲([SiteID] ASC,[Time] DESC)INCLUDE([ID],[EmployeeID],[JobCode])時,現在很快。謝謝,問題解決了。 –

+0

@GraceChan好的,太好了。但是,一旦數據集再次超過緩衝池大小,問題就會恢復。 Azure對內存的限制非常有限,如果您不瞭解限制,可能會導致10-100x的突然性能下降。 – usr

0

您可以嘗試使用OFFSET FETCH重新編寫您的查詢。確保您有一個與ORDER BY中的列匹配的索引。然後SQL Server將使用優化的TOP運算符來執行分頁。查詢this post瞭解OFFSET FETCH的更多注意事項。

相關問題