Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подскажите по секционированию.  [new]
teCa
Member

Откуда:
Сообщений: 628
Всем привет.

Есть несекционированая таблица, в которую интенсивно 24/7 идет поставка данных, в данный момент в ней 4 389 359 936 строк.

CREATE TABLE [dbo].[Posts](
	[Id] [bigint] IDENTITY(4500100100,1) NOT FOR REPLICATION NOT NULL,
	[BlogId] [int] NOT NULL,
	[PersonId] [int] NOT NULL,
	[Url] [nvarchar](4000) NOT NULL,
	[Title] [nvarchar](4000) NOT NULL,
	[PublishDate] [datetime] NULL,
	[Timestamp] [datetime] NULL,
	[cs_Url]  AS (checksum([Url])),
	[UpdateDate] [datetime] NULL,
	[PostContentId] [bigint] NULL,
	[WatchComments] [bit] NULL,
	[CommentsLastUpdated] [datetime] NULL,
	[PlagiarismId] [int] NULL,
	[DuplicateOfId] [int] NULL,
	[repl] [bit] NOT NULL,
	[PostProcessingState_Id] [int] NULL,
	[IsComment] [bit] NOT NULL,
	[cs_Title]  AS (checksum([Title])),
	[CreateDate] [datetime] NULL,
	[IsSpam] [bit] NULL,
	[UrlL400]  AS (left([url],(400))),
	[MessageType] [int] NULL,
	[LanguageId] [int] NULL,
	[BlogHostId] [int] NULL,
	[BlogHostType] [tinyint] NULL,
	[ParentUrl] [nvarchar](4000) NULL,
	[IsAd] [bit] NULL,
	[CountryId] [int] NULL,
	[RegionId] [int] NULL,
	[AreaId] [int] NULL,
	[CityId] [int] NULL,
	[BlogFollowersNum] [int] NULL,
	[AuthorBlogId] [int] NULL,
	[VisibilityIndex] [float] NULL,
	[BlogInfluenceRate] [int] NULL,
PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [SSD_FG]
) ON [SSD_FG]
GO

ALTER TABLE [dbo].[Posts] ADD  DEFAULT ((0)) FOR [IsComment]
GO

ALTER TABLE [dbo].[Posts] ADD  DEFAULT (getutcdate()) FOR [CreateDate]
GO

ALTER TABLE [dbo].[Posts] ADD  DEFAULT ((0)) FOR [IsSpam]
GO


Мне необходимо ускорить удаление из неё старых данных, простой delete from справляется, но хочется этот процесс ускорить.
Секционирование не применял на практике, но знаю, что ренжировав секции по таймштампу, я могу быстро удалять данные секциями.

Не где в мануалах по секционированию не встречал информации о том, что секционирование может замедлить вставку (на таблице применяются не уникальные индексы), как секционирование относится к индексам, мне тоже пока не особо ясно.

Так же пересоздавать таблицу не хотелось бы, могу ли я создать новые секции на заполненной таблице, пускай и только для новых данных, а старые целиком оставить в секции до сегодняшней даты.

Или может я совершенно не прав в своих суждениях?
20 дек 19, 17:26    [22045463]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по секционированию.  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
teCa, Painless management of a logging table in SQL Server
20 дек 19, 18:13    [22045527]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по секционированию.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
teCa
Мне необходимо ускорить удаление из неё старых данных, простой delete from справляется, но хочется этот процесс ускорить.
Секционирование не применял на практике, но знаю, что ренжировав секции по таймштампу, я могу быстро удалять данные секциями.

Не где в мануалах по секционированию не встречал информации о том, что секционирование может замедлить вставку (на таблице применяются не уникальные индексы), как секционирование относится к индексам, мне тоже пока не особо ясно.
Если оставить кластерный ПК по id, то секционирования по таймштампу не получится.
Если сделать ПК по id некластерным, то могут замедлиться запросы.

В такой ситуации я бы сделал секционирование по id, примерно подобрав нужный диапазон значений.

teCa
Так же пересоздавать таблицу не хотелось бы, могу ли я создать новые секции на заполненной таблице, пускай и только для новых данных, а старые целиком оставить в секции до сегодняшней даты.
Есть несколько способов внедрить секционирование, не останавливая работу базы, не лоча таблицу.
Зависит от свободного пространства, версии сиквела, и требований.

Например да, можно всю существующую таблицу разместить в одной большой секции, а новые данные будут добавляться уже в небольшие секции. Оставить обычное удаление, и когда то наступит момент, что можно будет начать удалять секциями.
Это самое простое решение, и самое нетребовательное к ресурсам.
20 дек 19, 18:17    [22045534]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по секционированию.  [new]
entrypoint
Member

Откуда:
Сообщений: 227
teCa,

Переключаете секцию из секционированной таблицы в несекционированную, а затем, последнюю удаляете

CREATE TABLE PartitionTable (col1 int, col2 char(10))
ON myRangePS1 (col1) ;
GO
CREATE TABLE NonPartitionTable (col1 int, col2 char(10))
ON test2fg ;
GO
ALTER TABLE PartitionTable SWITCH PARTITION 2 TO NonPartitionTable ;
GO
DROP TABLE NonPartitionTable

https://docs.microsoft.com/ru-ru/sql/t-sql/statements/alter-table-transact-sql?view=sql-server-ver15
24 дек 19, 13:10    [22047701]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по секционированию.  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33658
Блог
teCa,

Если будете удалять по id, то будет быстро.
Собственно, вам нужно только решить, подходит это поле для определения "старости" данных.
24 дек 19, 13:37    [22047724]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по секционированию.  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4727
teCa,

У вас есть возможность организовать окно и перелить эту таблицу в секционированную?

Либо Сделать новую секционированнную и переключиться на неё.

Ещё вы не назвали версию SQL SErver. Начиная с 2016 можно truncate делать партиции.
24 дек 19, 15:37    [22047841]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить