2011-03-01 73 views
1

尋找一些關於如何優化我們的項目的建議。我們有一個ASP.NET/C#系統,它從SQL2008數據中檢索數據,並將其呈現在DevExpress ASPxGridView上。檢索到的數據可能來自多個數據庫中的一個 - 所有這些數據庫都略有不同,並且定期添加和刪除。用戶會看到現場「公司」列表,並從相應的數據庫中檢索數據。在ASP.NET頁面上檢索大型動態指定表的最佳策略

目前,正在使用標準SqlDataSource和動態創建的SQL SELECT語句檢索數據。語句中有幾個JOIN,以及可選的WHERE約束,這些約束又是根據數據庫和用戶的權限級別動態創建的。

除了表演,所有這些都很棒(誠實!)。當涉及到某些數據庫時,有數十萬行,並且通過數據檢索和分頁的速度很慢(數據庫已經正確編制索引)。因此,我一直在研究如何加快系統的速度,這似乎歸結爲兩種選擇:XPO或LINQ。我需要爲LINQ可以訪問的每個數據庫創建「定義」,我需要爲每個數據庫創建「定義」,但是我不知道LINQ是如何輕鬆實現的。 ?我也對動態創建LINQ查詢有些不確定,儘管看起來至少有一部分似乎是可行的。

另一方面,XPO似乎允許我即時創建XPO數據源。但是,我無法找到有關如何加入其他表格的太多信息。

任何人都可以提供任何建議,哪種方法 - 如果有的話 - 是最好的嘗試和復古到這個項目?或者,當前使用的動態SQL模型與LINQ和XPO有着根本的不同,最好單獨使用?

回答

2

你去改變整個方式,您的應用程序會談到數據庫中,有你有一個看看下面前:

  • 通過性能分析器運行代碼(如展鵬的性能分析器) ,結果往往令人驚訝。

  • 如果您正在構建SQL字符串,您是否使用.Net最佳實踐,如String.Concat(「str1」,「str2」)而不是「str1」+「str2」。請記住,多個小的收益加起來可以獲得巨大的收益

  • 您是否曾想過要定期更新摘要表或數據庫(比如說,每15分鐘一次,您可能需要運行一項服務來自動更新此數據),以便您只打一個數據庫。與數據庫的新連接非常昂貴。

  • 你看過你正在運行的SQL的查詢計劃嗎?今天,我將一個動態創建的SQL字符串移至一個存儲過程(僅更改了一個參數),並且在運行時間(取決於某些條件被稱爲100-10000次)的情況下削減了5-10秒。

只是一個警告,如果你確實使用LINQ。我看到有些開發人員決定使用LINQ來編寫更低效的代碼,因爲他們不知道自己在做什麼(例如,當他們需要檢查1時,拉出36,000條記錄)。這些事情很容易被忽視。

只是一些讓你開始,希望有那麼點意思,你有沒有想過的。

乾杯,

斯圖

+0

斯圖您好,感謝非常有用的回覆。我已經檢查了大部分上述內容;據我瞭解,問題在於Web服務器從SQL服務器中提取整個表,然後爲數據分頁並將結果發送到瀏覽器。因此,用戶點擊的每個頁面都會導致整個表格被讀取。 XPO和LINQ似乎通過自定義查詢來避免這種情況,只從數據庫讀取實際顯示的行 - 看起來我需要重新編碼我的動態SQL查詢來模擬此行爲。 – KenD

+0

嗨肯尼,在這種情況下,你能不能修改查詢來拉扯頂端50並重新綁定,當你需要下一個50例如?爲此,我會親自創建一個類似於以下'USE AdventureWorks; GO WITH OrderedOrders AS ( SELECT的SalesOrderID,訂購日期, ROW_NUMBER()OVER(ORDER BY訂購日期)AS 'ROWNUMBER' FROM Sales.SalesOrderHeader ) SELECT * FROM OrderedOrders WHERE ROWNUMBER 10和20之間;'將10和20更改爲您想要的數據範圍。我承認我從未使用過DevExpress控件,所以不知道你有多少控制權。 –

0

我想有兩個點的性能可能在這種情況下進行調整。我假設你直接訪問數據庫,而不是通過某種輔助層訪問數據庫。

首先,你不要說你是如何顯示的數據本身。如果您將數千條記錄加載到網格中,則無論其他所有內容多快,都需要時間。顯然,這裏的訣竅是顯示數據的一個子集並允許用戶進行分頁等。如果你沒有這樣做,那麼這可能是一個很好的開始。

其次,你說的那個表正確索引。如果是這種情況,並且假設您沒有一次將1,000條記錄加載到頁面中,並且一次只收取子集,那麼您應該沒問題。

但是,如果您只是針對SQL連接執行ExecuteQuery()以獲取數據集,我不會看到Linq或其他任何方法如何幫助您。我想說問題顯然在數據庫方面。

所以要解決,你需要設定檔會反對它運行不同的SELECT語句的數據庫中的問題,檢查查詢計劃,並確定哪些事情減慢的地方。您可能需要使用SQL Server Profiler開始,但如果您擁有良好的DBA,有時只需查看查詢計劃(可從Management Studio獲取)就足夠了。

+0

感謝您的回覆 - 我認爲SELECT語句的速度和它的速度一樣快,正如我在上面Stu回覆中所描述的那樣,Web服務器將整個表從SQL表中拉出來每一次,即使它只需要顯示10行。 – KenD

2

據我瞭解,你是在談論所謂的server mode當所有數據處理都是數據庫服務器,而不是他們在Web服務器上完成,處理他們那裏。在這種模式下,網格的數據源可以包含幾十萬條記錄,速度非常快。如果你想使用這種模式,你應該創建相應的LINQ類或XPO類。如果您決定使用LINQ based server mode,則LINQServerModeDataSource將提供可用於設置自定義IQueryable和KeyExpression的Selecting事件。我建議你在你的應用程序中使用LINQ。我希望這些信息對你有所幫助。

+0

感謝您的回覆 - 但是,我期待與Linq的問題是,我似乎需要爲每個我將首先訪問的數據庫定義一個類。這個系統的本質是,被讀取的數據庫是隨機定義的 - 我從配置數據庫讀取參數,然後定義哪個客戶數據庫和哪些字段被讀取。我錯過了什麼;我可以定義「即時」Linq類,然後動態生成Linq語句嗎? – KenD

+0

通常,可以在運行時動態生成LINQ類。你可以在http://stackoverflow.com/questions/2763158/how-to-create-dynamic-table-in-dbml-file找到關於這方面的一些信息。另外,可以根據數據庫內容在運行時創建XPO類(http://www.devexpress.com/Support/Center/Issues/ViewIssue.aspx?issueid=Q230742)。但是,我們不建議這樣做。在設計時創建所有必需的類並使用它們更容易和更有效。 –