Intereting Posts
Функция INITCAP за небольшим исключением Как определить, когда использовать индекс в столбце таблицы Beginner sql join query Серийные номера на группу строк для составного ключа Примеры DYnamic SQL как преобразовать столбцы, разделенные запятыми, в краткие строки в db2 Выберите COUNT в двух таблицах в одном запросе с помощью MYSQL Найти максимальное значение и показать соответствующее значение из другого поля в MS Access MySQL рассчитывает последовательные даты для текущей строки понимание MySQL Объяснение вывода Match Regex в MySQL для повторного слова с условием исключает круглые скобки Поиск лучшего способа использования ExecuteScalar () Получить записи за последний час Упорядоченный счет последовательных повторов / дубликатов java.sql.SQLException: Индекс параметров выходит за пределы диапазона (1> количество параметров, которое равно 0). При использовании PreparedStatement

Изменение newid () на newsequentialid () в существующей таблице

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

Я полагаю, что существующие данные останутся довольно фрагментированными, но новые данные будут менее фрагментированными. Это означало бы, что я должен подождать некоторое время, прежде чем изменять индекс PK от некластеризованного до кластеризованного.

Мой вопрос: есть ли у кого-нибудь опыт? Есть ли что-то, что я забыл, что я должен быть осторожен?

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

Как вы сказали, вы сделали какие-либо измерения, чтобы показать, что фрагментация действительно влияет на вашу систему? Просто глядя на индекс и видя, что «фрагментирован 75%», не означает, что на него влияет время доступа. Есть много других факторов, которые вступают в игру (ожидаемая продолжительность жизни в буферном пуле, скорость чтения и записи, локальность последовательных операций, параллелизм операций и т. Д. И т. Д.). Хотя переключение с гидов на последовательные концы обычно безопасно, вы можете ввести проблемы еще. Например, вы можете видеть конкуренцию завязки страниц для интенсивной OLTP-системы с вставкой, поскольку она создает страницу с горячей точкой, где накапливаются вставки.

Вы можете подумать об использовании гребенчатых гири , в отличие от newsequentialid.

cast( cast(NewID() as binary(10)) + cast(GetDate() as binary(6)) as uniqueidentifier) 

Комбинированные гиды представляют собой комбинацию чисто случайных указаний наряду с неслучайностью текущего времени и времени, так что последовательные поколения гребенчатых гидов находятся рядом друг с другом и вообще в порядке возрастания. Комбинированные подсказки имеют различные преимущества перед newsequentialid, в том числе факты, что они не являются черным ящиком, что вы можете использовать эту формулу за пределами ограничения по умолчанию и что вы можете использовать эту формулу вне SQL Server.

Спасибо, yfeldblum! Ваше простое и краткое объяснение GUID COMB действительно помогло мне. Я действительно смотрел на то, чтобы сделать обратное этому сообщению: мне пришлось newsequentialid() от newsequentialid() так как я пытался перенести db SQL Server 2012 в Azure, а newsequentialid() не поддерживается.

Я смог изменить все мои таблицы PK по умолчанию на GUID COMB со следующим синтаксисом:

 ALTER TABLE [dbo].[Company] ADD CONSTRAINT [DF__Company__Company_ID__72E6D332] DEFAULT (CONVERT([uniqueidentifier],CONVERT([binary](10),newid(),0)+CONVERT([binary](6),getdate(),0),0)) FOR [CompanyId] GO 

Теперь мой SQL2012 db счастливо живет в облаке Azure.

Если это SQL Server, вы генерируете Guid, вызывая newid (). Это не подходит для первичных ключей. Используйте целочисленный столбец идентификатора для первичного ключа и сделайте свой Guid суррогатным ключом (и столбцом строки guid).