列挙器のSQL選択の最適化
-
27-09-2019 - |
質問
このクエリを列挙者に最適化するにはどうすればよいですか。
SELECT * FROM Customers
Table Customers
customerId int - has index on it
customerName, etc
セットの顧客を返すSQLReaderは、列挙者の方法でオンデマンドで読み取られます。 foreachループでゆっくりと読み取ることができる巨大なデータセットを返すことができますが、同じテーブルの他のすべてのクエリは多くの競合に遭遇します。これを最適化/回避するにはどうすればよいですか?カーソルまたは温度テーブルへの選択?
これは、多くの競争を引き起こすコードの例です(私はそれをプロファイルし、数字は実際に悪く見える):
public void DumpCustomers()
{
Thread thread = new Thread(AccessCustomers);
thread.Start();
// GetCustomers returns enumerator with yield return; big # of customers
foreach (Customer customer in GetCustomers())
{
Console.WriteLine(customer.CustomerName);
System.Threading.Thread.Sleep(200);
}
thread.Abort();
}
public void AccessCustomers()
{
while (true)
{
Console.WriteLine(GetCustomer("Zoidberg").CustomerName);
Thread.Sleep(100);
}
}
PS MySQLでこれを最適化する必要があります。
解決
1)列を指定することはできません。
2)マルチパート名DBO.TABLENAME.FIELDNAMEを使用 - これによりスピードアップします
3)(nolock)または(readpast)でロックヒントを試してみてください
4)IOプロファイルは何ですか? SQLは、実行するたびにディスクからデータを取得する必要がありますか?
5)サーバー上のコアの1つが最大になり、もう1つがアイドル状態になっていますか?
6)キャッシュ!変更があったことがわかるまで、それをリロードしてください。
私はアイデアを使い果たしました。
所属していません StackOverflow