Точного ответа нет. Даже если в какой-то момент что-то будет быстрее, в зависимости от использования, будут построены кэши и статистики и следующий запрос будет работать по-другому (включите статистику клиента: он покажет изменения от запроса к запросу +/- красный/зелёный).
Это MS SQL, вы никогда не сможет сделать лучше его оптимизатора. Помочь можно: есть "Помощник по настройке ядра СУБД". Или самый первый уровень: включите действительный план выполнения и статистику активных запросов— если у оптимизатора будет предложение, оно будет зелёным цветом в виде сценария
CREATE
(только подставите названия объектов).
Да и использование
datetime
в качестве первичного ключа (только сейчас дошло) — не допустимо:
тестируем
CREATE TABLE [dbo].[Table_5](
[ID] [datetime] NOT NULL,
[Name] [varchar](50) NOT NULL,
CONSTRAINT [PK_Table_5] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Table_5] ADD CONSTRAINT [DF_Table_5_ID] DEFAULT (getdate()) FOR [ID]
GO
Попробуем добавить:
INSERT INTO Table_5 (Name)
SELECT TOP(5) 'TEST' + CAST(ROW_NUMBER() OVER(ORDER BY id) AS VARCHAR)
FROM sysobjects
Не получается:
Нарушено "PK_Table_5" ограничения PRIMARY KEY.
Не удается вставить повторяющийся ключ в объект"dbo.Table_5".
Повторяющееся значение ключа: (ноя 12 2021 3:06PM).
Более подробно: системный таймер Windows, по-умолчанию, срабатывает 1000/64 раз в секунду, а точность
datetime
1000/300, что должно было бы обеспечить уникальность последовательных значений. Но MS SQL, с помощью
timeBeginPeriod
, увеличивает частоту срабатывания таймера до 1000/1000. То есть при записи в
datetime
и округления до его точности, значения потеряют уникальность. Это известная коллизия этого типа данных не позволяет использовать его, как первичный ключ. В 1С есть специальная обработка для построения хронологических цепочек (например, что бы различать оплату и аванс относительно отгрузки), которая устанавливает на документах несовпадающее время.
1) 1 PK - Int, 2) 1 PK - Datetime, 3) Year, Month - int Composite Key, 4) Year, Month, Day - int Composite Key
datetime
- это
int+int
. В первом — дата, во втором — время, которое, исходя из 3 и 4 пункта использовано не будет (и эти пункты излишни, естественно). Если вы хотите использовать дату как первичный ключ — используйте тип данных
date
(3 байта).