AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 224081
Accepted
Tom_W
Tom_W
Asked: 2018-12-05 04:17:27 +0800 CST2018-12-05 04:17:27 +0800 CST 2018-12-05 04:17:27 +0800 CST

Melhor maneira de acelerar solicitações usando colunas de data

  • 772

Nosso banco de dados está recebendo as seguintes solicitações:

select * from [schema].[table] (nolock) where (Date_A > Date_B and Archive = 0)

Esta é uma solicitação normal que é feita pelo nosso aplicativo. Em média, o pedido está demorando entre 200ms - 400ms para ser concluído, com cerca de 100ms - 150ms na CPU. As leituras normalmente chegam a cerca de 48k. Este é pelo menos um exemplo de como esse script funciona.

Qual seria a melhor forma (se houver) de agilizar esse tipo de solicitação?

A tabela tem 240.932 linhas e as consultas retornam 0 registros.

sql-server performance
  • 1 1 respostas
  • 86 Views

1 respostas

  • Voted
  1. Best Answer
    Josh Darnell
    2018-12-05T06:23:16+08:002018-12-05T06:23:16+08:00

    Se houver apenas um pequeno subconjunto de linhas com Archive = 0, você poderá usar um índice filtrado:

    CREATE NONCLUSTERED INDEX IX_Archive_Filtered
        ON [schema].[table] ([Date_A], [Date_B])
        INCLUDE ([Archive])
        WHERE ([Archive] = 0)
    

    Observação: fiz o índice nos dois campos de data apenas porque não conheço nenhum outro campo em sua tabela - pode fazer mais sentido que isso esteja em um campo diferente

    Nota adicional: sempre tome cuidado para incluir as colunas de filtragem nas chaves de índice filtradas ou nas colunas incluídas, então aqui para um exemplo do porquê: Estimativa de linha incorreta fornecida com um índice filtrado

    Isso mantém o índice pequeno (o que significa que ele usa menos armazenamento e é mais rápido de ler), porque apenas as linhas em que Archive é 0 são incluídas nele.

    Se um índice filtrado não funcionar para você (e há vários cenários em que eles não funcionam, consulte Índices filtrados e SQL dinâmico para um exemplo), você pode tentar um índice normal não clusterizado no campo de arquivo OU na data Campos. Você gostaria de criar o índice em qualquer campo que fosse mais seletivo - o que significa qual deles restringirá mais os resultados.

    Por exemplo, novamente, se apenas um pequeno subconjunto de suas linhas tiver um valor de Arquivo de 0, você poderá criar este índice:

    CREATE NONCLUSTERED INDEX IX_Archive_Includes
        ON [schema].[table] ([Archive])
        INCLUDE ([Date_A], [Date_B])
    

    Isso permitirá que sua consulta busque as linhas corretas (onde Arquivo é 0) e, em seguida, filtre facilmente em Data_A e Data_B.

    Comentários adicionais sobre sua consulta:

    • você realmente não deveria usar select *- enumere cada um dos campos que você realmente precisa em seus resultados para ser mais eficiente e permitir uma indexação mais eficaz
    • você não deve usar nolockse a precisão dos resultados for importante
      • veja este post para uma demonstração rápida de como os resultados podem estar errados com o nolock: Usando NOLOCK? Veja como você obterá os resultados de consulta errados
      • veja este post para muito mais detalhes sobre o uso do nolock (que é o mesmo que o nível de isolamento não confirmado de leitura): The Read Uncommitted Isolation Level
    • 5

relate perguntas

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve