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 / 207054
Accepted
l.lijith
l.lijith
Asked: 2018-05-18 05:41:33 +0800 CST2018-05-18 05:41:33 +0800 CST 2018-05-18 05:41:33 +0800 CST

Excluir dados de uma partição específica no MS SQL 2012

  • 772

Gostaria de excluir dados de uma partição específica usando o ID da partição. Recebi consultas para truncar dados de partição específica para SQL 2016, mas não encontrei nenhuma consulta para versões inferiores.

Eu tentei a consulta abaixo para excluir apenas dados de partições com ID de partição 14 e 15.

delete from  partitiontable1 WITH (PARTITIONS (14 to 15))

A instrução delete removerá a própria partição junto com os dados?

Quero manter a partição intacta e remover dados de partições específicas. Digamos, criei partições em uma tabela, ela tem 5 partições (1,2,3,4,5) e quero remover dados apenas da 2ª e 3ª partição.

sql-server sql-server-2012
  • 2 2 respostas
  • 14004 Views

2 respostas

  • Voted
  1. Best Answer
    Dan Guzman
    2018-05-18T06:17:01+08:002018-05-18T06:17:01+08:00

    Essa instrução de exclusão é uma sintaxe inválida do SQL Server 2012, portanto, não fará nada além de gerar um erro.

    A remoção de uma partição e seu limite associado é feita com MERGEDDL; Instruções DML como DELETEnunca remover partições.

    A maneira mais eficiente de remover todas as linhas de uma partição no SQL 2014 e em versões anteriores é com SWITCH(o SQL 2016 permite que partições específicas sejam especificadas com um TRUNCATE). Para usar SWITCH, crie uma tabela de preparo particionada de maneira semelhante com esquema e índices idênticos. Você pode então alternar dados entre tabelas como uma operação de metadados e, em seguida, TRUNCATEa tabela de preparo.

    ALTER TABLE dbo.YourTable
        SWITCH PARTITION 1 TO dbo.YourTable_Staging PARTITION 1;
    ALTER TABLE dbo.YourTable
        SWITCH PARTITION 2 TO dbo.YourTable_Staging PARTITION 2;
    ALTER TABLE dbo.YourTable
        SWITCH PARTITION 3 TO dbo.YourTable_Staging PARTITION 3;
    ALTER TABLE dbo.YourTable
        SWITCH PARTITION 4 TO dbo.YourTable_Staging PARTITION 4;
    ALTER TABLE dbo.YourTable
        SWITCH PARTITION 5 TO dbo.YourTable_Staging PARTITION 5;
    TRUNCATE TABLE dbo.YourTable_Staging;
    
    • 8
  2. Shaulinator
    2018-05-18T06:13:43+08:002018-05-18T06:13:43+08:00

    Esta resposta vem de Cathrine Wilhemsen , a quem eu recomendo ler e assistir presente se ela estiver em um evento próximo. O código vem principalmente dela, com uma mensagem para Itzik Ben-Gan e sua função GetNums.

    Para resumir, você deseja alternar a partição para uma nova tabela e descartar a tabela. Você ainda terá seus números de partição depois, por favor veja o código abaixo (novamente principalmente de Cathrine, eu alterei um pouco.) como uma demonstração.

    -- Drop objects if they already exist
    IF EXISTS (SELECT * FROM sys.tables WHERE name = N'SalesSource')
      DROP TABLE SalesSource;
    IF EXISTS (SELECT * FROM sys.tables WHERE name = N'SalesTarget')
      DROP TABLE SalesTarget;
    IF EXISTS (SELECT * FROM sys.partition_schemes WHERE name = N'psSales')
      DROP PARTITION SCHEME psSales;
    IF EXISTS (SELECT * FROM sys.partition_functions WHERE name = N'pfSales')
      DROP PARTITION FUNCTION pfSales;
    
    -- Create the Partition Function 
    CREATE PARTITION FUNCTION pfSales (DATE)
    AS RANGE RIGHT FOR VALUES 
    ('2013-01-01', '2014-01-01', '2015-01-01');
    
    -- Create the Partition Scheme
    CREATE PARTITION SCHEME psSales
    AS PARTITION pfSales 
    ALL TO ([Primary]);
    
    -- Create the Partitioned Source Table (Heap) on the Partition Scheme
    CREATE TABLE SalesSource (
      SalesDate DATE,
      Quantity INT
    ) ON psSales(SalesDate);
    
     IF OBJECT_ID(N'dbo.GetNums', N'IF') IS NOT NULL DROP FUNCTION dbo.GetNums;
    GO
    CREATE FUNCTION dbo.GetNums(@low AS BIGINT, @high AS BIGINT) RETURNS TABLE
    AS
    RETURN
      WITH
        L0   AS (SELECT c FROM (SELECT 1 UNION ALL SELECT 1) AS D(c)),
        L1   AS (SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
        L2   AS (SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
        L3   AS (SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
        L4   AS (SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
        L5   AS (SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B),
        Nums AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rownum
                 FROM L5)
      SELECT TOP(@high - @low + 1) @low + rownum - 1 AS n
      FROM Nums
      ORDER BY rownum;
    GO
    -- Insert test data
    INSERT INTO SalesSource(SalesDate, Quantity)
    SELECT DATEADD(DAY,dates.n-1,'2012-01-01') AS SalesDate, qty.n AS Quantity
    FROM GetNums(1,1000) dates
    CROSS JOIN GetNums(1,1000) AS qty;
    
    -- Create the Non-Partitioned Target Table (Heap) on the [PRIMARY] filegroup
    CREATE TABLE SalesTarget (
      SalesDate DATE,
      Quantity INT
    ) ON [PRIMARY];
    
    -- Verify row count before switch
    SELECT 
        pstats.partition_number AS PartitionNumber
        ,pstats.row_count AS PartitionRowCount
    FROM sys.dm_db_partition_stats AS pstats
    WHERE pstats.object_id = OBJECT_ID('Salessource')
    ORDER BY PartitionNumber; -- 366000 rows in Partition 1, 365000 rows in Partition 2 and 269000 in 3 and 0 in 4
    SELECT COUNT(*) FROM SalesTarget; -- 0 rows
    
    -- Turn on statistics
    SET STATISTICS TIME ON;
    
    -- Is it really that fast...?
    ALTER TABLE SalesSource SWITCH PARTITION 1 TO SalesTarget; 
    -- YEP! SUPER FAST!
    
    -- Turn off statistics
    SET STATISTICS TIME OFF;
    
    -- Verify row count after switch
    SELECT 
        pstats.partition_number AS PartitionNumber
        ,pstats.row_count AS PartitionRowCount
    FROM sys.dm_db_partition_stats AS pstats
    WHERE pstats.object_id = OBJECT_ID('SalesSource')
    ORDER BY PartitionNumber; -- 0 rows in Partition 1, 365000 rows in Partition 2 and 269000 in 3 and 0 in 4
    SELECT COUNT(*) FROM SalesTarget; -- 366000 rows
    
    • 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