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 / 16067
Accepted
Shaul Behr
Shaul Behr
Asked: 2012-04-05 03:35:09 +0800 CST2012-04-05 03:35:09 +0800 CST 2012-04-05 03:35:09 +0800 CST

Como fazer com que uma visão de união seja executada com mais eficiência?

  • 772

Tenho uma tabela grande (dezenas a centenas de milhões de registros) que dividimos por motivos de desempenho em tabelas ativas e de arquivo, usando um mapeamento de campo direto e executando um processo de arquivo todas as noites.

Em vários lugares do nosso código, precisamos executar consultas que combinam as tabelas ativas e arquivadas, quase invariavelmente filtradas por um ou mais campos (nos quais obviamente colocamos índices em ambas as tabelas). Por conveniência, faria sentido ter uma visão como esta:

create view vMyTable_Combined as
select * from MyTable_Active
union all
select * from MyTable_Archive

Mas se eu executar uma consulta como

select * from vMyTable_Combined where IndexedField = @val

ele fará a união em tudo , desde Active e Store antes de filtrar por @val, o que prejudicará o desempenho.

Existe alguma maneira inteligente de fazer com que as duas subconsultas da união visualizem cada filtro @valantes de criarem a união?

Ou talvez haja alguma outra abordagem que você sugeriria para alcançar o que estou procurando, ou seja, uma maneira fácil e eficiente de obter o conjunto de registros da união, filtrado pelo campo indexado?

EDIT: aqui está o plano de execução (e você pode ver os nomes reais das tabelas aqui):

plano de execução

Curiosamente, a tabela ativa está realmente usando o índice correto (além de uma pesquisa RID?), mas a tabela de arquivo está fazendo uma varredura na tabela!

sql-server index
  • 2 2 respostas
  • 17296 Views

2 respostas

  • Voted
  1. Best Answer
    ConcernedOfTunbridgeWells
    2012-04-05T04:39:21+08:002012-04-05T04:39:21+08:00

    Os comentários sobre a questão mostram que o problema é que o banco de dados de teste que o OP estava usando para desenvolver a consulta tinha características de dados radicalmente diferentes do banco de dados de produção. Ele tinha muito menos linhas e o campo usado para filtragem não era seletivo o suficiente.

    Quando o número de valores distintos em uma coluna é muito pequeno, o índice pode não ser suficientemente seletivo. Nesse caso, uma varredura de tabela sequencial é mais barata do que uma operação de busca de índice/pesquisa de linha. Normalmente, uma varredura de tabela faz uso extensivo de E/S sequencial, que é muito mais rápida do que as leituras de acesso aleatório.

    Freqüentemente, se uma consulta retornar mais do que apenas uma pequena porcentagem de linhas, será mais barato fazer apenas uma varredura de tabela do que uma busca de índice/pesquisa de linha ou operação semelhante que faz uso pesado de E/S aleatória.

    • 8
  2. Michael Møldrup
    2019-04-11T06:51:34+08:002019-04-11T06:51:34+08:00

    Só para acrescentar, o que eu encontrei. Se você fizer:

    create view vMyTable_Combined as
    select *, 1 AS [Active] from MyTable_Active
    union all
    select *, 0 AS [Active] from MyTable_Archive
    

    Em seguida, você pode filtrar no campo [Ativo] e garantir que a outra parte não seja carregada.

    • 1

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

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 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

    Como selecionar a primeira linha de cada grupo?

    • 6 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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