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 / 281518
Accepted
Martin Riddar
Martin Riddar
Asked: 2020-12-15 06:04:43 +0800 CST2020-12-15 06:04:43 +0800 CST 2020-12-15 06:04:43 +0800 CST

Consulta na tabela particionada acessando mais partições do que o necessário?

  • 772

Eu postei isso pela primeira vez no SO, mas não obtive respostas, esta é a razão pela qual estou tentando aqui agora e espero não estar quebrando nenhuma regra ao fazê-lo (dedos cruzados).

Estou tentando entender como usar o particionamento de tabelas e a eliminação de partições corretamente para poder decidir se quero usá-lo ou não em um novo banco de dados (sql server 17 express). Estou inclinado a não usá-lo, mas essa é uma história diferente, então essa pergunta é mais que eu não quero saber como funciona agora. No script a seguir eu crio uma função e esquema de particionamento, uma tabela usando o esquema, insiro alguns dados e depois consulto de 3 maneiras diferentes.

  • A primeira consulta está acessando corretamente apenas a primeira partição (contagem real de partições = 1, partições reais acessadas = 1).

  • Espero que a segunda consulta acesse apenas a primeira partição, já que criei a função de partição como intervalo no valor 20200101, mas ela está acessando as partições 1 e 2 (contagem real de partições = 2, partições reais acessadas = 1. .2).

  • Espero que a terceira consulta acesse apenas a partição 2, mas está acessando as partições 2 e 3 (contagem real de partições = 2, partições reais acessadas = 2..3).

Estou ciente de que preciso ter uma correspondência de tipo exata para que a eliminação de partição ocorra, mas acho que tenho isso aqui? o que estou perdendo?

create partition function partfun (datetime2(0))
as range right for values ('20200101', '20210101')

create partition scheme ps
as partition partfun all to ([primary])

create table t
(
    id int not null identity(1,1),
    logdate datetime2(0)
) on ps(logdate)
insert into t values ('20190101'),('20200102')

select * from t where logdate < cast('20191231' as datetime2(0))
select * from t where logdate < cast('20200101' as datetime2(0))
select * from t where logdate >= cast('20200101' as datetime2(0)) and t.logdate < cast('20210101' as datetime2(0))
partitioning sql-server-2017
  • 1 1 respostas
  • 264 Views

1 respostas

  • Voted
  1. Best Answer
    Dan Guzman
    2020-12-17T07:42:26+08:002020-12-17T07:42:26+08:00

    Essas consultas triviais são parametrizadas automaticamente. Como tal, os valores literais são substituídos por parâmetros durante a compilação. As partições são eliminadas em tempo de execução dinamicamente usando a função interna RangePartitonNew em um predicado de busca de intervalo. É importante ressaltar que o intervalo inicial/final do predicado de busca é inclusivo para que o mesmo plano armazenado em cache possa ser reutilizado para qualquer valor possível, não apenas correspondências de limite exatas como em suas consultas. As linhas são posteriormente filtradas com base no WHEREpredicado da cláusula para retornar apenas as linhas desejadas.

    Abaixo está o predicado de busca das primeiras 2 consultas. Em tempo de execução, a primeira consulta seek é equivalente a partition_number >= 1 AND partition_number <= 1e a segunda é partition_number >= 1 AND partition_number <= 2. A partição 1 é codificada como o intervalo inicial devido ao operador menor que.

    Seek Keys[1]: 
        Start: PtnId1001 >= Scalar Operator((1)),
        End: PtnId1001 <= Scalar Operator(RangePartitionNew(CONVERT(datetime2(0),[@1],0),(1),'2020-01-01 00:00:00','2021-01-01 00:00:00'))
    

    O predicado de busca da terceira consulta difere apenas porque o intervalo inicial também inclui RangePartitionNew para eliminar partições excluídas pelo operador de comparação maior ou igual a. Esta busca é equivalente ao predicado partition_number >= 2 AND partition_number <= 3.

    Seek Keys[1]: 
        Start: PtnId1001 >= Scalar Operator(RangePartitionNew(CONVERT(datetime2(0),[@1],0),(1),'2020-01-01 00:00:00','2021-01-01 00:00:00')),
            End: PtnId1001 <= Scalar Operator(RangePartitionNew(CONVERT(datetime2(0),[@2],0),(1),'2020-01-01 00:00:00','2021-01-01 00:00:00'))
    

    Você pode evitar a parametrização simples com estas técnicas do artigo do blog de Paul :

    • OPÇÃO (RECOMPILAR)
    • Adicione um predicado fictício comoWHERE 1 <> 2

    Se os valores de limite exatos forem seu único caso de uso, você poderá adicionar um predicado para avaliar a função de partição com um operador de comparação menor que. Isso manterá os benefícios da parametrização. Por exemplo:

    AND $PARTITION.partfun(logdate) < $PARTITION.partfun('20200101')
    

    O predicado de busca de plano parametrizado resultante subtrai um do final do intervalo de limite para eliminar a partição excluída pelo predicado acima:

    Seek Keys[1]: 
        Start: PtnId1001 >= Scalar Operator((1)), 
        End: PtnId1001 <= Scalar Operator(RangePartitionNew(CONVERT_IMPLICIT(datetime2(0),[@2],0),(1),'2020-01-01 00:00:00','2021-01-01 00:00:00')-(1))
    

    Observe que um índice na coluna de particionamento reduzirá a necessidade dessas soluções alternativas. Mesmo que uma partição extra seja tocada com valores de limite exatos, a sobrecarga é apenas algumas leituras lógicas adicionais.

    • 1

relate perguntas

  • Como armazenar melhor os dados do Google Web Ngram?

  • Particionamento de tabela

  • Reindexando Índices de Tabelas Particionadas

  • É possível no SQL Server 2008 ter Estruturas em um arquivo e Dados de Linhas em outro arquivo?

  • É possível com o SQL Server 2008 ter tabelas particionadas com uma coluna de identidade?

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