Otimização do SQL Selecione para enumeradores
-
27-09-2019 - |
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.
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 ..