0

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

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 でこれを最適化する必要もあります。

4

1 に答える 1

1

1)列を指定できない「*」が必要ですか。

2) マルチパート名 dbo.tablename.fieldname を使用 - これにより速度が向上します

3) (nolock) または (readpast) でロックヒントを試す

4) IO プロファイルは何ですか? SQL は、実行するたびにディスクからデータを取得する必要がありますか?

5) サーバーのコアの 1 つが最大になり、もう 1 つがアイドル状態になっていますか?

6) キャッシュしましょう!変更があったことがわかるまで、それをリロードします。

アイデアが尽きた..

于 2010-10-30T12:40:16.717 に答える