我正在使用查询,其中的部分是:
...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(代码中的字符串代码) ...代码=代码
这是好主意吗?
答案 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值,但如果它来自另一个查询,只需加入此表并从一个查询中一次获取所有数据。