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 / 275890
Accepted
Avi
Avi
Asked: 2020-09-23 06:21:18 +0800 CST2020-09-23 06:21:18 +0800 CST 2020-09-23 06:21:18 +0800 CST

Elimine o operador de filtro antes do operador de verificação de índice columnstore

  • 772

Eu tenho uma grande tabela de fatos com milhões de linhas chamada MyLargeFactTable e é uma tabela de armazenamento de colunas em cluster.

Também há uma restrição de chave primária composta (colunas customer_id,location_id,order_date).

Eu também tenho uma tabela temporária #my_keys_to_filter_MyLargeFactTable, com as mesmas 3 colunas, e contém alguns milhares de combinações ÚNICAS desses 3 valores de chave.

A consulta a seguir me retorna o conjunto de resultados desejado

...
FROM #my_keys_to_filter_MyLargeFactTable AS t
JOIN dbo.MyLargeFactTable AS m
ON m.customer_id = t.customer_id
AND m.location_id = t.location_id
AND m.order_date = t.order_date

mas noto que o Operador de varredura de índice na tabela de fatos retorna mais linhas do que deveria (cerca de um milhão) e o alimenta em um operador de filtro, o que reduz ainda mais o conjunto de resultados para os poucos milhares de linhas desejados.

insira a descrição da imagem aqui

O operador Index Scan lê muitas linhas (eles são linhas bastante largas), aumentando a E/S e diminui significativamente toda a consulta.

Meus parâmetros não são sargáveis?

Como eu poderia remover o operador Filter e de alguma forma forçar o operador Index Scan a ler apenas alguns milhares de linhas?

Definições da tabela:

create table #my_keys_to_filter_MyLargeFactTable 
(
customer_id varchar(96) not null,
location_id varchar(96) not null,
order_date date not null,
primary key clustered (customer_id,location_id,order_date)
)

create table MyLargeFactTable
(
customer_id varchar(96) not null,
location_id varchar(96) not null,
order_date date not null,
...
lot of wide decimal typed columns, and even large varchars
...
PRIMARY KEY NONCLUSTERED  (customer_id,location_id,order_date),
INDEX cci CLUSTERED COLUMNSTORE
)
sql-server t-sql
  • 1 1 respostas
  • 249 Views

1 respostas

  • Voted
  1. Best Answer
    Paul White
    2020-09-24T04:13:02+08:002020-09-24T04:13:02+08:00

    Como eu poderia remover o operador Filter e de alguma forma forçar o operador Index Scan a ler apenas alguns milhares de linhas?

    O operador Filter está aplicando o bitmap criado nas colunas de junção na junção de hash.

    Dos três predicados de junção, apenas order_datetem um tipo de dados com suporte para empilhamento de bitmap para a varredura de armazenamento de coluna. Se você observar o Predicado na varredura, deverá ver isso como algo como:

    PROBE([Opt_Bitmap1005],[dbo].[MyLargeFactTable].[order_date])
    

    Os predicados de junção restantes são strings e, portanto, aparecerão no Filtro como parte do teste de bitmap completo:

    PROBE([Opt_Bitmap1005],
        [dbo].[MyLargeFactTable].[customer_id],
        [dbo].[MyLargeFactTable].[location_id],
        [dbo].[MyLargeFactTable].[order_date])
    

    Empurrar (partes de) o teste de bitmap para a varredura de armazenamento de colunas é uma otimização que está disponível apenas para tipos de dados que podem caber em 64 bits (como dateno seu exemplo). Observe que o empilhamento de bitmap de junção é diferente do empilhamento de predicado de string (por exemplo, pressionando customer_id LIKE '%XYZ%').

    Existem várias maneiras de contornar essa limitação. Reprojetar o esquema de forma que cadeias longas sejam movidas para uma tabela de dimensões e referenciadas usando uma chave inteira é uma opção.

    Um pouco menos intrusivo, você pode adicionar um inteiro checksumao armazenamento de colunas (infelizmente não como uma coluna computada persistente) e uma tabela temporária, então adicione isso na junção - por exemplo, um inteiro calculado de CHECKSUM(customer_id, location_id, order_date)ou algo semelhante.

    Ainda haveria um Filtro, mas o bitmap incluiria a coluna de soma de verificação, que poderia ser inserida na varredura. Isso deve reduzir significativamente o número de linhas passadas para o filtro.

    • 6

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