Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите плз построить оптимальную структуру таблиц.  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз построить оптимальную структуру таблиц.  [new]
Rankatan
Member

Откуда:
Сообщений: 250
Зачем тут вообще LocalId? Почему не сделать GuidId = PK +кластерный?
1 авг 17, 14:00    [20691684]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз построить оптимальную структуру таблиц.  [new]
Rankatan
Member

Откуда:
Сообщений: 250
Связь между таблица 1 к 1? Или как?
1 авг 17, 14:02    [20691694]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз построить оптимальную структуру таблиц.  [new]
abrashka
Member

Откуда:
Сообщений: 517
Rankatan,
LocalId- как я говорил, так исторически сложилось, видимо сначала планировалось использовать это поле, но со временем решили использовать Guid, не могу сказать почему. Речь идет о системе, которая работает уже много лет, более 500 таблиц.

"GuidId = PK +кластерный"- разве это хорошо? А как же Page Split при удалении и т.п.?
Удаляют мало, но удаляют. Да и NEWSEQUENTIALID начали использовать совсем недавно.
1 авг 17, 14:05    [20691704]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз построить оптимальную структуру таблиц.  [new]
Rankatan
Member

Откуда:
Сообщений: 250
NEWSEQUENTIALID специально создавался для использовании в качестве кластерного индекса.
1 авг 17, 14:27    [20691793]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз построить оптимальную структуру таблиц.  [new]
Rankatan
Member

Откуда:
Сообщений: 250
abrashka
А как же Page Split при удалении и т.п.?

Page split происходит в основном при добавлении записи, актуально для NEWID() т.к. если у таблицы кластерный индекс на столбце c NEWID то вставка будет происходить в любую часть таблицы (при попытке вставить запись в середину таблицы может происходить Page Split ). Это не актуально для NEWSEQUENTIALID() т.к. гуиды генерируются последовательно и вставляются в конец таблицы.
1 авг 17, 14:33    [20691815]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз построить оптимальную структуру таблиц.  [new]
Rankatan
Member

Откуда:
Сообщений: 250
В общем нужно сделать так
в таблицах Items,Clients,Sales столбец GuidId делаем PK+Cluster, по возможности удаляем LocalId
в таблице Sales оставляем на LocalId PK+Cluster, добавляем у каждого столбца GuidId, ClientGuid, ItemGuid FK на свою таблицу + некластерный индекс
1 авг 17, 14:45    [20691854]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз построить оптимальную структуру таблиц.  [new]
abrashka
Member

Откуда:
Сообщений: 517
Rankatan,
я понимаю зачем используется NEWSEQUENTIALID, но проблема в том, что данные в таблицах уже существут, т.е. на сегодняшний день практически все данные в полях GuidId сгенерированы не последовательно. Поэтому я не уверен, что создать кластерный индекс по такому полю в моем случае будет правильно.
1 авг 17, 15:22    [20691972]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз построить оптимальную структуру таблиц.  [new]
Rankatan
Member

Откуда:
Сообщений: 250
abrashka
Rankatan,
я понимаю зачем используется NEWSEQUENTIALID, но проблема в том, что данные в таблицах уже существут, т.е. на сегодняшний день практически все данные в полях GuidId сгенерированы не последовательно. Поэтому я не уверен, что создать кластерный индекс по такому полю в моем случае будет правильно.

А что по твоему происходит при создании кластерного индекса?
1 авг 17, 15:44    [20692078]     Ответить | Цитировать Сообщить модератору
 Re: Помогите плз построить оптимальную структуру таблиц.  [new]
abrashka
Member

Откуда:
Сообщений: 517
Rankatan,

Интересно как работает NEWSEQUENTIALID... гарантировано ли, что каждое новое генерируемое значение будет больше тех, которые уже находятся в таблице(которые были сгенерированы при помощи NEWID)?
Если это так, то имеет смысл делать кластерный индекс по GuidId, а если нет, то нет.
1 авг 17, 16:43    [20692396]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить