Frage

Wie kann diese Abfrage für Enumeratoren optimiert werden:

SELECT * FROM Customers

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

SqlReader dass gibt eine Gruppe Kunden On-Demand-lesenden werden in einer Art und Weise Enumerator. Während es riesige Datensätze zurückgeben kann, die gelesen werden können / langsam in einer foreach-Schleife verbrauchen, wird jede andere Abfrage auf dem gleichen Tisch eine Menge Behauptungen begegnen. Wie kann diese optimiert werden / vermieden? Cursors oder Auswählen in temporären Tabellen?

Hier ist ein Codebeispiel, das eine Menge von Streitigkeiten verursachen (ich es profiliert und die Zahlen schlecht aussehen in der Tat):

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. Ich werde dies auch in MySQL müssen optimiert werden.

War es hilfreich?

Lösung

1) Haben Sie die brauchen '*' kann nicht die Spalten angeben.

2) Verwenden Sie mehrteiligen Namen dbo.tablename.fieldname - diese Geschwindigkeiten it up

3) versuchen, einen Sperrhinweis mit (nolock) oder (readpast)

4) Was ist das IO-Profil? Does SQL haben die Daten von der Festplatte ziehen jedes Mal, es läuft?

5) Haben Sie einen der Kerne auf dem Server max herausfinden, während der andere im Leerlauf?

6) Cache-it! Bis Sie wissen, dass es ein Change- dann nachladen es gewesen ist.

Ich habe keine Ideen mehr aus ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top