Domanda

Come può questa query essere ottimizzato per enumeratori:

SELECT * FROM Customers

Table Customers
customerId int - has index on it
customerName, etc

SqlReader che restituisce un set clienti saranno lette on-demand in modo enumeratore. Mentre può tornare enormi set di dati che possono essere letti / consumati lentamente in un ciclo foreach, ogni altra query sulla stessa tabella si incontrano un sacco di contese. Come può essere ottimizzato / evitato? Cursori o la selezione in tabelle temporanee?

Ecco un esempio di codice che causerà un sacco di contese (ho fatto il profilo e il numero in cattiva luce in effetti):

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);
   }
}


P.S. Ho anche bisogno di ottimizzare questo in MySQL.

È stato utile?

Soluzione

:

1) Avete bisogno la sopraelevazione '*' si specificano le colonne.

2) Utilizzare nomi più parti dbo.tablename.fieldname - questa velocità fino

3) provare un suggerimento di bloccaggio con (nolock) o (READPAST)

4) Che cosa è il profilo IO? Non SQL deve estrarre i dati dal disco ogni volta che viene eseguito?

5) Trovi uno dei core su server massimo fuori mentre l'altro è inattivo?

6) Cache esso! Finché non si sa c'è stata una Change-ricaricarlo.

Ho corto di idee ..

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top