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

Откуда:
Сообщений: 8
MS SQL 2017
Задача была вот в чем:
Имеется таблица
CREATE TABLE [dbo].[T1](
	[COL1] [int] NOT NULL,
	[COL2] [tinyint] NOT NULL,
	[COL3] [smallint] NOT NULL,
	[COL4] [tinyint] NOT NULL,
	[DCOUNTER] [int] NOT NULL,
	[F1] [tinyint] NOT NULL,
	[F2] [tinyint] NOT NULL,
	[F3] [tinyint] NOT NULL,
	[F4] [tinyint] NOT NULL,
	[F5] [tinyint] NOT NULL,
	[F6] [tinyint] NOT NULL,
	[F7] [tinyint] NOT NULL,
	[F8] [tinyint] NOT NULL,
	[F9] [tinyint] NOT NULL,
	[F10] [tinyint] NOT NULL
) ON [T1_DATA]

Данных там много (8,3+ млрд записей). Обращение через некластеризованный индекс занимает очень много времени: 22 секунды против 2 секунд кластеризованного индекса. Соотв. принял решение сформировать кластер. индекс для one-time-job. (Это сформировано для одного анализа (в рутине такого кол-ва записей не будет))
Метод восстановления БД = Simple.
Вот код индекса:
CREATE CLUSTERED INDEX [T1_DefIndexClustered] ON [dbo].[T1]
(
	[COL2] ASC,
	[COL3] ASC,
	[COL1] ASC,
	[COL4] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [T1_INDEX]

Группа [T1_DATA] содержит 21 файл для размещения записей таблицы.
Группа [T1_INDEX] содержит 10 файлов для размещения индексов.
Суть вопроса в следующем. Индекс наполнился данными примерно за 23 часа (сравнивал объём индекс-файлов и объем data-файлов). После этого прошло уже 16 часов. Операция все еще не завершена, идет обращение и наполнение лог-файла базы. Растет он очень медленно и я вообщше не понимаю чего он растет то.
Скажите кто нибудь, пожалуйста, как происходит формирование индекса? При создании индекса лог будет расширяться на весь объем индекс-файлов чтоли (они весят суммарно 261 гб)? Потому что расширяется он ооооочень медленно.
В общем не знаю что делать. Мне уже нужно работать с этой таблицей, а она не проиндексирвоана.
Подскажите кто-нибудь где я ошибся или что я делаю не правильно? И если я делаю все правильно, то сколько в таком случае мне ждать еще? Пока лог станет размером с индекс?
14 дек 19, 04:17    [22040338]     Ответить | Цитировать Сообщить модератору
 Re: Кластерный индекс создался, но операция продолжается  [new]
Andy06
Member

Откуда:
Сообщений: 8
Вопрос снимается. Индекс сформировался. 42 часа 50 минут.
Но если есть полезные ресурсы, где почитать подробнее, буду признателен за ссылку!
14 дек 19, 07:58    [22040346]     Ответить | Цитировать Сообщить модератору
 Re: Кластерный индекс создался, но операция продолжается  [new]
Критик
Member

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

--Перед скриптом создания индекса или другой тяжелой операции
SET STATISTICS PROFILE ON;
--И можно мониторить в другой сессии
;WITH agg AS
(
SELECT SUM(qp.[row_count]) AS [RowsProcessed],
SUM(qp.[estimate_row_count]) AS [TotalRows],
MAX(qp.last_active_time) - MIN(qp.first_active_time) AS [ElapsedMS],
MAX(IIF(qp.[close_time] = 0 AND qp.[first_row_time] > 0,
[physical_operator_name],
N'<Transition>')) AS [CurrentStep]
FROM sys.dm_exec_query_profiles qp
WHERE qp.[physical_operator_name] IN (N'Table Scan', N'Clustered Index Scan', N'Sort')
AND qp.[session_id] = @ID_SESSION
), comp AS
(
SELECT *,
([TotalRows] - [RowsProcessed]) AS [RowsLeft],
([ElapsedMS] / 1000.0) AS [ElapsedSeconds]
FROM agg
)
SELECT [CurrentStep],
[TotalRows],
[RowsProcessed],
[RowsLeft],
CONVERT(DECIMAL(5, 2),
(([RowsProcessed] * 1.0) / [TotalRows]) * 100) AS [PercentComplete],
[ElapsedSeconds],
(([ElapsedSeconds] / [RowsProcessed]) * [RowsLeft]) AS [EstimatedSecondsLeft],
DATEADD(SECOND,
(([ElapsedSeconds] / [RowsProcessed]) * [RowsLeft]),
GETDATE()) AS [EstimatedCompletionTime]
FROM comp; 
14 дек 19, 10:11    [22040363]     Ответить | Цитировать Сообщить модератору
 Re: Кластерный индекс создался, но операция продолжается  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36695
При создании/пересоздании кластерного индекса перестраиваются все существующие на таблице некластерные индексы.

Сообщение было отредактировано: 14 дек 19, 15:28
14 дек 19, 13:14    [22040407]     Ответить | Цитировать Сообщить модератору
 Re: Кластерный индекс создался, но операция продолжается  [new]
Andy06
Member

Откуда:
Сообщений: 8
Гавриленко Сергей Алексеевич, я оставил только кластерный, некластерный удалил.

Критик, пробовал этой коммандой вывести, но процент = 0:
SELECT command, percent_complete, start_time FROM sys.dm_exec_requests WHERE session_id = 54

Вашу комманду тоже видел на stackoverflow и применял - резальтат был тот же. Но
SET STATISTICS PROFILE ON;
я не делал перед скриптом, в следующий раз попробую, спасибо.

P.S. Я понял чего он так долго потом работал еще. Кластерный индекс ведь данные содержит все, так что шла миграция данных из data-файлов в файлы индекса. Совсем вылетело из головы это. Даже не подумал.

Сообщение было отредактировано: 15 дек 19, 19:39
15 дек 19, 19:36    [22040761]     Ответить | Цитировать Сообщить модератору
 Re: Кластерный индекс создался, но операция продолжается  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
Andy06,
создавали бы с online = on могли бы отследить стадию создания индекса. ну а таблица в 8 ТБ это мягко говоря "ОК" :)
16 дек 19, 02:13    [22040834]     Ответить | Цитировать Сообщить модератору
 Re: Кластерный индекс создался, но операция продолжается  [new]
