Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как вытащить наибольшее число  [new]
Alex_BBB
Member

Откуда:
Сообщений: 1197
Есть таблица в которой хранятся пронумерованные записи.

| id | stamp | number |

При добавлении новой записи поле number увеличивается на 1. Из клиентского приложения нужнодоставать последний number.

Записей предполагается много.

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

Спасибо.
5 мар 08, 19:23    [5376352]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
если поле IDENTITY, то ТОП10 в.7
5 мар 08, 19:40    [5376402]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
Alex_BBB
Member

Откуда:
Сообщений: 1197
непонял
5 мар 08, 19:58    [5376450]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
Alex_BBB
непонял

чего именно!?
не знаете, что такое ТОП10 ?
5 мар 08, 20:01    [5376454]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
msLex
Member

Откуда:
Сообщений: 7894
Alex_BBB
непонял

что не поняли про identity или топ 10
если 1-е - то труба
если 2-е - смотрите на прикрепленные темы этого форума вторая из низ ТОП 10 самых популярных вопросов, интересующий вас вопрос под номером 7
5 мар 08, 20:01    [5376455]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
Taffy
Member

Откуда:
Сообщений: 20498
Alex_BBB
Есть таблица в которой хранятся пронумерованные записи.

| id | stamp | number |

При добавлении новой записи поле number увеличивается на 1. Из клиентского приложения нужнодоставать последний number.

Записей предполагается много.

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

Спасибо.

Есть 2 варианта.
1 - автонаращивание поля id - это действительно посмотрите в BOL identity
2 - не для всех задач автонаращивание подходит, тогда опять же 2 варианта - 1 Перед вставкой находите максимальный id, наращиваете его и вставляете (понятно что делать это надо в одной транзакции). 2 - этот самый максимальный ид хранится в отдельной специальной табличке. При вставке вытаскиваете оттуда значение, вставляете запись, а в специальной табличке апдейтите нарощенной значение id.

У всех вариантов есть минусы - но нет идеала в этом мире
Кстати, обсуждение вариантов было на форуме не раз - поищите, может что-нибудь интересное увидите

