我是一個多線程新手和一個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