我是一个多线程新手和一个SQL新手,所以请原谅任何菜鸟的错误。多线程SQL select语句
我想异步执行很多SQL查询。查询都是来自同一个数据库中同一个表的select语句。我可以同步运行它们,一切正常,但测试一个小子集导致我相信同步运行所有查询将花费大约150个小时,这太长了。因此,我试图找出如何并行运行它们。
我试图在run a method multiple times simultaneously in c#的答案后对代码建模,但是我的代码没有正确执行(这是错误的,尽管我不知道具体如何,代码只是说错误发生)。
这里是我有什么(什么我实际上做了一个更小和更简单的版本):
class Program
{
static void Main(string[] args)
{
List<string> EmployeeIDs = File.ReadAllLines(/* Filepath */);
List<Tuple<string, string>> NamesByID = new List<Tuple<string, string>>();
//What I do not want to do (because it takes too long) ...
using (SqlConnection conn = new SqlConnection(/* connection string */))
{
foreach (string id in EmployeeIDs)
{
using (SqlCommand cmd = new SqlCommand("SELECT FirstName FROM Employees WITH (NOLOCK) WHERE EmployeeID = " + id, conn))
{
try
{
conn.Open();
NamesByID.Add(new Tuple<string, string> (id, cmd.ExecuteScalar().ToString()));
}
finally
{
conn.Close();
}
}
}
}
//What I do want to do (but it errors) ...
var tasks = EmployeeIDs.Select(id => Task<Tuple<string, string>>.Factory.StartNew(() => RunQuery(id))).ToArray();
Task.WaitAll(tasks);
NamesByID = tasks.Select(task => task.Result).ToList();
}
private static Tuple<string, string> RunQuery(string id)
{
using (SqlConnection conn = new SqlConnection(/* connection string */))
{
using (SqlCommand cmd = new SqlCommand("SELECT FirstName FROM Employees WITH (NOLOCK) WHERE EmployeeID = " + id, conn))
{
try
{
conn.Open();
return new Tuple<string, string> (id, cmd.ExecuteScalar().ToString());
}
finally
{
conn.Close();
}
}
}
}
}
注:我不在乎这究竟是如何多线程(任务,parallel.foreach,BackgroundWorker的等)。这将被用来精确地运行一次〜30,000次select查询,所以我只需要它运行一次(我希望〜8小时=一个工作日,但我会拿我能得到的)一次。它不一定非常漂亮。
预先感谢您!
是选择所有不是一个选项,然后处理它们的客户端?运行这么多个人查询似乎是一种非常低效的方式。表中有多少条记录? – Tone
你有'30,000'查询运行,是否因为有'30,000'员工? – Squirrel
@Tone我不确定选择全部是否可行。我能看到的复杂性是在真实版本中有一个子查询。 (在我的例子中,真正的版本有一个子查询来得到什么是“id”)因此,真正的查询看起来像“从表中选择FristName,其中Employee ID =(从otherTable中选择top 1 EmployeeID,其中variable = value)所有?(就像我说的,SQL新手。)第二点,每个表(查询和子查询)有成千上万的行,查询表有200列。 – BrianH