質問

このクエリを列挙者に最適化するにはどうすればよいですか。

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)キャッシュ!変更があったことがわかるまで、それをリロードしてください。

私はアイデアを使い果たしました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top