Ottimizzazione di SQL Seleziona per enumeratori
-
27-09-2019 - |
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.
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 ..