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 / 159498
Accepted
MattyZDBA
MattyZDBA
Asked: 2016-12-30 10:27:22 +0800 CST2016-12-30 10:27:22 +0800 CST 2016-12-30 10:27:22 +0800 CST

Função de Partição Baseada em Tempo Divisão Movendo Dados para Novo FG Apesar do Limite no Futuro

  • 772

Estou praticando a divisão de uma função de partição em uma caixa de controle de qualidade para adicionar novas partições para o próximo ano civil. Estou executando o SQL Server Enterprise Edition, nível de patch 12.0.4100. Aqui está a definição da função atual...

CREATE PARTITION FUNCTION [PF_UTC](datetime2(7)) AS RANGE LEFT 
FOR VALUES (N'2012-01-01T00:00:00.000', N'2012-04-01T00:00:00.000', 
N'2012-07-01T00:00:00.000', N'2012-10-01T00:00:00.000', 
N'2013-01-01T00:00:00.000', N'2013-04-01T00:00:00.000', 
N'2013-07-01T00:00:00.000', N'2013-10-01T00:00:00.000', 
N'2014-01-01T00:00:00.000', N'2014-04-01T00:00:00.000', 
N'2014-07-01T00:00:00.000', N'2014-10-01T00:00:00.000', 
N'2015-01-01T00:00:00.000', N'2015-04-01T00:00:00.000', 
N'2015-07-01T00:00:00.000', N'2015-10-01T00:00:00.000', 
N'2016-01-01T00:00:00.000', N'2016-04-01T00:00:00.000')

Três esquemas de partição foram definidos no momento da criação da função, mas apenas o primeiro é utilizado com os arquivos de dados adicionados.

CREATE PARTITION SCHEME [PS_UTC_Clustered] AS PARTITION [PF_UTC] TO (
    [Partitioned_Pre2012_Clustered]
    ,[Partitioned_2012Q1_Clustered]
    ,[Partitioned_2012Q2_Clustered]
    ,[Partitioned_2012Q3_Clustered]
    ,[Partitioned_2012Q4_Clustered]
    ,[Partitioned_2013Q1_Clustered]
    ,[Partitioned_2013Q2_Clustered]
    ,[Partitioned_2013Q3_Clustered]
    ,[Partitioned_2013Q4_Clustered]
    ,[Partitioned_2014Q1_Clustered]
    ,[Partitioned_2014Q2_Clustered]
    ,[Partitioned_2014Q3_Clustered]
    ,[Partitioned_2014Q4_Clustered]
    ,[Partitioned_2015Q1_Clustered]
    ,[Partitioned_2015Q2_Clustered]
    ,[Partitioned_2015Q3_Clustered]
    ,[Partitioned_2015Q4_Clustered]
    ,[Partitioned_2016Q1_Clustered]
    ,[Partitioned_2016Q2_Clustered]
    )

CREATE PARTITION SCHEME [PS_UTC_NonClustered] AS PARTITION [PF_UTC] TO (
    [Partitioned_Pre2012_NonClustered]
    ,[Partitioned_2012Q1_NonClustered]
    ,[Partitioned_2012Q2_NonClustered]
    ,[Partitioned_2012Q3_NonClustered]
    ,[Partitioned_2012Q4_NonClustered]
    ,[Partitioned_2013Q1_NonClustered]
    ,[Partitioned_2013Q2_NonClustered]
    ,[Partitioned_2013Q3_NonClustered]
    ,[Partitioned_2013Q4_NonClustered]
    ,[Partitioned_2014Q1_NonClustered]
    ,[Partitioned_2014Q2_NonClustered]
    ,[Partitioned_2014Q3_NonClustered]
    ,[Partitioned_2014Q4_NonClustered]
    ,[Partitioned_2015Q1_NonClustered]
    ,[Partitioned_2015Q2_NonClustered]
    ,[Partitioned_2015Q3_NonClustered]
    ,[Partitioned_2015Q4_NonClustered]
    ,[Partitioned_2016Q1_NonClustered]
    ,[Partitioned_2016Q2_NonClustered]
    )
CREATE PARTITION SCHEME [PS_UTC_Text] AS PARTITION [PF_UTC] TO (
    [Partitioned_Pre2012_Text]
    ,[Partitioned_2012Q1_Text]
    ,[Partitioned_2012Q2_Text]
    ,[Partitioned_2012Q3_Text]
    ,[Partitioned_2012Q4_Text]
    ,[Partitioned_2013Q1_Text]
    ,[Partitioned_2013Q2_Text]
    ,[Partitioned_2013Q3_Text]
    ,[Partitioned_2013Q4_Text]
    ,[Partitioned_2014Q1_Text]
    ,[Partitioned_2014Q2_Text]
    ,[Partitioned_2014Q3_Text]
    ,[Partitioned_2014Q4_Text]
    ,[Partitioned_2015Q1_Text]
    ,[Partitioned_2015Q2_Text]
    ,[Partitioned_2015Q3_Text]
    ,[Partitioned_2015Q4_Text]
    ,[Partitioned_2016Q1_Text]
    ,[Partitioned_2016Q2_Text]
    )

