Pergunta

Como essa consulta pode ser otimizada para enumeradores:

SELECT * FROM Customers

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

O SQLReader que retorna um conjunto de clientes será lido sob demanda de maneira enumeradora. Embora possa retornar conjuntos de dados enormes que possam ser lidos/consumidos lentamente em um loop foreach, todas as outras consultas da mesma tabela encontrarão muitas alegações. Como isso pode ser otimizado/evitado? Cursores ou selecionando em tabelas temperaturas?

Aqui está um exemplo de código que causará muitas alegações (eu perfilei e os números parecem realmente ruins):

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


PS Eu também precisarei otimizar isso no MySQL.

Foi útil?

Solução

1) Você precisa do '*' não pode especificar as colunas.

2) Use nomes de várias partes dbo.tablename.fieldname - isso acelera

3) Experimente uma dica de travamento com (nolock) ou (readpast)

4) Qual é o perfil de IO? O SQL precisa extrair os dados do disco toda vez que ele é executado?

5) Você encontra um dos núcleos no seu servidor no máximo enquanto o outro está ocioso?

6) cache! Até que você saiba, houve uma mudança- então recarregue-a.

Eu fiquei sem ideias ..

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top