Je souhaite supprimer des données d'une partition spécifique à l'aide de l'ID de partition. J'ai eu des questions pour tronquer des données de la partition spécifique pour SQL 2016 mais n'a trouvé aucune requête pour les versions inférieures.
J'ai essayé ci-dessous la requête pour supprimer uniquement les données des partitions avec la partition ID 14 et 15.
delete from partitiontable1 WITH (PARTITIONS (14 to 15))
La déclaration de suppression supprimera-t-elle la partition elle-même avec les données?
Je veux conserver la partition intacte et supprimer des données provenant de partitions spécifiques. Dites, j'ai créé des partitions sur une table, il dispose de 5 partitions (1,2,3,4,5) et je souhaite supprimer des données uniquement des 2e et 3ème partition.
Cette relevé de suppression est une syntaxe SQL Server 2012 invalide afin qu'elle ne fera que déclencher une erreur.
Supprimer une partition et la limite associée est effectuée avec MERGE
DDL; Les instructions DML comme DELETE
ne jamais supprimer les partitions.
Le moyen le plus efficace de supprimer toutes les lignes d'une partition dans SQL 2014 et des versions antérieures est avec SWITCH
(SQL 2016 permet de spécifier des partitions spécifiques avec un TRUNCATE
). Pour utiliser le commutateur, créez une table de stadification partitionnée de la même manière avec un schéma et des index identiques. Vous pouvez ensuite changer de données entre les tableaux comme une opération métadonnées, puis TRUNCATE
la table de mise de page.
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;
Cette réponse vient de Cathrine Wilhemsen que je recommande vivement de lire et de regarder présenter si elle se trouve être à un événement à proximité. Le code vient principalement d'elle, avec une criette à Itzik Ben-Gan et sa fonction getnums.
Pour résumer, vous souhaitez changer la partition vers une nouvelle table et déposer la table. Vous aurez toujours vos numéros de partition après, veuillez consulter le code ci-dessous (à nouveau principalement de Cathrine, je l'ai légèrement modifié.) En tant que démonstration.
-- 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