2010-10-29 19 views
0

Comment cette requête est optimisé pour les agents recenseurs:Optimisation de Sélectionnez SQL pour les agents recenseurs

SELECT * FROM Customers

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

SqlReader qui retourne un ensemble de clients sera lu à la demande de façon recenseur. Bien qu'il puisse renvoyer d'énormes ensembles de données pouvant être lus/consommés lentement dans une boucle foreach, toutes les autres requêtes sur la même table rencontreront beaucoup de conflits. Comment cela peut-il être optimisé/évité? Curseurs ou sélection dans des tableaux temporaires?

Voici un exemple de code qui provoque beaucoup de disputes (je PROFILES et les chiffres semblent mauvais effet):

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


post-scriptum Je vais aussi devoir optimiser cela dans MySQL.

+0

Y a-t-il un moyen de filtrer vos résultats en utilisant un O WH? Si vous sélectionnez la table entière, cela n'a pas d'importance que customerId ait un index dessus. Peut-être devriez-vous mettre en place une sorte de pagination/récupération? – dotariel

+0

d'accord, ce n'est pas grave. Non je ne peux pas filtrer quoi que ce soit avec la clause WHERE, toute la table doit être vidée – kateroh

+0

Pouvez-vous être plus précis sur ce que vous avez l'intention de faire avec cet ensemble de données volumineux? – dotariel

Répondre

1

1) Avez-vous besoin de la '*' ne pouvez pas spécifier les colonnes.

2) Utilisez des noms à plusieurs parties dbo.tablename.fieldname - ce qu'il accélère

3) essayer une touche de verrouillage avec (nolock) ou (readpast)

4) Quel est le profil IO? Est-ce que SQL doit extraire les données du disque chaque fois qu'il s'exécute?

5) Trouvez-vous l'un des cœurs de votre serveur au maximum alors que l'autre est inactif?

6) Cachez-le! Jusqu'à ce que vous sachiez qu'il y a eu un changement, rechargez-le.

Je n'ai plus d'idées ..

+0

merci pour les idées, le profileur l'a résolu – kateroh