У меня есть таблица в SQL Server, где я хочу, чтобы вставки добавлялись в конец таблицы (в отличие от ключа кластеризации, который заставлял бы их вставлять в середину). Это означает, что я хочу, чтобы таблица была сгруппирована по некоторому столбцу, который будет постоянно увеличиваться.
Этого можно достичь путем кластеризации по столбцу datetime
:
CREATE TABLE Things (
...
CreatedDate datetime DEFAULT getdate(),
[timestamp] timestamp,
CONSTRAINT [IX_Things] UNIQUE CLUSTERED (CreatedDate)
)
Но я не могу гарантировать, что два Things
не будут иметь одинаковое время. Таким образом, мои требования не могут быть выполнены с помощью столбца datetime.
Я мог бы добавить фиктивный идентификатор int
столбец и кластер на нем:
CREATE TABLE Things (
...
RowID int IDENTITY(1,1),
[timestamp] timestamp,
CONSTRAINT [IX_Things] UNIQUE CLUSTERED (RowID)
)
Но вы заметите, что моя таблица уже содержит столбец timestamp
; столбец, который гарантированно будет монотонно увеличивающимся. Это именно та характеристика, которую я хочу для кандидатного ключа кластера.
Поэтому я кластеризовал таблицу по столбцу rowversion
(он же timestamp
):
CREATE TABLE Things (
...
[timestamp] timestamp,
CONSTRAINT [IX_Things] UNIQUE CLUSTERED (timestamp)
)
Вместо того, чтобы добавить фиктивный идентификатор int
столбец (RowID) для обеспечения заказа, я использую то, что у меня уже есть.
То, что я ищу, это мысли о том, почему это плохая идея; и какие другие идеи лучше.
Примечание: Сообщество вики, так как ответы субъективны.