Кластерный индекс и распределенные базы данных

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

База данных будет использовать GUID для своих первичных ключей.

Что мне следует использовать для кластерного индекса в таблицах или это не имеет значения при добавлении данных в Azure? Мне вообще нужен кластерный индекс? В Azure будет одна копия базы данных со всеми данными клиентов, если это имеет значение.

Спасибо всем.


person Jay    schedule 19.09.2012    source источник
comment
спасибо за ответы до сих пор. Кто-нибудь знает, что произойдет, если произойдет конфликт в кластеризованном индексе? Предполагая, что я использую столбец int Identity в качестве индекса, столкновения при загрузке данных в Azure почти гарантированы.   -  person Jay    schedule 19.09.2012
comment
Пока кластеризованный индекс не является одновременно основным, проблем возникнуть не должно.   -  person knightpfhor    schedule 19.09.2012
comment
Индекс GUID будет быстро фрагментироваться. По этой причине я бы не использовал GUID в качестве кластеризованного индекса. Меньше накладных расходов на фрагмент кластеризованного по сравнению с некластеризованным. Считайте идентичность кластерной PK. А может даже не индексировать GUID. Да, индекс поможет выбрать, но создание этого индекса будет дорогостоящим. Если вам не нравится Identity, по крайней мере, используйте NEWSEQUENTIALID ().   -  person paparazzo    schedule 20.09.2012
comment
Согласитесь, существует множество проблем с использованием GUID, но все проблемы, вызываемые ими, намного проще решить, чем надежно и эффективно создавать последовательные идентификаторы в распределенных базах данных.   -  person knightpfhor    schedule 24.09.2012
comment
SQL Azure НЕ допускает NEWSEQUENTIALID (). Я видел много рекомендаций по использованию поля даты и времени, но я все еще сомневаюсь в этом, поскольку это кажется довольно бессмысленным.   -  person Mike Taber    schedule 05.10.2012


Ответы (2)


Хотя вам разрешено создавать (и хранить данные) таблицу без кластерного индекса в SQL Server, это не разрешено в базе данных SQL Windows Azure (WASD / SQL Azure). Хотя вы можете иметь таблицу без кластерного индекса в WASD в качестве определения, ни один оператор DML не будет разрешен для выполнения для такой таблицы, т.е. вы не сможете выполнять операторы INSTERT / UPDATE / DELETE для таблицы в WASD без кластерного индекса. Итак, если случайно данные попадают в облако, у вас должен быть кластерный индекс. Для получения дополнительной информации см. Требование кластеризованного индекса в Гильдейны и ограничения для базы данных SQL Windows Azure.

person astaykov    schedule 19.09.2012

Некоторые из рекомендаций здесь неверны.

  1. NEWSEQUENTIALID () не разрешен в SQL Azure.
  2. В SQL Azure кластерный индекс абсолютно необходим. Вы можете создать таблицу без нее, но вы не сможете добавлять в нее данные до тех пор, пока не добавите кластеризованный индекс.

В Azure кластерный индекс используется для внутренней репликации. Ссылка: http://blogs.msdn.com/b/sqlazure/archive/2010/05/12/10011257.aspx

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

Я думаю, что было бы проще всего использовать NEWSEQUENTIALID, но это не вариант в Azure.

person Mike Taber    schedule 05.10.2012