Нет ничего плохого в GUID в качестве ключей и кластеров в системе OLTP (если только у вас нет МНОГО индексов в таблице, которые страдают от увеличенного размера кластера). На самом деле они гораздо более масштабируемы, чем столбцы IDENTITY.
Широко распространено мнение, что GUID представляют собой большую проблему в SQL Server - во многом это просто неправильно. На самом деле, GUID может быть значительно более масштабируемым на блоках с более чем 8 ядрами:
Извините, но ваши разработчики правы. Беспокойство о других вещах, прежде чем беспокоиться о GUID.
Да, и наконец: зачем вам кластерный индекс? Если вас интересует OLTP-система с множеством небольших индексов, вам, скорее всего, лучше с кучей.
Давайте теперь рассмотрим, что фрагментация (которую вводит GUID) делает с вашими чтениями. Есть три основных проблемы с фрагментацией:
- Страница разделяет стоимость дискового ввода-вывода
- Половина полных страниц не так эффективна, как полные страницы
- Это приводит к тому, что страницы хранятся не по порядку, что снижает вероятность последовательного ввода-вывода
Поскольку ваша проблема в вопросе связана с масштабируемостью, которую мы можем определить как «Добавление большего количества оборудования заставляет систему работать быстрее», это наименьшая из ваших проблем. Обращаться к каждому по очереди
Объявление 1) Если вы хотите масштабировать, то можете позволить себе купить I / O. Даже дешевый твердотельный накопитель Samsung / Intel 512 ГБ (по несколько долларов США / ГБ) обеспечит вам более 100 000 операций ввода-вывода в секунду. Вы не будете потреблять это в ближайшее время в системе с 2 сокетами. И если вы столкнетесь с этим, купите еще один, и вы настроены
Объявление 2) Если вы удалите данные из своей таблицы, у вас все равно будет половина полных страниц. И даже если вы этого не сделаете, память дешевая и для всех, кроме самых больших OLTP-систем - горячие данные должны соответствовать им. Желание упаковать больше данных на страницы является субоптимизацией, когда вы ищете масштаб.
Объявление 3) Таблица, построенная из часто фрагментированных, сильно фрагментированных данных, выполняет случайный ввод-вывод с той же скоростью, что и последовательно заполненные таблицы.
Что касается объединения, существует два основных типа соединения, которые вы, вероятно, увидите в рабочей нагрузке, подобной OLTP: хэш и цикл. Давайте посмотрим на каждого по очереди:
Хеш-соединение: Хеш-соединение предполагает, что небольшая таблица сканируется, а более крупная обычно ищется. Небольшие таблицы, скорее всего, будут в памяти, поэтому ввод / вывод не является для вас проблемой. Мы уже затронули тот факт, что поиск во фрагментарных индексах имеет такую же стоимость, как и в нефрагментированном индексе.
Соединение петли: внешний стол будет найден. Та же стоимость
У вас также может происходить много неудачных сканирований таблиц, но GUID, опять же, не ваша забота, а правильная индексация.
Теперь у вас могут быть некоторые законные сканирования диапазона (особенно при соединении по внешним ключам), и в этом случае фрагментированные данные менее "упакованы" по сравнению с не фрагментированными данными. Но давайте рассмотрим, какие объединения вы, вероятно, увидите в хорошо проиндексированных данных 3NF:
Объединение из таблицы, которая имеет ссылку внешнего ключа на первичный ключ таблицы, на которую она ссылается
Наоборот
Объявление 1) В этом случае вы идете на один поиск первичного ключа - присоединение n к 1. Фрагментация или нет, та же стоимость (один поиск)
Объявление 2) В этом случае вы присоединяетесь к одному и тому же ключу, но можете получить более одной строки (поиск по диапазону). Соединение в этом случае от 1 до n. Однако для внешней таблицы, которую вы ищете, вы ищете тот же ключ, который с такой же вероятностью будет находиться на той же странице во фрагментированном индексе, что и на нефрагментированном.
Рассмотрим эти внешние ключи на мгновение. Даже если вы «совершенно» последовательно заложили наши первичные ключи - все, что указывает на этот ключ, все равно будет непоследовательным.
Конечно, вы можете работать на виртуальной машине в некотором SAN в каком-то банке, который дешев на деньгах и высок на процессах. Тогда все эти советы будут потеряны. Но если это ваш мир, масштабируемость, вероятно, не то, что вы ищете - вы ищете производительность и высокую скорость / стоимость - это разные вещи.