Запрос SQL: использовать где в или foreach? - PullRequest
1 голос
/ 27 апреля 2010

Я использую запрос, где кусок:

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

У меня есть около 50k этих кодов.

Это работало, когда у меня было 30 000 кодов, но я знаю, что получаю:

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 ]

3 голосов
/ 27 апреля 2010

Я предлагаю вам создать временную таблицу, содержащую все коды, которые вы хотите сопоставить, и вместо этого присоединиться к ней.

Тем не менее, мы действительно не увидели достаточно вашего кода, чтобы прокомментировать наверняка.

1 голос
/ 28 апреля 2010

Сначала создайте временную таблицу, назовите ее #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 голосов
/ 27 апреля 2010

Я не уверен, где вы взяли эти 50k значений, но если это из другого запроса, просто присоединитесь к этой таблице и получите все данные за один раз из одного запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...