Перестроение индекса на кластерном индексе GUID?

У меня есть большая таблица с кластеризованным индексом в столбце GUID (uniqueidentifier). Таким образом, строки не находятся в каком-либо логическом порядке, они физически сортируются по этому случайно сгенерированному идентификатору.

Имеет ли смысл перестроение индекса для такой таблицы? Или я могу просто пропустить это и выполнить только обновление статистики? Это для SQL Server 2019 Enterprise Edition.

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

Я смотрю, имеет ли вообще смысл перестроение индекса в таком случае.

Если вам «нужно» иметь кластерный индекс на uniqueidentifier, по крайней мере, убедитесь, что вы используете NEWSEQUENTIALID. Если вы не можете, то этот столбец действительно не должен быть CI.

Thom A 27.08.2024 11:20

На вопрос «Имеет ли x смысл» можно ответить только в контексте «Каков желаемый результат?». Это статическая таблица и вы пытаетесь сэкономить место? Вы каким-то образом пытаетесь повысить производительность? Что-то еще?

Ben Thul 27.08.2024 15:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это обширный вопрос, но я попробую ответить.

В SQL Server таблицы с «кластерным индексом» представляют собой смесь таблицы и индекса. Они имеют внутреннюю структуру, которая ближе к структуре «чистого» индекса (чем к «чистой» некластеризованной таблице). Записи не просто физически сложены или упорядочены одна за другой. Затем, если вы выполняете много операций UPDATE или DELETE, эта внутренняя структура потребует некоторой реорганизации, и перестроение может быть полезным с точки зрения производительности.

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

Diego Ferruchelli 27.08.2024 04:20

Это общий ответ, не касающийся моего вопроса о кластерном индексе в столбце GUID, где записи сортируются по случайно сгенерированному идентификатору.

Balazs Kiss 27.08.2024 09:20

В GUID PK нет ничего особенного (кроме того, что это плохая идея), поэтому ответ применим здесь, вы все равно выполняете поиск по некоторому значению, которое может принести пользу компактному хранилищу.

siggemannen 27.08.2024 11:19

@BalazsKiss Как я уже сказал, я попробовал дать «общий ответ», потому что это был (очень) широкий вопрос. На самом деле ваш вопрос был настолько широким и неконкретным, что его уже закрыли. Пожалуйста, спрашивайте правильно, будьте благодарны и посмотрите свой собственный пост, прежде чем голосовать против.

Diego Ferruchelli 27.08.2024 18:51

Сказал это. «общий ответ» включал в себя размышления и советы, которые непосредственно применимы к вашему случаю. Т.к. дело не только в идентификаторах, но и в том, что вы будете делать с уже вставленными данными. Сценарий полностью зависит от того, выполняете ли вы просто INSERT или нет.

Diego Ferruchelli 27.08.2024 19:02
Ответ принят как подходящий

Имеет ли смысл перестроение индекса для такой таблицы? Или я могу просто пропустить это и выполнить только обновление статистики?

Пропустите это. Случайные идентификаторы GUID приведут к разделению страниц при большинстве вставок, но в устойчивом состоянии этого индекса будет поддерживаться ~60 % свободного места.

Если вы перестроите страницу без коэффициента заполнения, после перестроения вы создадите массу разделений страниц. А если перестроить с коэффициентом заполнения, то вы просто перепишете таблицу без уважительной причины.

Обратите внимание: если вы генерируете значения с помощью newssequentialid, у вас не будет всех разделений страниц и пустого пространства.

1. Вам не хватает других операций DML (а именно UPDATE и DELETE, которые не обязательно используют первичный ключ в предложении WHERE). 2 "Если вы перестраиваете без коэффициента заполнения" Тогда совет должен быть "если вы решили перестроить индекс, то вам следует указать коэффициент заполнения".

Diego Ferruchelli 27.08.2024 19:03

Другие вопросы по теме