Кластерная индексация сейчас обязательна - почему?

9

Ранее для меня были неокончательные дебаты / дискуссии о том, следует ли (всегда) привлекать / избегать кластеризованные индексы.

Ну, я понял, что они должны использоваться иногда с надлежащими + конкретными целями и контекстом.

Требование к кластерному индексу базы данных SQL Azure :

«SQL Azure не поддерживает таблицы без кластеризованных индексов. Таблица должна иметь кластеризованный индекс. Если таблица создается без кластеризованного ограничения, кластеризованный индекс должен быть создан до того, как операция вставки в таблицу будет разрешена».

не вписывается в предыдущие выводы, обоснования и объяснения.

Какой смысл, который я упустил из предыдущих объяснений, жестко навязывать повсеместность кластерных индексов без каких-либо исключений?

Геннадий Ванин Геннадий Ванин
источник
4
SQL Azure отличается от SQL Server, как вы это знаете. Azure - это распределенная база данных, хранящая ваши данные на нескольких физических машинах. Вот почему.
1
Обратите внимание, что в версии 12 службы базы данных SQL Azure у вас может быть таблица без кластерного индекса.
Трой Хант

Ответы:

11

Читать внутри SQL Azure :

SQL Azure предоставляет логические базы данных для хранения данных приложения. На самом деле данные каждого подписчика на самом деле хранятся несколько раз, реплицируются по трем базам данных SQL Server, которые распределены по трем физическим серверам в одном центре обработки данных. Многие подписчики могут использовать одну и ту же физическую базу данных.

Кластерные ключи необходимы для синхронизации всех трех копий ваших данных. Без ключа невозможно узнать, какие строки были обновлены. Кучи (таблицы без кластерного индекса) имеют только физические «ключи» (fileid: pageid: slot), и поскольку ваши 3 реплики логической базы данных совместно используют физическую базу данных с другими логическими базами данных, физический адрес на одном сервере не имеет значения для другого реплики, следовательно, кучи не могут быть скопированы.

Ремус Русану
источник
(Логический) ключ не обязательно должен находиться в кластерном индексе. Это может быть некластеризованным. Возможно, настоящая причина, по которой требуется (предположительно уникальный?) Кластеризованный индекс, заключается в том, что кучи используют RID, тогда как уникальные кластеризованные индексы этого не делают. Это то, что вы имели в виду?
nvogel
3
Из связанного документа: «Базовая технология высокой доступности и репликации в SQL Azure основана на репликации строк B-Tree». Таким образом, даже если в куче будет ключ NC, вы можете скопировать только NC, но не саму кучу.
Ремус Русану
1

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

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

JNK
источник
2
Это может быть правдой, но на данный момент это не так. Прочтите статью, на которую я ссылаюсь, в которой объясняется, как работает маршрутизация запросов и почему ваши запросы всегда выполняются в одном окне и никогда не охватывают несколько серверов. То есть. нет шардинга.
Ремус Русану