2013-12-18 5 views
1

У меня была таблица с основным столбцом ключа типа nchar.Идентификатор уникального идентификатора SQL Server

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

Я сделал это, потому что думал, что uniqueidentifier - лучший выбор, чем строка для id, потому что этот идентификатор строки был введен пользователем. Это своего рода атрибут имени, используемый в качестве первичного ключа.

Но он, кажется, замедлился при выполнении запросов, и я не понимаю, почему.

+0

подтвердите, был ли указатель таблицы кластером '' уникальным столбцом '' уникального идентификатора''' и вы потеряли столбец 'nchar' – Moumit

+0

Когда вы изменили первичный ключ, индекс на исходном PK мог быть удален. Если вы все еще используете исходный PK в своих запросах, он не будет использовать индекс. Не могли бы вы предоставить еще несколько определений объектов db и пример запроса? – laylarenee

+0

Я не удалял старый столбец, но я также изменил свои запросы. У меня есть индекс каждый столбец, который находится в любом предложении where, где я использую ключ uniqueidentifier. Я не использую на нем кластерный индекс. Но проблема с производительностью как-то ушла, но я не делаю никаких изменений. – jannagy02

ответ

1

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

Попытайтесь использовать идентификатор int для вас PK, этот оригинальный строковый столбец может оставаться уникальным индексом без кластеризации, если вам это нужно для истории.

И прочитайте эту (очень маленькую) статью. SQL Server central

PS: Если вы еще не зарегистрированы в этом форуме, вы можете сделать это бесплатно.

+0

Но кластеризованный индекс не является проблемой, у меня никогда не будет много данных в этой таблице. Есть несколько вариантов для агрегированных отчетов, и они замедляются. Это поле находится только в условии where, которое проверяется на равенство. – jannagy02

+0

Это зависит от большого размера стола, но есть и другие факторы. Пример, если вы выбираете, когда вставлена ​​вставка, которая может разбивать таблицу, блокирует всю таблицу, блокируя даже простой выбор (это возможный сценарий, а также зависит от уровня изоляции и множества других факторов). В любом случае создайте скрипт SQL с некоторыми примерами данных, и вы получите более точные ответы. – jean

Смежные вопросы