【发布时间】:2015-10-29 10:22:59
【问题描述】:
避免在非常大的 sql 选择语句上超时的最佳方法是什么?
List<int> klienter = FundneKlienter.Keys.ToList();
if (klienter.Count > 0)
{
Dictionary<int, String> klientNavne = new Dictionary<int, string>(klienter.Count);
String sql = "SELECT [0],[1] FROM [Tabel] WHERE [0] IN " + klienter.ToSqlList();
using (SqlCommand cmd = new SqlCommand(sql, _connection))
using (SqlDataReader sr = cmd.ExecuteReader())
if (sr.HasRows)
while (sr.Read())
klientNavne.Add(int.Parse(sr["0"].ToString()), sr["1"].ToString());
这个“klinter”列表可以包含 700 万个 4-5 位长的 ID。
优化此查询的最佳方法是什么?
我在 40.000+ 后超时??我是大 SQL 语句的新手。
如果您需要更多代码来帮助我,请告诉我。
【问题讨论】:
-
使用字符串连接来构造 SQL 命令不是一个好习惯。 StringBuilder,在循环内产生有效的 sql 命令和 SQL 参数,是避免这种情况的一种可能方法。
-
即使它与您的问题无关,但老实说(除了在表中使用索引):您确定您真的需要应用程序内存中的所有 700 万个 id 吗?通常,当我在代码中看到需要如此大列表的位置时,我的闹钟会响起,我会问自己是否可以通过使用连接或子查询重做需要该列表的 sql 来减少它,....。不确定您的用例,因此询问您是否确定您确实需要应用程序内列表中的所有这 700 万个条目,因为这通常是多余的。
-
这是一个很好的观点,你可能有一部分是对的。事情是这样的。我有很多用户控件 20-30 都有一些控件。这些用户控件有一个选择语句 Fx“select top 1000”,然后下一个用户控件有一个选择语句 Fx“select top 2000”,但是第二个用户控件不能选择第一个中的任何内容,依此类推。
标签: c# sql performance select