Andy06
Member

Откуда:
Сообщений: 8
felix_ff, спасибо за совет, в будущем учту, а в MS SQL я еще новичек, многого не знаю. Таблица не 8ТБ, а 8,3+ млрд. записей (строк). Сама таблица весит (вместе с индексом) 253Гб (существенно сократил объем путем изменения типов столбцов на более компактные (int -> smallint & tinyint), там где это было возможно.
16 дек 19, 04:22    [22040845]     Ответить | Цитировать Сообщить модератору
 Re: Кластерный индекс создался, но операция продолжается  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
ну, отсортировать 240Гб по четырем полям, да еще и не в темпдб, это конечно круто,база наверное на пару терабайтов подросла? ужасы нашего городка...
16 дек 19, 08:22    [22040861]     Ответить | Цитировать Сообщить модератору
 Re: Кластерный индекс создался, но операция продолжается  [new]
Andy06
Member

Откуда:
Сообщений: 8
Yasha123, вообще почти не подросла. А должна была?
Варианта в любом случае не было другого. С индексом наполнение таблицы такого объема шло бы месяцами, так что индекс пришлось удалять, потом наполнять и потом уже только создавать заново.
16 дек 19, 08:59    [22040868]     Ответить | Цитировать Сообщить модератору
 Re: Кластерный индекс создался, но операция продолжается  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4384
Andy06
Вопрос снимается. Индекс сформировался. 42 часа 50 минут.
Но если есть полезные ресурсы, где почитать подробнее, буду признателен за ссылку!


Рекомендую перейти на Вертику
16 дек 19, 09:25    [22040876]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить