2012-10-31 72 views
1

我需要對比較小的SQL Server表(< 10,000行)計算一大組條件(我不知道它們是否提前)。每個條件都採用SQL where子句的形式。目前,我以「select_ count(*)from some_table」的形式構建完整的sql語句,其中「+ Where_Clause;我讓SQL Server將計數返回給我。我這樣做是爲了獲得所有各種條件所需的所有計數。在沒有SQL Server的情況下在c#中評估SQL where子句

我正在尋找方法來加速這一點,當我有幾十或數百計我需要運行。我不知道提前發表的聲明。有些會選擇整個表格,有些可能不會選擇任何行。我嘗試了以下解決方案:

  1. 發出並行查詢 - 看見沒有這樣做,即使最小的任何改進的鎖定
  2. 編寫他們複雜的計數的case語句,所以我可以運行多個,其中在一個聲明中的條款
  3. 傳遞許多查詢一起作爲工會和獲得的結果早在一個結果集

這些選項都不得不在運行時(有時它會運行更慢)實現了重大改進,並增加了複雜性,我感覺不到任何他們是值得的。

我的問題是:我可以非常快速地將整個表加載到一個DataTable對象,只需運行一個「select *」來對付它。如果我在內存中使用了整個表,有沒有一種方法可以對SQL Server進行計數?我希望能切出的開銷:網絡,I/O,鎖定等

最複雜的where子句會是這樣的:

a=1 or b in (2,3) or c<4 or d like '%5' or substring(e,2,1)='z' 

因此,這不是小事,並支持如儘可能多的T-SQL將是理想的,但我不認爲DataTable的.Select()方法支持這個或是非常快。因此,如果給定內存中的數據表,我可以使用T-SQL語法快速(或並行)使用行嗎?

+0

您可以查看Dynamic Linq以查看它是否執行得更好... http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the -linq動態查詢,library.aspx。如果已知過濾條件列表,您可能也可以使用PredicateBuilder ... http://www.albahari.com/nutshell/predicatebuilder.aspx –

+0

是否有一組預定義的where子句?還是按用戶的要求合成? –

+0

用戶使用其他工具創建它們。每個查詢都有一個名稱,所以在生成報告時,他們想知道有多少行與每個條件集匹配,並在其上放置一個名稱。因此,他們會得到一些報告:「好:100,壞:50,紅色:25,黃色:100 ...」等等。無論用什麼標準他們設計了許多查詢,但都是針對一張小桌子這就是爲什麼我要加載一次表並將它們全部在內存中運行。 – powlette

回答

0

您可以嘗試

一)確保你有正確的索引 - 檢查查詢計劃中最複雜的查詢,並確保沒有表掃描在那裏。

b)使用類似的方法在同一請求中執行多個查詢。

var cmd = new SqlCommand(@"SELECT TOP 10 * FROM Foo; SELECT TOP 10 * FROM Bar", con)) 
var ad = new SqlDataAdapter(cmd); 
var ds = new DataSet(); 
ad.Fill(ds); 

var foo = ds.Tables[0]; 
var bar = ds.Tables[1]; 
+0

有太多的索引列,我不知道提前哪些人需要它們。關於在聲明中多個查詢的建議是關於我在我的文章中的想法#3中做的 - 除了我只有一個聲明。令人驚訝的是,將100個語句聯合在一起並不比運行100個單獨的查詢更快。 – powlette

+0

嗯。這意味着查詢本身花費時間,而不是往返服務器。如果沒有更好的索引,我可以想象的並不多。也許嘗試將數據標準化爲單獨的表格,而不是一個大的表格? – NeilD

1

您可以考慮使用LINQ to SQL,或者可能將查詢構建爲您可以執行的存儲過程。

相關問題