[英]Using LINQ vs SQL for Filtering Collection
關於使用LINQ vs SQL過濾集合,我有一個非常籠統的問題。 假設您在數據庫表上運行了一個相當復雜的過濾器。 它正在運行,比如10,000次,過濾器每次都可能不同。 性能方面,您最好將整個數據庫表集合加載到內存中並使用LINQ執行過濾器,還是應該讓數據庫使用SQL處理過濾(因為這是構建的內容)。 有什么想法嗎?
編輯:我應該更清楚。 讓我們假設我們正在談論一個包含1000條記錄和20列的表(包含int / string / date數據)。 目前在我的應用程序中,我每半小時運行一次查詢,將所有數據導入集合(將該集合保存在應用程序緩存中),並在整個應用程序中過濾該緩存集合。 我想知道這是否比進行數據庫服務器(它是Oracle fwiw)的大量往返更糟糕。
編輯
它的alwyas取決於你擁有的數據量。 如果你有大量數據而不是sql,如果你的數據少於linq。 它還取決於從sql server調用數據的頻率,它比在內存中加載更好,而不是應用linq,但如果不是sql更好。
第一個答案
最好是在sql端而不是在內存中加載而不是應用linq過濾器。
一個原因是更好地去sql而不是linq
如果你獲得10000條記錄時你會獲得linq,它會加載到內存中以及增加nework的流量
如果去sql沒有記錄減少所以內存利用量減少,aslo減少網絡流量。
更新后:
它運行,說10,000次
我將假設一張包含1000條記錄的表格
假設1k記錄很容易適合內存,這似乎是合理的。
然后運行10k過濾器將會更便宜(LINQ)。
使用SQL意味着加載10M記錄,大量I / O.
取決於您的表有多大以及它存儲的數據類型。
就個人而言,如果您計划在同一請求中使用所有過濾器,我會返回所有數據。
如果它是使用ajax按需過濾,您可以每次從數據庫重新加載數據(保證數據是最新的)
我會說讓SQL做復雜的過濾器和其余的處理要好得多,但為什么你可能會問。
主要原因是因為SQL Server具有您已設置的索引信息,並使用此索引非常快速地訪問數據 。 如果您在Linq上加載它們,那么您沒有這個索引信息來快速訪問數據,並且您沒有時間訪問它們。 你每次都要浪費時間編譯linq。
你可以做一個簡單的測試,看看你的自我與眾不同。 什么考試? 創建一個包含數百個隨機字符串的簡單表,並使用字符串索引此字段。 然后在字符串字段上搜索,一個使用linq,一個直接詢問sql。
我的第一個想法是SQL保留索引並快速訪問SQL上的搜索數據庫。
然后我認為linq也可以將這個過濾器轉換為sql,然后獲取數據,然后你做出你的動作......
現在我認為實際的原因取決於你采取的行動。 直接運行SQL更快 , 但其原因取決於您實際設置linq的方式 。
如果你試圖加載所有內存然后使用linq然后你從SQL索引失去速度,並失去內存,並失去很多動作將數據從SQL移動到內存。
如果你使用linq獲取數據,然后不需要進行其他搜索,那么你將失去所有內存數據的移動,並失去內存。
這可能會引起一些關於數據庫角色的爭論! 我有一個相對復雜的過濾(一些相對復雜的過濾(例如“在X國家,價格是y並且有關鍵字z)之類的東西,並且它非常慢。加上這個,我不被允許改變數據庫結構,因為它是第三方數據庫。
我換掉了所有的邏輯,以便數據庫只返回結果(我每小時緩存一次)並在內存中進行過濾 - 當我這樣做時,我看到了大量的性能提升。
t取決於您要過濾的數據量。
您說過濾器運行10K時間,並且每次都可以不同,在這種情況下,如果您在數據庫中沒有太多數據,則可以將其加載到服務器變量。
如果您在數據庫上有數十萬條記錄,則不應該這樣做,也許您可以在數據庫和每個編譯過程上創建索引以更快地獲取數據。
您可以在兩者之間實現緩存外觀,以幫助您在第一次請求時在服務器端存儲數據並根據您的要求進行更新。 (只有在數據具有記錄限制時,您才可以編寫緩存來填充變量)。
您可以通過運行一些測試查詢和觀察來計算從數據庫獲取數據的時間。 同時,如果數據存儲在內存中,您可以觀察服務器的響應時間,並計算差異並按此決定。
可能有許多其他技巧,但基線是
你必須觀察並決定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.