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

Откуда: Кагалым
Сообщений: 54
При инсерте в таблицу в кластерным гуидом получаем разбиение страниц.
Чем это лучше старого доброго identity?
25 авг 11, 10:20    [11175700]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Kyubee
И тут мне понадобилось прописать id свежесозданной записи в какое-нибудь ссылочное поле...

не вижу такой необходимости.
25 авг 11, 11:02    [11176082]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
Mind
Kyubee
автоинкрементное поле в качестве первичного ключа - анахренизм времён досового парадокса, от которого одни проблемы.


И я даже знаю какое алтернативное решение будет предложено.
Случайный GUID в качестве первичного ключа и он же кластерный. Угадал? Это сразу же решит все проблемы! :)


Точно! Зато появятся другие... :(
Случайное значение ключа вызовет постоянное расщепление страниц, занимаемых индексом, а это приведет к росту фрагментации и занимаемого индексом дискового пространства. В случае с кластерным индексом это вызовет еще более существенное перетряхивание страниц данных. И это весьма ощутимым образом при достаточном объеме данных может сказаться на производительности сервера.

Работающий проект... Есть несколько (простых) индексов, которые основаны на GUID-подобных ключах на таблицах с весьма активными вставками. Реально занимаемый объем примерно раз в 8 больше полезного... Экстраполировать эту цифру для кластерного индекса особого труда не составит. База - по сути копеечная... Рост объема всего 10-15 GB в месяц...

В идеале, ключ индекса при вставке должен быть монотонным (либо возрастающим, либо убывающим), но никак не случайным.
Но это совершенно не значит, что в НЕКОТОРЫХ случаях случайный GUID использовать нельзя.
25 авг 11, 11:15    [11176199]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
Glory
Member

Откуда:
Сообщений: 104751
sphinx_mv
В идеале, ключ индекса при вставке должен быть монотонным (либо возрастающим, либо убывающим), но никак не случайным.
Но это совершенно не значит, что в НЕКОТОРЫХ случаях случайный GUID использовать нельзя.


NEWSEQUENTIALID()
Creates a GUID that is greater than any GUID previously generated by this function on a specified computer since Windows was started.
25 авг 11, 11:18    [11176234]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Kyubee
В моём сценарии - вставка в неподряд идущие страницы


Ниче не понял. Еще раз: 500 клиентов желают вставить 500 строк в одну таблицу в одно и тоже время. Каждый по одной строке. Вы умеете (судя по отквоченному) уникально проидентифицировать все эти 500 строк прямо на клиентах. Короткий вопрос - как?

P.S. Что вообще такое "страницы" и с чего они "идут не подряд"?
25 авг 11, 11:21    [11176276]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
sphinx_mv
В идеале, ключ индекса при вставке должен быть монотонным (либо возрастающим, либо убывающим), но никак не случайным.
Идеалы разные бывают. Latch contention при очень интенсивной параллельной вставке на последней странице данных никто не отменял ( http://sqlcat.com/sqlcat/b/technicalnotes/archive/2009/09/22/resolving-pagelatch-contention-on-highly-concurrent-insert-workloads-part-1.aspx ).
25 авг 11, 11:39    [11176435]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
И да, на всякий - упреждая возможные ответы:

1. GUID с помощью NEWID() - мимо, т.к. помимо кучи недостатков в плане перфоманса есть принципиальное отличие с int-ом: два инта автосгенерированные сервером математически являются уникальными; два GIUD-а сгенерированные NEWID() (или любой подобной на клиенте) - математически нет, хотя с практической точки зрения вероятность коллизии исчезающе мала. Однако она определенно отлична от нулевой.
2. GUID с помощью NEWSEQUENTIALID() - мимо, т.к. имеем совершенно тот же интовый identity увеличившийся в размерах (NEWSEQUENTIALID() может применяться только в default-констрейнте колонки, клиент снова может быть свободен).
25 авг 11, 11:42    [11176459]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
read_s
Guest
Гавриленко Сергей Алексеевич
sphinx_mv
В идеале, ключ индекса при вставке должен быть монотонным (либо возрастающим, либо убывающим), но никак не случайным.
Идеалы разные бывают. Latch contention при очень интенсивной параллельной вставке на последней странице данных никто не отменял ( http://sqlcat.com/sqlcat/b/technicalnotes/archive/2009/09/22/resolving-pagelatch-contention-on-highly-concurrent-insert-workloads-part-1.aspx ).


варианты секционирования ([что-то осмысленное], hashid%4) на практике себя как показывают?
по чтениям/записям.
25 авг 11, 13:14    [11177533]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
read_s
варианты секционирования ([что-то осмысленное], hashid%4) на практике себя как показывают?
по чтениям/записям.
Не знаю, у нас практически нет последовательной вставки. ;)

Если покопаться на sqlcat, то можно найти цифры, по-моему.
25 авг 11, 13:17    [11177556]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
Kyubee
Member

Откуда:
Сообщений: 125
SamMan
500 клиентов желают вставить 500 строк в одну таблицу в одно и тоже время. Каждый по одной строке. Вы умеете (судя по отквоченному) уникально проидентифицировать все эти 500 строк прямо на клиентах. Короткий вопрос - как?

[c#]Guid id = Guid.NewGuid();[/c#]
пересечений случайных guid - вроде как не зарегистрировано.

SamMan
P.S. Что вообще такое "страницы" и с чего они "идут не подряд"?

описано здесь 11176199
На очень больших объёмах (сотни миллионов строк) это действительно даёт заметные тормоза, такие, что становится целесообразно делать pk int и не иметь отложенной записи, но таких таблиц не большинство, чтобы терпеть такие лишения везде.

ну и раз уж по 1й проблеме решения нет, то вот 2я:
Если я имею guid, я могу однозначно сказать (поискав во всех таблицах), о какой записи идёт речь. Если я имею id 1,2 или 15 - это может быть что угодно. Появляется возможность, перепутав таблицу, сослаться вовсе не на то на что хотели (запись с id==1 есть в большинстве таблиц) и знать об этом никто не будет, пока не попытаются "зарплату выдать шнурками", а с guid получим нарушение foreign key
25 авг 11, 14:10    [11178141]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Kyubee
Если я имею guid, я могу однозначно сказать (поискав во всех таблицах), о какой записи идёт речь. Если я имею id 1,2 или 15 - это может быть что угодно. Появляется возможность, перепутав таблицу, сослаться вовсе не на то на что хотели (запись с id==1 есть в большинстве таблиц) и знать об этом никто не будет, пока не попытаются "зарплату выдать шнурками", а с guid получим нарушение foreign key
Искать придется не только во всех таблицах, но и во всех база на всех серверах. Причем во всей вселенной. Так что guid ничего вам не дает, потому что вы такой поиск выполнить, скорее всего, не в состоянии.
25 авг 11, 14:13    [11178175]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
Kyubee
Появляется возможность, перепутав таблицу, сослаться вовсе не на то

вы там у себя действительно закладываетесь на это при разработке? ужзнх.
25 авг 11, 14:16    [11178197]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kyubee
Если я имею guid, я могу однозначно сказать (поискав во всех таблицах), о какой записи идёт речь. Если я имею id 1,2 или 15 - это может быть что угодно. Появляется возможность, перепутав таблицу, сослаться вовсе не на то на что хотели (запись с id==1 есть в большинстве таблиц) и знать об этом никто не будет, пока не попытаются "зарплату выдать шнурками", а с guid получим нарушение foreign key

А если я ошибусь и вместо размера зарплаты в таблицу занесу размер шнурка, то результат тоже будет некорректен. Поэтому все числовые поля нужно хранить как guid-ы
25 авг 11, 14:27    [11178297]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
гуидычъ
Guest
Гавриленко Сергей Алексеевич
Kyubee
Если я имею guid, я могу однозначно сказать (поискав во всех таблицах), о какой записи идёт речь. Если я имею id 1,2 или 15 - это может быть что угодно. Появляется возможность, перепутав таблицу, сослаться вовсе не на то на что хотели (запись с id==1 есть в большинстве таблиц) и знать об этом никто не будет, пока не попытаются "зарплату выдать шнурками", а с guid получим нарушение foreign key
Искать придется не только во всех таблицах, но и во всех база на всех серверах. Причем во всей вселенной. Так что guid ничего вам не дает, потому что вы такой поиск выполнить, скорее всего, не в состоянии.


для этих целей kyubee может завести специальную табличку, чтобы хранить в ней список всех существующих гуидов в системе со ссылками (гуидными естественно) на таблицу и столбец. а чтоб при вставках не случилось читерства - повесить fk с каждого гуид-столбца каждой таблицы на этот справочник.

а потом будут искать программиста, который выяснит, почему при удалении любой записи сервер выдает stack overflow (честно говоря, уже не помню точный текст ошибки). мол, всё круто, и архитектор крутой, и тимлид крутой, и система крутая, а глупый сервер дурацкие ошибки выдает.

ps
как они там сейчас... небось внедряю вовсю уже.
25 авг 11, 14:51    [11178566]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Kyubee
пересечений случайных guid - вроде как не зарегистрировано


Практически - это, как минимум, спорное утверждение, математически - несомненно ложное. Кто или что следит что бы "выписанный" GUID не был заюзан где-либо раньше?
25 авг 11, 15:05    [11178738]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
Гавриленко Сергей Алексеевич
sphinx_mv
В идеале, ключ индекса при вставке должен быть монотонным (либо возрастающим, либо убывающим), но никак не случайным.
Идеалы разные бывают. Latch contention при очень интенсивной параллельной вставке на последней странице данных никто не отменял ( http://sqlcat.com/sqlcat/b/technicalnotes/archive/2009/09/22/resolving-pagelatch-contention-on-highly-concurrent-insert-workloads-part-1.aspx ).

При случайном значении ключа индекса "очень весело" при любом уровне интенсивности и параллельности будет не только на последней странице, но и по всему файлу БД...
25 авг 11, 15:17    [11178842]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Kyubee
ну и раз уж по 1й проблеме решения нет, то вот 2я


Со стороны клиента решения действительно нет. НО! (типа хинт) - никто не запрещает юзать обкатанное и подтвердившее свою работоспособность стопитцот раз решение серверной стороны. Колонка identity типа int зовется оно. Все проблемы в этом решении ("извлечь обратно на клиента" в т.ч.) преодолимы, причем определенно более чем единственным способом.

Kyubee
Появляется возможность, перепутав таблицу, сослаться вовсе не на то на что хотели

А перепутав окончание команды DROP DATABASE можно снести главную базу фирмы. Вывод? Тесты и бэкапы по прежнему рулят, а вовсе не GUID-ы.
И с практической точки зрения... пусть база на 100 таблиц (что, на самом деле, совсем не много). Вы всерьез собираетесь в цикле перебрать все эти таблицы в поиске 1-й строки?? Это вместо того, что бы 1 раз аккуратно написать скрипт/хранимку и аккуратно его протестировать?
25 авг 11, 15:21    [11178904]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
sphinx_mv
Гавриленко Сергей Алексеевич
пропущено...
Идеалы разные бывают. Latch contention при очень интенсивной параллельной вставке на последней странице данных никто не отменял ( http://sqlcat.com/sqlcat/b/technicalnotes/archive/2009/09/22/resolving-pagelatch-contention-on-highly-concurrent-insert-workloads-part-1.aspx ).

При случайном значении ключа индекса "очень весело" при любом уровне интенсивности и параллельности будет не только на последней странице, но и по всему файлу БД...
Ничего подобного. При случайном ключе вставляемые записи буду ложиться равномерно по страницам (чуть ли не каждая запись на одну страницу), причем одновременных обращений к каждой из них будет на порядки меньше, чем к последней.
25 авг 11, 15:27    [11178948]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Kyubee
[c#]Guid id = Guid.NewGuid();[/c#]
пересечений случайных guid - вроде как не зарегистрировано.

Вот это вы че счас пытались сказать этим куском кода? Как на шарпе переменную присвоить? И из этого следует, что гуиды не могут повторяться? Ну так это бред, на разных компах вполне могут.
Kyubee
SamMan
P.S. Что вообще такое "страницы" и с чего они "идут не подряд"?

описано здесь 11176199
На очень больших объёмах (сотни миллионов строк) это действительно даёт заметные тормоза, такие, что становится целесообразно делать pk int и не иметь отложенной записи, но таких таблиц не большинство, чтобы терпеть такие лишения везде.

Какое отношение гуид имеет к отложеной записи и о чем опять же речь? Многократное расщепление страниц и высокая фрагментация дадут заметные тормоза на не таких уж больших объемах (пару миллионов будет уже нормально).
Kyubee
ну и раз уж по 1й проблеме решения нет, то вот 2я:
Если я имею guid, я могу однозначно сказать (поискав во всех таблицах), о какой записи идёт речь. Если я имею id 1,2 или 15 - это может быть что угодно. Появляется возможность, перепутав таблицу, сослаться вовсе не на то на что хотели (запись с id==1 есть в большинстве таблиц) и знать об этом никто не будет, пока не попытаются "зарплату выдать шнурками", а с guid получим нарушение foreign key

ВК привязывается к конкретной таблице, и без разницы, по инту это делать или по гуиду. А насчет "перепутать таблицу" - это конечно сильный аргумент. Но на этот случай существует весьма тривиальное решение, называемое "диапазон ключа".

По поводу "дергать сервер за новым ид" - никогда не слышали, что в пакете может быть несколько команд и вполне можно insesrt совместить с select SCOPE_IDENTITY() или вообще добавить в него OUTPUT-предложение?
А уж "скуль в пропасть, все писать на клиенте" - это вообще ржака. Был тут один такой недавно
25 авг 11, 15:59    [11179326]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Kyubee
Если я имею id 1,2 или 15 - это может быть что угодно. Появляется возможность, перепутав таблицу, сослаться вовсе не на то на что хотели (запись с id==1 есть в большинстве таблиц) и знать об этом никто не будет, пока не попытаются "зарплату выдать шнурками", а с guid получим нарушение foreign key


GUID - ужасная штука, юзали, подтверждаю про прирост таблиц. Проблем масса.

А для вышеуказанной проблемы - для этого в стандарте есть сиквенсы (один "идентити" на все таблицы), в MS SQL они тоже появились.
25 авг 11, 16:08    [11179453]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
read_s
Guest
Гавриленко Сергей Алексеевич
Ничего подобного. При случайном ключе вставляемые записи буду ложиться равномерно по страницам (чуть ли не каждая запись на одну страницу), причем одновременных обращений к каждой из них будет на порядки меньше, чем к последней.


чуть ли не каждая на свою, но она же там не одна будет. она там встретит своих подружек и попросит подвинуться.
кто не влез - тот по дрова на новую страницу.
25 авг 11, 16:12    [11179507]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
Kyubee
Member

Откуда:
Сообщений: 125
SamMan
Все проблемы в этом решении ("извлечь обратно на клиента" в т.ч.) преодолимы

- доктор, когда я вот _так_ делаю, мне больно
- а вы _так_ - не делайте!
SamMan
А перепутав окончание команды DROP DATABASE можно снести главную базу фирмы.

справедливо. То, что кушать грязными руками грозит проблемами, не отменяет того факта, что можно пойти отморозить уши
SamMan
Вывод? Тесты и бэкапы

И вот так всегда. Я предлагаю как возложить решение проблемы на механизм, а мне говорят "надо тщательней и добросовестней самому ручками".
SamMan
пусть база на 100 таблиц (что, на самом деле, совсем не много). Вы всерьез собираетесь в цикле перебрать все эти таблицы в поиске 1-й строки??

нужен не столько поиск, сколько автоматическая защита от вставки не того. Как foreign key.
И неужели никогда при отладке не приходилось выяснять "как было вычислено это ссылочное поле"?
25 авг 11, 16:12    [11179508]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
Kyubee
Member

Откуда:
Сообщений: 125
Kateryne
сиквенсы

чуть лучше, но тоже надо вычитывать с сервера
25 авг 11, 16:16    [11179563]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Kateryne
в стандарте есть сиквенсы (один "идентити" на все таблицы), в MS SQL они тоже появились.
Где? В Denaly появились (я что-то пропустил)? Даже если и так, сам сервер-то ещё не вышел.
25 авг 11, 16:17    [11179565]     Ответить | Цитировать Сообщить модератору
 Re: как апдейтнуть поле identity?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Kyubee
И вот так всегда. Я предлагаю как возложить решение проблемы на механизм, а мне говорят "надо тщательней и добросовестней самому ручками".

И как тип ключа решает проблему логических ошибок кода то ?
Свалили все в одну кучу
25 авг 11, 16:18    [11179578]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить