Получить максимальное значение для столбца идентификаторов без сканирования таблицы - PullRequest
7 голосов
/ 31 марта 2011

У меня есть таблица со столбцом Identity Id.

Когда я выполняю:

 select max(Id) from Table

SQL Server выполняет сканирование таблицы и объединяет поток.

Мой вопрос: почему он не может просто посмотреть последнее значение, присвоенное Id?Это identity, поэтому информация должна отслеживаться, верно?

Могу ли я посмотреть это вручную?

Ответы [ 6 ]

17 голосов
/ 31 марта 2011

Вы можете использовать IDENT_CURRENT , чтобы найти последнее значение идентификатора, которое будет вставлено, например,

IDENT_CURRENT('MyTable')

Однако будьте осторожны при использовании этой функции. Неудачная транзакция может все еще увеличивать это значение, и, как указывает Quassnoi, эта строка могла быть удалена.

Вероятно, он выполняет сканирование таблицы, поскольку не может гарантировать, что последнее значение идентификатора является значением MAX. Например, тождество может быть не простым целым числом. Вы можете использовать убывающее целое число в качестве своей личности.

5 голосов
/ 31 марта 2011

Что если вы удалили последнюю запись?

Значение IDENTITY больше не будет соответствовать фактическим данным.

Если вы хотите быстрый поиск для MAX(id),следует создать для него индекс (или, возможно, объявить его PRIMARY KEY)

3 голосов
/ 31 марта 2011

Таблица кластеризована в этом столбце? Можете ли вы использовать Top 1:

SELECT TOP 1 [ID]     
FROM [Table]
order by ID desc
1 голос
/ 29 июня 2015

Вы можете запустить этот следующий оператор и удалить последний UNION ALL.Запустите этот оператор, чтобы получить текущие значения Identity.

SELECT 
  ' SELECT '+char(39)+[name]+char(39)+' AS table_name, IDENT_CURRENT('+char(39)+[name]+char(39)+') AS currvalue UNION ALL'
  AS currentIdentity
FROM sys.all_objects WHERE type = 'U'
1 голос
/ 31 марта 2011

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

0 голосов
/ 31 марта 2011

Идентификатор - это первичный ключ или индексированный?Похоже, в этих случаях следует искать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...