Tenho uma qeuery que verifica onde duas colunas não estão '' (em branco) - [em branco e NULL não são iguais neste caso]
Existe alguma maneira de melhorar o desempenho da consulta
SELECT *
FROM myTable
WHERE Currency <> ''
AND Country <> ''
Pelo que entendi, <>
está causando uma verificação completa da tabela?
Essas colunas têm índices nelas? Essa é uma informação bastante vital para questões como esta. Se não houver nenhum índice cobrindo nenhuma dessas colunas, não há nada que ele possa fazer, exceto a varredura da tabela para corresponder a esses filtros.
Se houver pelo menos um índice cobrindo um (ou ambos) que ele possa usar, ele poderá decidir contra ele de qualquer maneira devido ao
SELECT *
. Se a seletividade do índice sugerir que muitas linhas corresponderão, uma varredura de tabela pode ser realmente mais eficiente do que uma busca/varredura de índice seguida de pesquisas de linha para obter o restante dos dados que não estão contidos no índice.Por exemplo, se eu correr
em um de nossos sistemas, ele executa apenas uma busca de índice. Corrida
em vez disso, executa uma varredura de tabela. Se eu forçar a escolha do índice com
ele executa uma busca de índice para localizar o início dos registros e, em seguida, as pesquisas RID para localizar todos os outros dados da coluna. De acordo com a saída do plano de consulta, ele julga que isso é aproximadamente 6 vezes mais caro do que apenas fazer a varredura da tabela, sendo os custos estimados das três consultas acima de 0,22926, 1,81429 e 11,1612, respectivamente. Nesse caso, o número de linhas correspondentes à
WHERE
cláusula é ~55% de ~50.000.Presumo que você esteja usando o SQL Server (referência T-SQL lá).
Ao executar o T-SQL, você pode optar por incluir o plano de execução real , isso permitirá ver como o SQL foi executado, incluindo se ocorreu uma verificação. Dentro desse plano de execução, o SQL pode até dar dicas de como melhorar o desempenho que você pode ou não decidir adotar.
http://technet.microsoft.com/en-us/library/ms189562.aspx http://sqlserverplanet.com/optimization/execution-plans
Espero que isto ajude!
Em vez de usar 'diferente', você pode usar 'maior que'.
Sem o predicado, quatro linhas são retornadas; com, três. Este é o resultado desejado.
Isso pressupõe um agrupamento ocidental. Caso contrário, faça um teste para ver o que é retornado.
É claro que o otimizador ainda pode optar por não usar o índice dependendo de muitos critérios.