У нас есть устаревшая база данных, которая является сервером базы данных sql (2005 и 2008).
Все первичные ключи в таблицах являются уникальными идентификаторами.
В настоящее время для таблиц нет созданного кластерного индекса, и мы сталкиваемся с проблемами производительности для таблиц, содержащих только 750 тыс. Записей. Это первая база данных, над которой я работал с уникальными идентификаторами в качестве единственного первичного ключа, и я никогда не видел, чтобы сервер SQL работал так медленно с возвратом данных.
Я не хочу создавать кластерный индекс для уникального идентификатора, поскольку он не является последовательным и, следовательно, будет замедлять работу приложений, когда дело доходит до вставки данных.
Мы не можем удалить уникальный идентификатор, так как он используется для целей управления идентификацией записей удаленных сайтов.
Я думал о добавлении большого столбца с целочисленной идентификацией в таблицы и создании кластеризованного индекса для этого столбца, включая столбец уникального идентификатора.
т.е.
int identity - Первый столбец для поддержания скорости вставки
уникальный идентификатор - чтобы приложение продолжало работать как положено.
Цель состоит в том, чтобы повысить производительность запросов идентификации и запросов к объединенным таблицам.
В1: Повысит ли это производительность запросов к БД или замедлит ее?
Q2: Есть ли альтернатива этому, которого я не перечислил?
Спасибо
Пит
Редактировать: Проблемы с производительностью связаны с быстрым извлечением данных с помощью операторов выбора, особенно если несколько более «транзакционных / изменяющихся» таблиц объединены вместе.
Редактировать 2: Соединения между таблицами, как правило, все между первичным ключом и внешними ключами, для таблиц с внешними ключами они включены в некластеризованный индекс для обеспечения более полного индекса.
У всех таблиц нет других значений, которые могли бы обеспечить хороший кластеризованный индекс.
Я больше склоняюсь к добавлению дополнительного столбца идентификаторов в каждую из таблиц с высокой нагрузкой, а затем к включению текущего столбца Guid PK в кластеризованный индекс, чтобы обеспечить наилучшую производительность запросов.
Редактировать 3:
Я бы оценил, что 80% запросов выполняются только по первичным и внешним ключам через механизм доступа к данным. Как правило, наша модель данных имеет лениво загруженные объекты, которые выполняют запрос при обращении к ним, эти запросы используют идентификатор объекта и столбец PK. У нас есть большое количество пользовательских запросов на исключение / включение данных, которые используют столбцы внешнего ключа в качестве фильтра, основанные на критериях для типа X, исключая следующие идентификаторы. Оставшиеся 20% - это когда в столбцах Enum (int) или в диапазоне дат содержатся предложения, в системе выполняется очень мало текстовых запросов.
Где возможно, я уже добавил покрывающие индексы, чтобы охватить самые тяжелые запросы, но пока я все еще разочарован производительностью. Как говорит bluefooted, данные хранятся в виде кучи.