У меня есть большая таблица с кластеризованным индексом в столбце GUID (uniqueidentifier
). Таким образом, строки не находятся в каком-либо логическом порядке, они физически сортируются по этому случайно сгенерированному идентификатору.
Имеет ли смысл перестроение индекса для такой таблицы? Или я могу просто пропустить это и выполнить только обновление статистики? Это для SQL Server 2019 Enterprise Edition.
В любом случае строки не будут располагаться в каком-либо порядке (дата, инкрементальный идентификатор и т. д.), они будут идти в хаотическом порядке друг за другом, даже после перестроения индекса.
Я смотрю, имеет ли вообще смысл перестроение индекса в таком случае.
На вопрос «Имеет ли x смысл» можно ответить только в контексте «Каков желаемый результат?». Это статическая таблица и вы пытаетесь сэкономить место? Вы каким-то образом пытаетесь повысить производительность? Что-то еще?
Это обширный вопрос, но я попробую ответить.
В SQL Server таблицы с «кластерным индексом» представляют собой смесь таблицы и индекса. Они имеют внутреннюю структуру, которая ближе к структуре «чистого» индекса (чем к «чистой» некластеризованной таблице). Записи не просто физически сложены или упорядочены одна за другой. Затем, если вы выполняете много операций UPDATE или DELETE, эта внутренняя структура потребует некоторой реорганизации, и перестроение может быть полезным с точки зрения производительности.
На самом деле, мое последнее предложение справедливо и для некластеризованной таблицы (которая не может быть перестроена так же, как индекс) или «вторичного» индекса.
Это общий ответ, не касающийся моего вопроса о кластерном индексе в столбце GUID, где записи сортируются по случайно сгенерированному идентификатору.
В GUID PK нет ничего особенного (кроме того, что это плохая идея), поэтому ответ применим здесь, вы все равно выполняете поиск по некоторому значению, которое может принести пользу компактному хранилищу.
@BalazsKiss Как я уже сказал, я попробовал дать «общий ответ», потому что это был (очень) широкий вопрос. На самом деле ваш вопрос был настолько широким и неконкретным, что его уже закрыли. Пожалуйста, спрашивайте правильно, будьте благодарны и посмотрите свой собственный пост, прежде чем голосовать против.
Сказал это. «общий ответ» включал в себя размышления и советы, которые непосредственно применимы к вашему случаю. Т.к. дело не только в идентификаторах, но и в том, что вы будете делать с уже вставленными данными. Сценарий полностью зависит от того, выполняете ли вы просто INSERT или нет.
Имеет ли смысл перестроение индекса для такой таблицы? Или я могу просто пропустить это и выполнить только обновление статистики?
Пропустите это. Случайные идентификаторы GUID приведут к разделению страниц при большинстве вставок, но в устойчивом состоянии этого индекса будет поддерживаться ~60 % свободного места.
Если вы перестроите страницу без коэффициента заполнения, после перестроения вы создадите массу разделений страниц. А если перестроить с коэффициентом заполнения, то вы просто перепишете таблицу без уважительной причины.
Обратите внимание: если вы генерируете значения с помощью newssequentialid, у вас не будет всех разделений страниц и пустого пространства.
1. Вам не хватает других операций DML (а именно UPDATE и DELETE, которые не обязательно используют первичный ключ в предложении WHERE). 2 "Если вы перестраиваете без коэффициента заполнения" Тогда совет должен быть "если вы решили перестроить индекс, то вам следует указать коэффициент заполнения".
Если вам «нужно» иметь кластерный индекс на
uniqueidentifier
, по крайней мере, убедитесь, что вы используете NEWSEQUENTIALID. Если вы не можете, то этот столбец действительно не должен быть CI.