Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
abrashka Member Откуда: Сообщений: 517 |
День добрый! Есть база, каждая таблица в которой имеет LocalId int identity(1,1) и уникальный GuidId Уникальность GuidId проверять нет необходимости, за это отвечает аппликация(раньше было NEWID, но недавно начали использовать NEWSEQUENTIALID) Все связи межну данными осуществляются через GuidId, а LocalId практически не используется(так исторически сложилось). Специфика работы такая, что из большинства таблиц данные не удаляются, чаще всего добавляются новые и реже изменяются. Таблицы достаточно большие, некоторые могут доходит до миллионов строк. Какая модель в таком случае будет предпочтительней: 1) LocalId - первичный ключ и кластерный индекс+ GuidId - некластерный индекс 2) LocalId- кластерный индекс, GuidId -первичный ключ и некластерный индекс 3) Другая модель? Спасибо! Пример таблиц без индексов: CREATE TABLE Items (LocalId INT IDENTITY(1, 1), GuidId UNIQUEIDENTIFIER, ItmDescr NVARCHAR(50) ); CREATE TABLE Clients (LocalId INT IDENTITY(1, 1), GuidId UNIQUEIDENTIFIER, FirstName NVARCHAR(50), LastNaem NVARCHAR(50), BirthDate DATETIME, CityGuid UNIQUEIDENTIFIER ); CREATE TABLE Cities (LocalId INT IDENTITY(1, 1), GuidId UNIQUEIDENTIFIER, CityName NVARCHAR(50) ); CREATE TABLE Sales (LocalId INT IDENTITY(1, 1), GuidId UNIQUEIDENTIFIER, ClientGuid UNIQUEIDENTIFIER, ItemGuid UNIQUEIDENTIFIER, Quantity INT, SaleDate DATETIME ); |
1 авг 17, 13:55 [20691666] Ответить | Цитировать Сообщить модератору |
Rankatan Member Откуда: Сообщений: 250 |
Зачем тут вообще LocalId? Почему не сделать GuidId = PK +кластерный? |
1 авг 17, 14:00 [20691684] Ответить | Цитировать Сообщить модератору |
Rankatan Member Откуда: Сообщений: 250 |
Связь между таблица 1 к 1? Или как? |
1 авг 17, 14:02 [20691694] Ответить | Цитировать Сообщить модератору |
abrashka Member Откуда: Сообщений: 517 |
Rankatan, LocalId- как я говорил, так исторически сложилось, видимо сначала планировалось использовать это поле, но со временем решили использовать Guid, не могу сказать почему. Речь идет о системе, которая работает уже много лет, более 500 таблиц. "GuidId = PK +кластерный"- разве это хорошо? А как же Page Split при удалении и т.п.? Удаляют мало, но удаляют. Да и NEWSEQUENTIALID начали использовать совсем недавно. |
1 авг 17, 14:05 [20691704] Ответить | Цитировать Сообщить модератору |
Rankatan Member Откуда: Сообщений: 250 |
NEWSEQUENTIALID специально создавался для использовании в качестве кластерного индекса. |
1 авг 17, 14:27 [20691793] Ответить | Цитировать Сообщить модератору |
Rankatan Member Откуда: Сообщений: 250 |
Page split происходит в основном при добавлении записи, актуально для NEWID() т.к. если у таблицы кластерный индекс на столбце c NEWID то вставка будет происходить в любую часть таблицы (при попытке вставить запись в середину таблицы может происходить Page Split ). Это не актуально для NEWSEQUENTIALID() т.к. гуиды генерируются последовательно и вставляются в конец таблицы. |
||
1 авг 17, 14:33 [20691815] Ответить | Цитировать Сообщить модератору |
Rankatan Member Откуда: Сообщений: 250 |
В общем нужно сделать так в таблицах Items,Clients,Sales столбец GuidId делаем PK+Cluster, по возможности удаляем LocalId в таблице Sales оставляем на LocalId PK+Cluster, добавляем у каждого столбца GuidId, ClientGuid, ItemGuid FK на свою таблицу + некластерный индекс |
1 авг 17, 14:45 [20691854] Ответить | Цитировать Сообщить модератору |
abrashka Member Откуда: Сообщений: 517 |
Rankatan, я понимаю зачем используется NEWSEQUENTIALID, но проблема в том, что данные в таблицах уже существут, т.е. на сегодняшний день практически все данные в полях GuidId сгенерированы не последовательно. Поэтому я не уверен, что создать кластерный индекс по такому полю в моем случае будет правильно. |
1 авг 17, 15:22 [20691972] Ответить | Цитировать Сообщить модератору |
Rankatan Member Откуда: Сообщений: 250 |
А что по твоему происходит при создании кластерного индекса? |
||
1 авг 17, 15:44 [20692078] Ответить | Цитировать Сообщить модератору |
abrashka Member Откуда: Сообщений: 517 |
Rankatan, Интересно как работает NEWSEQUENTIALID... гарантировано ли, что каждое новое генерируемое значение будет больше тех, которые уже находятся в таблице(которые были сгенерированы при помощи NEWID)? Если это так, то имеет смысл делать кластерный индекс по GuidId, а если нет, то нет. |
1 авг 17, 16:43 [20692396] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |