Pergunta

Tenho dados de 98 linhas.Quando quero classificar meus dados com pub_time, encontrei algo interessante.

Aqui está o SQL:

select * 
from t_p_blog_article_info t  
order by t.pub_time desc

Custou 19s.

select * 
from t_p_blog_article_info t 
where t.pub_time > to_date( '1900-01-01 01:00:00', 'yyyy-mm-dd   hh24:mi:ss ')  
order by t.pub_time desc

Custou 0,2s.

Eu quero saber, por quê?

Foi útil?

Solução

Você provavelmente tem um índice pub_time na sua tabela.

Portanto, a segunda consulta pode fazer uso deste índice para retornar apenas os registros com datas não nulas após a data especificada, enquanto a primeira consulta deve consultar a tabela inteira.

Outras dicas

Há uma série de possibilidades.Você pode estar filtrando um grande número de linhas com datas inválidas/nulas em pub_time, mas duvido que não perceba/mencione um número significativo delas.

As três coisas que ficam na minha mente são:

1 - Você tem um índice ou índice composto envolvendo pub_time, e a restrição na sua cláusula where está acionando o uso de um caminho de acesso diferente

2 - Você não tinha estatísticas disponíveis para o otimizador quando executou sua primeira consulta.Ao executar a segunda consulta, um caminho de acesso melhor foi selecionado graças a algum armazenamento em cache de informações que ocorreu quando você executou a primeira consulta.Isso pode ser verificado executando a primeira consulta mais algumas vezes e verificando se há uma melhoria significativa no desempenho.

3 - Semelhante ao primeiro ponto, o otimizador poderia apenas selecionar um caminho de acesso melhor baseado unicamente nas implicações da cláusula where.Talvez dar a dica de que valores nulos/inválidos não precisarão ser manipulados seja suficiente - seu sistema pode estar evitando uma ou mais varreduras completas de tabela para eliminar pub_times inválidos/nulos.

Identificar as razões para coisas como essa está rapidamente se tornando um empreendimento empírico - é difícil para mim dizer mais sem conhecer sua plataforma e versão.Pela tag, presumo que você esteja usando o Oracle; nesse caso, você poderá usar alguma forma de ferramenta "explicar consulta" ou "explicar plano" para ter uma noção melhor do que está acontecendo.Para obter mais informações sobre o otimizador Oracle, consulte http://docs.oracle.com/cd/B10500_01/server.920/a96533/optimops.htm (Isto é para Oracle 9i v9.2, mas tem uma explicação decente dos conceitos independentes de versão)

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