Acredito que não usamos nem 30% do que o Banco de Dados SQL Server oferece. Há alguns dias, conversava com alguns amigos e lembrei de uma dica que a ordem de criação dos índices e consultas faz diferença, então, resolvi testar.

Tive uma surpresa, realmente faz diferença, algo que nem sempre nos atentamos, seguem as evidências dos testes.

Tamanho da tabela

clip_image002

Criação do índice (Notem que inclusive há botões, mover para cima e mover para baixo) .

clip_image002[8]

 

clip_image002[10]

clip_image002[12]

Resultado usando o índice corretamente. (CPF, Nome) Resultado usando o índice com a ordem invertida

O que achei mais engraçado é que o execution Plain apontou 50% para cada execução mostrando que o indice CPF_Nome foi acionado, mas, fez diferença no resultado (Select acima). Eu executei muitas vezes, pois, o Sql Server sempre mantém informações das consultas realizadas…

image

Não contente, fiz uma aplicação para comparar a execução e….. surpresa!!! Mesmo com o ExecutionPlain dizer que o custo era igual para ambos, a execução tem o tempo diferente.

image

Se for um cara chato como eu, vai logo pensar… Bom, depende de como foram feitos os testes… então vaí aí como foi realizado o teste.

class Program
{
static void Main(string[] args)
{

string strCnn = System.Configuration.ConfigurationSettings.AppSettings["cnn"];
Stopwatch timer = new Stopwatch();

for (int i = 0; i < 10; i++)
{
timer.Start();

using (SqlConnection cnn = new SqlConnection(strCnn))
{
using (SqlCommand cmd = new SqlCommand("Select * from Clientes where cpf like '%317395%' and nome like '%Minato%'", cnn))
{
cnn.Open();
var reader = cmd.ExecuteReader(CommandBehavior.SingleResult | CommandBehavior.CloseConnection);
}

}
timer.Stop();
Console.WriteLine("Utilizando Corretamente o Indice (CPf, Nome) " + timer.Elapsed);
timer.Reset();


timer.Start();

using (SqlConnection cnn = new SqlConnection(strCnn))
{
using (SqlCommand cmd = new SqlCommand("Select * from Clientes where nome like '%Minato%' and cpf like '%317395%'", cnn))
{
cnn.Open();
var reader = cmd.ExecuteReader(CommandBehavior.SingleResult | CommandBehavior.CloseConnection);
}

}
timer.Stop();
Console.WriteLine("Utiliando com a ordem invertida (Nome, CPF) " + timer.Elapsed);
timer.Reset();

}

Console.ReadKey();


}
}

 

Então fica a dica. ;-), vamos usar os indices na sequencia correta.

Sigam @DicaDoNerd.