#sql-server #partition
#sql-сервер #раздел
Вопрос:
Я хотел бы знать, как удалить раздел по имени в SQL SERVER, как это делает MySQL, например :
CREATE TABLE t1 (
id INT,
year_col INT
)
PARTITION BY RANGE (year_col) (
PARTITION p0 VALUES LESS THAN (1991),
PARTITION p1 VALUES LESS THAN (1995),
PARTITION p2 VALUES LESS THAN (1999)
);
ALTER TABLE t1 DROP PARTITION p0, p1;
Каждый день создается новый раздел и удаляются старые. Потому что это ежедневный раздел.
Я настроил раздел, подобный:
CREATE PARTITION FUNCTION [pf_trans_date](datetime2(3)) AS RANGE LEFT
FOR VALUES (N'2019-03-27T00:00:00.000', N'2019-03-28T00:00:00.000')
CREATE PARTITION SCHEME [sh_trans_date] AS PARTITION [pf_trans_date]
TO ([PRIMARY], [PRIMARY])
и я могу добавить новый раздел :
ALTER PARTITION SCHEME [sh_trans_date]
NEXT USED [PRIMARY]
ALTER PARTITION FUNCTION [pf_trans_date_byhour]() SPLIT RANGE('2019/03/29')
Теперь проблема в том, как я могу удалить старую дату раздела 2019-03-27T00:00:00.000
и все данные в нем. Потому что я не вижу никакой функции, которая делает это в SQL Server 2017.
Комментарии:
1. Взгляните на это видео: youtube.com/watch?v=aoLGMFwpdyg Они
switch partition
в другую таблицу2. Хорошо, я пойду посмотрю это.
3. @vercelli, большое вам спасибо за ответ. Однако я не понимаю, почему они это так усложняют. Я попытаюсь усвоить это в своем маленьком мозгу. 😛
4. @kizawatomaru — переключение раздела на пустую таблицу позволяет использовать шаблоны типов архивирования, когда вместо простого удаления старых данных вы объединяете их в другую таблицу, в которой хранятся старые данные. Если вы этого не хотите (и если вы используете SQL 2016 ),
truncate table
принимает аргумент partition. В любом случае, вам, вероятно, следует удалить старую границу раздела.5. @BenThul — ты был прав.
truncate table
этого недостаточно, я также должен удалить старую границу раздела. Но способ сделать это не для такого ребенка, как я.