Dois sql para data de carimbo de data/hora classificada
-
13-12-2019 - |
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ê?
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)