2017-02-03 4 views
0

Требование - вернуть уникальное значение для каждой обработанной строки из хранимой процедуры, которая будет использоваться как фиктивный первичный ключ. Одно из решений, похоже, использует функцию ROW_NUMBER(). Другое дано here. Возможно, могут быть решения, связанные с Guid. Может ли кто-нибудь порекомендовать мне решение, которое будет эффективным и надежным?SQL Server: возвращает уникальное сгенерированное значение для каждой строки

+0

см. Здесь http://stackoverflow.com/questions/17839420/generate-guid-for-every-row-in-a-column – swe

+0

Ответ зависит от контекста, в котором вы планируете использовать хранимую процедуру , –

+0

Что происходит в СП и как вы возвращаете значения? Например, если у вас есть оператор select в конце SP, вы можете сделать один подход, если вы возвращаете переменную таблицы через выходной параметр, вы можете использовать другой подход. –

ответ

0
  • случайное число не будет вариант (как указать уникальный).

  • ROW_NUMBER - это bigint, занимающий 8 байт памяти в строке.

  • uniqueidentifier представляет собой структуру 16 байт и более дорогостоящим, чем получить ROW_NUMBER, которая просто увеличивается на единицу (уникальные идентификаторы SQL являются идентификаторы GUID, с NEWID() быть медленнее, чем из-за NEWSEQUENTIALID()NEWSEQUENTIALID() будет увеличиваться из семени GUID).

  • В сценариях, где вы INSERT в переменную таблицы или временную таблицу, вы можете использовать IDENTITY. Размер хранилища - это тип данных столбца, который может быть любым целым типом (без бит, без десятичного). Он будет увеличиваться с настраиваемого смещения (по умолчанию 1) в настраиваемом шаге (по умолчанию 1).

Это, кажется, делает ROW_NUMBER вашу лучшую подгонку, это как быстро и надежно.

Я бы порекомендовал основывать ваш выбор дизайна на более чем просто производительности. На любой разумно настроенной установке SQL Server вы почти не заметите разницы в скорости, и, если у вас нет очень ограниченных ресурсов, хранилище также не должно быть узким местом. Некоторые довольно старые benchmarks here.

Помните, что ни одна из них не поможет вам сохранить или гарантировать определенный порядок возвращаемых строк - вам все равно необходимо указать ORDER BY ваш внешний код SELECT, если вам нужны предсказуемые результаты.

Смежные вопросы