SQL查询:在哪里使用或foreach?

时间:2010-04-27 19:18:02

标签: c# sql-server-2005 performance

我正在使用查询,其中的部分是:

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

我有大约5万的这些代码。

当我有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

我认为这个问题与IN ...

有关

所以现在我正在计划使用foreach(代码中的字符串代码) ...代码=代码

这是好主意吗?

3 个答案:

答案 0 :(得分:3)

我建议你创建一个包含你想要匹配的所有代码的临时表,然后改为加入。

但是,我们还没有看到足够的代码来评论。

答案 1 :(得分: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();

我知道这对服务器来说似乎很多工作,但它确实非常快。

答案 2 :(得分:0)

我不确定你在哪里获得这些50k值,但如果它来自另一个查询,只需加入此表并从一个查询中一次获取所有数据。