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 / 211961
Accepted
Gabe
Gabe
Asked: 2018-07-12 14:50:14 +0800 CST2018-07-12 14:50:14 +0800 CST 2018-07-12 14:50:14 +0800 CST

Predicar pushdown na visualização para otimizar a consulta?

  • 772

Eu tenho uma visão que faz referência a uma tabela de fatos Cost com 300 milhões de registros. Essa visão também tem algumas junções. A tabela de fatos tem um índice clusterizado em Data e a definição da visualização é algo assim:

select * 
from FactCost f
INNER JOIN SomeOtherTable b on a.id = f.id
where f.Date < getdate()-7

Se eu consultar a exibição como abaixo, o otimizador primeiro processará o predicado na exibição e, em seguida, a data na minha consulta. Então, na verdade, ele lê 300 milhões de registros e retorna apenas 1 milhão. Não consigo descobrir que tipo de solução alternativa posso tentar otimizar isso.

SELECT
              *
    FROM [dbo].vwFactCost
    WHERE Date >= '2011-07-01'
        AND Date <= '2011-07-31'

Veja abaixo insira a descrição da imagem aqui


EDITAR

:

Encontrei esse outro cenário em que a solução não era intuitiva.

tabela: FactRegistrationcom 300m registros, 30 colunas, RegDateé coluna de data

abaixo está a definição de visualização:

SELECT <columns>
FROM FactRegistration fr
WHERE FR.RegDate < CAST(DATEADD(DAY,-7,GETDATE()) AS DATE)

consulta:

SELECT <columns>
INTO #tmp
FROM edw.dbo.vwDemo_slow fr
WHERE fr.RegDate >= CAST('20140501' AS DATE)
    AND fr.RegDate <= CAST('20140531' AS DATE)

Resultados neste plano ( https://gist.github.com/gflores1023/f0f0089315841d21ab072837cf12145d ): insira a descrição da imagem aqui

Se eu alterar a definição de exibição para usar esta cláusula WHERE:

WHERE FR.RegDate < CAST(CAST(DATEADD(DAY,-7,GETDATE()) AS DATE) AS DATETIME)

Eu recebo um plano muito melhor ( https://gist.github.com/gflores1023/e3904609c98babbbbc646eaec76ebba4 ):

insira a descrição da imagem aqui

Executando o SQL Server 2016 SP1

sql-server optimization
  • 1 1 respostas
  • 1671 Views

1 respostas

  • Voted
  1. Best Answer
    Aaron Bertrand
    2018-07-13T07:48:36+08:002018-07-13T07:48:36+08:00

    Eu sugeriria:

    • altere a abreviação não recomendada getdate()-7para a adequada e explícitaCONVERT(datetime2(2), DATEADD(DAY, -7, GETDATE()))
    • evitando SELECT *em todos os lugares, especialmente na vista
    • altere seu predicado para um intervalo aberto (>= 1º de julho e < 1º de agosto)
    • converter explicitamente literais para evitar conversões implícitas
    • evite formatos regionais inseguros como aaaa-mm-dd

    Então:

    WHERE SpendDate >= CONVERT(datetime2(2), '20180601')
      AND SpendDate <  CONVERT(datetime2(2), '20180701');
    

    Isso não apenas protege contra conversões implícitas e interpretação ydm, como também é muito mais fácil encontrar o início do próximo mês do que o final do mês atual.

    • 3

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

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

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

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