ЗЫ
2 msLex и Knyazev Alexey
Лучше вообще не отвечать, чем в подобном тоне
:(
5 мар 08, 20:24    [5376487]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Alex_BBB

Топ 10
P.S. Поле number автоинкрементное?
5 мар 08, 20:39    [5376516]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
Alex_BBB
Member

Откуда:
Сообщений: 1197
Спасибо за разъяснения.

top 10, вопрос 7:
"7. Вопрос: Как узнать идентификатор только что добавленной записи ?"
Это я знаю. Мой вопрос в другом.

В кратце:
В таблице хранятся метки времени. У каждой метки времени есть порядковый номер (поле number).
Каждая следующая метка времени должна иметь свой порядковый номер, зависящий от номера предыдущей метки.

Все метки времени подписаны ЭЦП, в формировании ЭЦП учавствует номер метки.
ЭЦП хранится в этой же таблице. Вот почему мне нужно знать номер крайней метки времени еще до вставки новой записи в БД.
Т.е. на клиенте я создаю документ куда пишу порядковый номер метки, вычисляю ЭЦП и потом записываю это в БД.

Taffy

2 - этот самый максимальный ид хранится в отдельной специальной табличке. При вставке вытаскиваете оттуда значение, вставляете запись, а в специальной табличке апдейтите нарощенной значение id.

Вот этот способ я и предлагал.
Я не уверен что нет другого, более грамотного способа. Может быть именно MS SQL 2008 beta 3 умеет мгновенно вытаскивать максамальное значение. Может, если поле автоинкрементное - MS SQL где то уже хранит текущий id записи - ведь сам MS SQL каким-то образом автоинкрементирует значения -- значит вычислить наибольший id он может.
(Перебор всех number и выяснение самого большого наверно наихудший вариант)


МСУ

P.S. Поле number автоинкрементное?

Сейчас нет, а вот как лучше сделать думаю.
5 мар 08, 21:17    [5376587]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Alex_BBB
Сейчас нет, а вот как лучше сделать думаю.

Вообщем, чтоб не многословить - делайте его автоинкрементом. По IDENT_CURRENT() узнаете текущий значение инкремента. По IDENT_INCR() узнаете сам инкремент. Суммируете - делаете предположение о будущем значении.
P.S. Вы можете отловить конкретных проблем по Вашей задачи. Я о конкурентной вставке в таблицу. Почитайте про уровни изоляции.
Alex_BBB
Перебор всех number и выяснение самого большого наверно наихудший вариант

Функцию MAX еще не отменили. Вариант, действительно, худший. Собственно, как сама задача.
5 мар 08, 21:59    [5376689]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
Alex_BBB
Member

Откуда:
Сообщений: 1197
МСУ
Я о конкурентной вставке в таблицу

Это я как самое геморойное откладываю на потом..

МСУ
Вариант, действительно, худший. Собственно, как сама задача.

Какой предлагаете путь решения?
5 мар 08, 22:15    [5376718]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Alex_BBB
Какой предлагаете путь решения?

Полностью пересмотреть задачу. Возможно, Вы пошли не по тому пути.
P.S. Как ни крутите, но выдавать предположения о будущем значения инкремента и параллельно писать по данному факту надежную систему - абсурд. Основной принцип надежности - никаких предположений.
5 мар 08, 22:34    [5376745]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
Alex_BBB
Member

Откуда:
Сообщений: 1197
МСУ

Полностью пересмотреть задачу. Возможно, Вы пошли не по тому пути.
P.S. Как ни крутите, но выдавать предположения о будущем значения инкремента и параллельно писать по данному факту надежную систему - абсурд. Основной принцип надежности - никаких предположений.


Согласен, спасибо за замечания. Буду думать.
6 мар 08, 11:59    [5378570]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
michaeln
Member

Откуда: Оттуда
Сообщений: 108
Может я чего не понял. Почему не используете функцию max(id) ???
6 мар 08, 12:14    [5378720]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
michaeln
Может я чего не понял. Почему не используете функцию max(id) ???
Потому что если одновременно несколько пользователей получат один и тот же max, а после этого попытаются вставить запись, то это получится только у того, кто успел первым! Нужна монопольная блокировка всей таблицы, а это не всегда приемлемо. IMHO
6 мар 08, 12:43    [5379084]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
michaeln
Member

Откуда: Оттуда
Сообщений: 108
iap
michaeln
Может я чего не понял. Почему не используете функцию max(id) ???
Потому что если одновременно несколько пользователей получат один и тот же max, а после этого попытаются вставить запись, то это получится только у того, кто успел первым! Нужна монопольная блокировка всей таблицы, а это не всегда приемлемо. IMHO


ok тогда можно использовать для это Serializable Isolation Levels
6 мар 08, 13:35    [5379603]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36827
michaeln
ok тогда можно использовать для это Serializable Isolation Levels
Зачот. А потом все показывают на МССКЛ пальцем, и говорят, что он - г..но.
6 мар 08, 13:42    [5379682]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как вытащить наибольшее число  [new]
Feos
Member

Откуда: Химки
Сообщений: 151
Извините что поднимаю этот топ вверх, но для меня вопрос остался.
Почему я не могу поднимая уровень изоляции заблокировать только одно поле по которому получаю максимальное значение?

Или блокируется слишком много, кстате почему только хинтом.

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
begin tran
select max(id_order)
from dbo.table S
WITH(xlock)

Или не блокируется ничего и пользователь нарушит уникальность
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
begin tran
select max(id_order)
from dbo.table S
28 май 09, 13:18    [7239237]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
Glory
Member

Откуда:
Сообщений: 104760
Feos
Извините что поднимаю этот топ вверх, но для меня вопрос остался.
Почему я не могу поднимая уровень изоляции заблокировать только одно поле по которому получаю максимальное значение?

Потому что в MSSQL блокируются минимум запись
28 май 09, 13:28    [7239301]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
Feos
Member

Откуда: Химки
Сообщений: 151
В этом случае, из-за мах, блокируется таблица целиком тогда уровень изоляции не имеет значения.
28 май 09, 13:36    [7239371]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
Glory
Member

Откуда:
Сообщений: 104760
Feos
В этом случае, из-за мах, блокируется таблица целиком тогда уровень изоляции не имеет значения.

Потому что у вас наверняка куча без инедксов и чтобы узнать максимальное значение серверу приходится тупо перебирать все записи ?
28 май 09, 13:38    [7239394]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
Feos
Member

Откуда: Химки
Сообщений: 151
Блокировка , даже если достаточно некластерного индекса на требуемое поле((
28 май 09, 13:45    [7239454]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
Glory
Member

Откуда:
Сообщений: 104760
Feos
Блокировка , даже если достаточно некластерного индекса на требуемое поле((

Вы сейчас с кем разговаривали ?
28 май 09, 13:54    [7239514]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
aleks2
Guest
>>Вот почему мне нужно знать номер крайней метки времени еще до вставки новой записи в БД.
Это ГЛУПАЯ ИЛЛЮЗИЯ. Если подумать, то можно сначала вставить - а ПОТОМ вычислить и обновить запись.
После чего идентити становиться панацеей от геморроя.
28 май 09, 14:16    [7239658]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
Feos
Member

Откуда: Химки
Сообщений: 151
Добавление покрывающего индекса избавило от блокировки.
28 май 09, 15:13    [7240179]     Ответить | Цитировать Сообщить модератору
 Re: Как вытащить наибольшее число  [new]
vino
Member

Откуда:
Сообщений: 1191
Feos, но от проблемы параллельного резервирования номера избавит только физическая вставка записи с этим номером
29 май 09, 00:46    [7242268]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить