Из моего опыта я узнал, что с использованием столбца типа данных суррогата INT в качестве первичного ключа esp. ключевой столбец IDENTITY обеспечивает лучшую производительность, чем использование столбца данных GUID или char/varchar в качестве первичного ключа. Я пытаюсь использовать ключ IDENTITY как первичный ключ, где это возможно. Но недавно я столкнулся с схемой, в которой таблицы были разделены по горизонтали и управлялись через представление с разделением. Таким образом, таблицы не могли иметь столбец IDENTITY, поскольку это сделало бы Partitioned View не обновляемым. Одна из них заключалась в создании таблицы манекенов «keygenerator» с столбцом идентификатора для генерации идентификаторов для первичного ключа. Но это означало бы наличие таблицы «keygenerator» для каждого из Partitioned View. Моя следующая мысль заключалась в том, чтобы использовать float в качестве первичного ключа. Причина заключается в следующем ключе алгоритм, который я разработалИспользование представления float в качестве первичного ключа
DECLARE @KEY FLOAT
SET @KEY = CONVERT(FLOAT,GETDATE())/100000.0
SET @KEY = @EMP_ID + @KEY
Heres how it works.
CONVERT(FLOAT,GETDATE())
дает поплавок представление текущей даты-время, так как внутри все даты и время представлены SQL как значение с плавающей точкой.
CONVERT(FLOAT,GETDATE())/100000.0
преобразует представление с плавающей точкой в полное значение десятичной т.е. все цифры проталкиваются к правой стороне «».
@KEY = @EMP_ID + @KEY
добавляет идентификатор сотрудника, который является целым числом до этого десятичного значения.
Логика заключается в том, что идентификатор сотрудника гарантированно будет уникальным для всех сеансов, поскольку сотрудник не может одновременно подключаться к приложению. И для того же сотрудника каждый раз, когда будет создан ключ, текущее время и дата будут уникальными.
Весь уникальный ключ во всех сессиях сотрудников и во времени.
Так что для EMP Ids 11 и 12, у меня есть ключевые ценности, как 12.40046693321566357, 11,40046693542361111
Но меня беспокоит ли тип поплавка данные в качестве первичного ключа предлагают преимущества по сравнению с выбором GUID или обугленного/VARCHAR в качестве первичных ключей. Также важно то, что разбиение столбца float будет частью составного ключа.
Я, наконец, решил использовать составной первичный ключ, как это предложил PDaddy. Первоначально я думал, что использование составных клавиш может ухудшить производительность, но в моем случае использование комбинации полей Int и datetime не имеет большого значения. Совокупный ключ не кластеризуется, и я создал кластерный индекс в поле Int – devanalyst
Забыл упомянуть, что кластерный индекс создается в поле Int, потому что он будет использоваться в объединениях – devanalyst