Não estou planejando criar os trimestres 2016T3 e 2016T4, pois não quero incorrer na movimentação de dados entre os grupos de arquivos. Decidi começar com 01/01/2017 e criar um grupo de arquivos 2017Q1. Eu executo o seguinte, antecipando que será uma metamodificação rápida.

--CREATE 2017Q1 FG
USE [master];

ALTER DATABASE [JMQ] ADD FILEGROUP [JMQ_2017Q1];

--ADD 2017Q1 Data Files
ALTER DATABASE [JMQ] ADD FILE (
    NAME = N'JMQ_2017Q1_01'
    ,FILENAME = N'M:\DATA\mssql\data\JMQ_2017Q1_01.ndf'
    ,SIZE = 1024000 KB
    ,FILEGROWTH = 1024000 KB
    ) TO FILEGROUP [JMQ_2017Q1]

--ALTER PARTITION SCHEME NEXT USED FOR NEW FG
USE [JMQ];

ALTER PARTITION SCHEME PS_UTC_Clustered NEXT USED [JMQ_2017Q1];

USE [JMQ];

ALTER PARTITION SCHEME PS_UTC_NonClustered NEXT USED [JMQ_2017Q1];

USE [JMQ];

ALTER PARTITION SCHEME PS_JMQ_UTC_Text NEXT USED [JMQ_2017Q1];

--ALTER PARTITION FUNCTION TO SPLIT RANGE ON 1/1/17 00:00:00
USE [JMQ];

ALTER PARTITION FUNCTION PF_UTC () SPLIT RANGE ('2017-01-01 00:00:00')

Mas agora, está funcionando há 90 minutos. Estou observando pelo Spotlight que o novo arquivo de dados está sendo preenchido. Eu verifico as datas UTC em todas as tabelas no banco de dados em Prod e confirmo que nada é datado após 01/01/2017. Entendo que o mecanismo precisa buscar/varrer índices para confirmar que nada precisa ser movido para o FG, mas se nenhum registro estiver qualificado para mover, por que toda a movimentação de dados?

sql-server partitioning
  • 2 2 respostas
  • 889 Views

2 respostas

  • Voted
  1. Hannah Vernon
    2016-12-30T10:40:00+08:002016-12-30T10:40:00+08:00

    Presumivelmente, você tem linhas datadas depois 2016-04-01? Nesse caso, eles residem atualmente na última partição.

    Dividir a função esquerda do intervalo mais à direita em dois intervalos resultará em quaisquer linhas datadas depois de 2016-04-01serem movidas para o novo intervalo em virtude do fato de os intervalos serem definidos como "intervalo esquerdo".

    Você pode ver um bom visual disso nesta página do MSDN .

    Esta página do MSDN nosALTER PARTITION FUNCTION estados:

    Melhores práticas
    Sempre mantenha as partições vazias em ambas as extremidades do intervalo de partições para garantir que a divisão da partição (antes de carregar novos dados) e a fusão da partição (após o descarregamento de dados antigos) não causem nenhuma movimentação de dados. Evite dividir ou mesclar partições preenchidas. Isso pode ser extremamente ineficiente, pois pode causar até quatro vezes mais geração de logs e também pode causar bloqueios graves.

    Você deve certificar-se de adicionar uma partição extra após a conclusão da operação atual para garantir a conformidade com as melhores práticas mencionadas acima.

    • 2
  2. Best Answer
    Scott Hodgin - Retired
    2016-12-30T10:47:21+08:002016-12-30T10:47:21+08:00

    Dê uma olhada no excelente post de Dan Guzman sobre o particionamento do Sql Server - especificamente o que acontece durante uma LEFT RANGEdivisão.

    Aqui estão os destaques:

    As ações executadas por um SPLIT de uma função de partição RANGE LEFT:

    • Identifique a partição existente a ser dividida, que é aquela que contém o novo limite (ou a última partição se nenhum limite existente for maior que o que está sendo adicionado)

    • Adicione o novo limite à função de partição, mantendo a ordem dos limites e incrementando os números de partição subsequentes

    • Crie uma nova partição à esquerda da existente no grupo de arquivos NEXT USED de cada esquema de partição que usa a função

    • Para cada tabela/índice usando o(s) esquema(s) de partição afetado(s), mova as linhas da partição dividida existente que sejam menores ou iguais ao novo limite para a partição recém-criada à esquerda

    • 2

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