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 / 87317
Accepted
Justin
Justin
Asked: 2015-01-01 03:49:58 +0800 CST2015-01-01 03:49:58 +0800 CST 2015-01-01 03:49:58 +0800 CST

Usando exibições indexadas para agregações - bom demais para ser verdade?

  • 772

Temos um data warehouse com uma contagem de registros bastante grande (10 a 20 milhões de linhas) e geralmente executamos consultas que contam registros entre determinadas datas ou contam registros com determinados sinalizadores, por exemplo

SELECT
    f.IsFoo,
    COUNT(*) AS WidgetCount
FROM Widgets AS w
JOIN Flags AS f
    ON f.FlagId = w.FlagId
WHERE w.Date >= @startDate
GROUP BY f.IsFoo

O desempenho não é terrível, mas pode ser relativamente lento (talvez 10 segundos em um cache frio).

Recentemente, descobri que posso usar GROUP BYem exibições indexadas e tentei algo semelhante ao seguinte

CREATE VIEW TestView
WITH SCHEMABINDING
AS
    SELECT
        Date,
        FlagId,
        COUNT_BIG(*) AS WidgetCount
    FROM Widgets
    GROUP BY Date, FlagId;
GO

CREATE UNIQUE CLUSTERED INDEX PK_TestView ON TestView
(
    Date,
    FlagId
);

Como resultado, o desempenho da minha primeira consulta agora é < 100ms e a exibição e o índice resultantes são < 100k (embora nossa contagem de linhas seja grande, o intervalo de datas e IDs de sinalizador significa que essa exibição contém apenas 1.000 a 2.000 linhas).

Eu pensei que talvez isso prejudicasse o desempenho das gravações na tabela Widget, mas não - o desempenho das inserções e atualizações nesta tabela é praticamente inalterado, tanto quanto eu posso dizer (além disso, sendo um data warehouse, esta tabela é atualizada com pouca frequência de qualquer forma)

Para mim, isso parece bom demais para ser verdade - é? Com o que preciso ter cuidado ao usar exibições indexadas dessa maneira?

sql-server index
  • 2 2 respostas
  • 13108 Views

2 respostas

  • Voted
  1. Best Answer
    Aaron Bertrand
    2015-01-01T04:25:50+08:002015-01-01T04:25:50+08:00

    Como você notou, a visão em si materializa apenas um pequeno número de linhas - portanto, mesmo que você atualize a tabela inteira, a E/S adicional envolvida na atualização da visão é insignificante. Você provavelmente já sentiu a maior dor que vai sentir ao criar a visualização. O próximo próximo será se você adicionar um zilhão de linhas à tabela base com vários novos IDs que requerem novas linhas na exibição.

    Isso não é bom demais para ser verdade. Você está usando exibições indexadas exatamente como elas devem ser usadas - ou pelo menos uma das maneiras mais eficazes: pagar por futuras agregações de consulta no momento da gravação. Isso funciona melhor quando o resultado é muito menor que a origem e, claro, quando as agregações são solicitadas com mais frequência do que os dados subjacentes são atualizados (mais comum em DW do que em OLTP, geralmente).

    Infelizmente, muitas pessoas pensam que indexar uma exibição é mágico - um índice não tornará todas as exibições mais eficientes, especialmente exibições que simplesmente juntam tabelas e/ou produzem o mesmo número de linhas que a fonte (ou até multiplicam). Nesses casos, o I/O da exibição é o mesmo ou até pior do que a consulta original, não apenas porque existem as mesmas ou mais linhas, mas também porque geralmente armazenam e materializam mais colunas. Portanto, materializá-los antecipadamente não fornece nenhum ganho, pois - mesmo com SSDs - E/S, rede e processamento/renderização do cliente ainda permanecem os principais gargalos no retorno de grandes conjuntos de resultados para o cliente. A economia obtida ao evitar a junção em tempo de execução não é mensurável em comparação com todos os outros recursos que você ainda está usando.

    Assim como os índices não agrupados, apenas tome cuidado para não exagerar. Se você adicionar 10 exibições indexadas diferentes a uma tabela, verá mais impacto na parte de gravação de sua carga de trabalho, especialmente se a(s) coluna(s) de agrupamento não for(em) a chave de agrupamento.

    Puxa, eu tenho significado para o blog sobre este tema.

    • 29
  2. usr
    2015-01-01T04:37:52+08:002015-01-01T04:37:52+08:00

    As respostas de Aaron cobriram bem essa questão. Duas coisas a acrescentar:

    1. Visualizações indexadas de agregação podem levar a conflitos e conflitos entre linhas. Normalmente, duas inserções não causam deadlock (exceto em condições bastante raras, como escalonamento de bloqueio ou colisões de hash de bloqueio). Mas, se ambas as inserções abordarem o mesmo grupo na exibição, elas competirão. O mesmo ponto representa qualquer outra coisa que aceite bloqueios (DML, dicas de bloqueio).
    2. Visualizações indexadas que não agregam também podem ser úteis. Eles permitem que você indexe colunas de várias tabelas. Dessa forma, você pode filtrar com eficiência uma tabela e ordenar por uma coluna de uma tabela unida. Esse padrão pode converter a junção de tabela completa em pequenas consultas de tempo constante.

    Eu usei a agregação e as exibições de junção com extremo benefício.

    Em suma, o seu caso de uso parece um caso perfeito. Visualizações indexadas são uma técnica muito subutilizada.

    • 22

relate perguntas

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

  • Quanto "Padding" coloco em meus índices?

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

  • O que significa "índice" em RDBMSs? [fechado]

  • Como criar um índice condicional no MySQL?

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