Плюсы и минусы будут различаться в зависимости от требований к производительности и того, как часто вы будете запрашивать эту таблицу.
В качестве первого примера подумайте о следующем:
CREATE TABLE Part_Price_Log (
ModifiedDate DATE,
PartID INT,
PRIMARY KEY (ModifiedDate, PartID))
Если ModifiedDate
является первым и это таблица журналирования со строками только для вставки, то каждая новая строка будет помещена в конце, что хорошо (уменьшает фрагментацию). Этот подход также хорош, когда вы хотите фильтровать напрямую по ModifiedDate
или ModifiedDate
+ PartID
, так как ModifiedDate
является первым столбцом в первичном ключе. Кон здесь будет искать по PartID
, так как кластерный индекс первичного ключа не сможет напрямую искать PartID
.
Второй пример будет таким же, но с инвертированным порядком первичного ключа:
CREATE TABLE Part_Price_Log (
ModifiedDate DATE,
PartID INT,
PRIMARY KEY (PartID, ModifiedDate))
Это хорошо для запросов по PartID
, но не очень для запросов напрямую по ModifiedDate
. Кроме того, наличие PartID
первым приведет к тому, что вставки смещают страницы данных, так как вставка PartID
меньше максимальной PartID
(что увеличивает фрагментацию).
В последнем примере будет использоваться суррогатный первичный ключ, такой как IDENTITY
.
CREATE TABLE Part_Price_Log (
LogID BIGINT IDENTITY PRIMARY KEY,
ModifiedDate DATE,
PartID INT)
Это сделает все вставки последними и уменьшит фрагментацию, но вам потребуется дополнительный индекс для запроса ваших данных, например:
CREATE NONCLUSTERED INDEX NCI_Part_Price_Log_Date_PartID ON Part_Price_Log (ModifiedDate, PartID)
CREATE NONCLUSTERED INDEX NCI_Part_Price_Log_PartID_Date ON Part_Price_Log (PartID, ModifiedDate)
Об этом последнем заключении является то, что операции вставки будут занимать больше времени (поскольку индекс также должен обновляться), а размер таблицы будет увеличиваться из-за индексов.
Также имейте в виду, что если ваши данные допускают многократное обновление одной и той же детали за один и тот же день, то использование соединения PRIMARY KEY
приведет к сбою 2-го обновления. Здесь вы можете выбрать суррогатный ключ, использовать DATETIME
вместо DATE
(даст вам больше полей для обновлений) или CLUSTERED INDEX
без ограничения PRIMARY KEY
или UNIQUE
.
Я бы предложил сделать следующее. Вы сохраняете только один индекс (фактическая таблица, поскольку она кластеризована), порядок всегда вставляется, вам не нужно беспокоиться о повторении ModifiedDate
с тем же PartID
, и ваши запросы по дате будут быстрыми.
CREATE TABLE Part_Price_Log (
LogID INT IDENTITY PRIMARY KEY NONCLUSTERED,
ModifiedDate DATE,
PartID INT)
CREATE CLUSTERED INDEX NCI_Part_Price_Log_Date_PartID ON Part_Price_Log (ModifiedDate, PartID)