2008-10-23 83 views
4

是否更快地進行數據庫訪問並帶回3000+行,然後使用LINQ或更快速地使6個調用一次帶回100行?哪一條最快?數據檢索

+0

這並不直接回答你的問題,但我問了一個關於鏈接的問題[「有多快的LINQ」(http://stackoverflow.com/questions/115851/how-fast-是-LINQ)。也許答案會幫助你。 – ThatBloke 2008-10-23 10:21:53

回答

1

這是一個用戶,還是許多用戶會查詢數據?單個數據庫調用在負載下可以更好地擴展。

6

這將完全取決於數據庫,網絡帶寬和延遲,在.NET機器的速度,實際查詢等

換句話說速度,我們不能給你一個真實的一般答案。我知道哪些聲音更容易編碼:)

不幸的是,這種類型的測試環境與生產環境有些不同,但如果沒有生產環境的複製品,您就無法進行有效測試。 ,這可能會嚴重改變結果。

0

那麼,答案總是「取決於」。你想優化數據庫負載還是應用程序負載?

在這種情況下,我的一般答案是在數據庫級別使用特定查詢,因此使用6個調用。

0

THX

我是那種想「棒球場」,但它聽起來好像它是一個選擇的事情...的差異可能較小。

我在想,獲取所有數據並在.net中操作將是最好的 - 我沒有具體的基礎(因此問題),我只是傾向於覺得調用數據庫是昂貴的,如果我知道我需要所有的數據......一擊就能得到它!!?

+0

請通過特定回覆下方的評論按鈕發表您的意見。如果您的評論是針對多人的,請編輯原始帖子並將其留言底部粘貼。答案部分是..好..答案。 – Oli 2008-10-23 10:48:36

+0

感謝奧利 - 將來會做... – SteveCl 2008-10-23 11:28:55

0

問題的一部分是您沒有提供足夠的信息來給出準確的答案。顯然,可用資源需要考慮。

如果您不經常拉3000行,它可能在短期內適合您。但是,如果說有10,000人執行相同的查詢(忽略緩存效果),則這可能會成爲應用程序和數據庫的問題。

現在,在類似分頁的情況下,只需將所需內容拉入即可。但是,這只是一個普遍的規則,試圖拉取必要的東西。使用手術刀而不是大刀更優雅。 =)

0

如果你正在談論一個已經由SQL運行(通過SQL Server優化)的查詢,使用LINQ或SqlDataReader實際上可能會有相同的性能。

唯一的區別是「維護代碼有多難?」

LINQ不詢問數據庫的任何內容,直到用「.ToList()」或「.ToArray()」或甚至「.Count()」詢問結果爲止。 LINQ動態構建您的查詢,因此它與具有SqlDataReader但具有運行時驗證完全相同。

0

我總是堅持「引進我所需要的」的規則,而且更多......我在這裏的問題是我需要它,我只是需要單獨顯示。

所以說... 我有一個表與userid和typeid。我想用一個用戶標識顯示所有記錄,並在網格中用typeid分隔的網頁上顯示。

目前我稱之爲「選擇field1,字段2從標籤where userid = 1」, ,然後在頁面上設置網格的數據源從t到tab,其中typeid = 2 select t;

而不是調用另一個sproc「select field1,field2 from userid = 1 and typeid = 2」tab 6次。

??

0

而不是猜測,你爲什麼不嘗試並測量結果?

1

速度只是其中的一個考慮因素。

你的代碼有多靈活?在需求變化時,修改和擴展有多容易?他人閱讀和維護你的代碼有多容易?你的代碼是多麼便攜?如果你改用不同的DBMS或不同的編程語言怎麼辦?在你的情況下,這些考慮都很重要嗎?

話雖如此,如果所有其他的東西都是平等的或不重要的,那就去單程往返。

您提到單次往返可能會導致您讀取不需要的數據。如果您需要的所有數據都可以在單個結果表中進行描述,那麼應該可以設計一個能夠得到該結果的查詢。如果查詢使數據非規格化,該結果表可能會在多行中提供一些結果數據。在這種情況下,您可以通過獲取多個結果表中的數據並自行編寫結果來獲得一些速度。

您還沒有提供足夠的信息來知道編寫單個查詢或編寫6個查詢返回的數據將花費多少編程工作量。

正如其他人所說,這取決於。

1

我這裏的問題是,我需要的一切,我只需要它單獨顯示...

的回答你的問題是1個查詢3000行是優於6個查詢500行。 (假設你將所有3000行都帶回去)

但是,你不可能一次顯示3000行,是嗎?很可能,無論使用Linq,你都希望運行聚合查詢並讓數據庫爲你完成工作。您應該希望能夠構建SQL(或Linq查詢)以一次執行所有必需的邏輯。

不知道自己在做什麼,很難更具體。如果你絕對肯定需要帶回所有行,然後調查你的linq IQueryable的ToLookup()方法。以非標準方式對結果進行分組非常方便。

噢,我強烈推薦LINQPad(免費)試用Linq的查詢。它有大量的示例,並且它還顯示了sql和lambda表單,因此您可以熟悉Linq < - > lambda表單< - > Sql。

0

這取決於

1)如果你的連接器實現precaches大量的對象,你有大行(例如斑點,contry多邊形等),你有問題,你必須下載很多數據。我已經優化了一次有這個問題的代碼,它只是通過本地主機一直下載一些垃圾大小,現在我的軟件運行速度提高了10倍,因爲我通過一個選項刪除了預讀。

2)如果你的行很小,你很有可能需要閱讀所有的3000,你最好去一個大的結果集

3)如果你不使用預處理語句,所有的查詢都必須被解析!大的結果可能會更好。

希望它幫助