2010-04-27 148 views
1

我使用的查詢,其中一塊爲:sql查詢:使用哪裏in或foreach?

...where code in ('va1','var2'...') 

我對這個50K代碼。

這是工作,當我有30K的代碼,但要知道,我得到:

The query processor ran out of internal resources and could not produce a query plan. This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partition 

我認爲這個問題與相關...

所以,現在我打算使用的foreach(字符串代碼代碼) ...其中代碼=代碼

這是好的想法??

回答

3

我建議你創建一個包含所有你想匹配的代碼的臨時表,然後加入它。

但是,我們還沒有真正看到足夠的代碼進行評論。

0

我不確定你從哪裏得到這些50k值,但是如果它來自另一個查詢,只需加入此表並從一個查詢中一次獲取所有數據。

+0

我有這樣的事情: 公共停車場[] GetCars(字符串[]代碼) {} 可以 – user278618 2010-04-27 19:35:03

1

首先,創建一個臨時表,將其稱爲#tmp0,只有一列。然後:

SqlConnection conn = new SqlConnexion(connection_string); 
SqlCommand cmd = new SqlCommand("INSERT INTO #tmp0 (code) VALUE (@code)", conn); 
conn.Open(); 

foreach (string s in bigListOfCodes) 
{ 
    cmd.Parameters.Clear(); 
    cmd.Parameters.AddWithValue("@code", s); 
    cmd.ExecuteNonQuery(); 
} 
cmd = new SqlCommand("SELECT * FROM tbl " + 
      "WHERE code IN (SELECT CODE FROM #tmp0)", conn); 

SqlDataReader rs = cmd.ExecuteReader(); 

while (rs.Read()) 
{ 
    /* do stuff */ 
} 

cmd = new SqlCommand("DROP TABLE #tmp0", conn); 
cmd.ExecuteNonQuery(); 
conn.Close(); 

我知道這似乎很多工作的服務器,但它確實很快。

+0

你看http://stackoverflow.com/questions/2725353/there-is-insufficient-system-內存運行此查詢創建臨時選項卡 – user278618 2010-04-27 22:17:21

+0

這是**更糟糕 - 請先嚐試此方法或至少告訴我們你不喜歡它。我意識到30k'INSERT'語句可能需要15秒才能運行,但我必須更多地瞭解數據來自哪裏,以便爲您提供更好的解決方案。 – egrunin 2010-04-27 22:33:13

+0

它來自'公共汽車[] GetCars(字符串[]代碼){}' – 2010-04-28 11:21:10