Optimierung von SQL-Select für Aufzählungen
-
27-09-2019 - |
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.
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 ..