powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
22 сообщений из 22, страница 1 из 1
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39614494
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Много где встречается идея, что GUID (через NEWID) для Clustered Index - плохо. А вот INT (identity increment) - очень хорошо.

Тут в коменте:
https://stackoverflow.com/questions/11938044/what-are-the-best-practices-for-using-a-guid-as-a-primary-key-specifically-rega


Дается везде некая общая информация и что то вроде "physical storage-related thing", когда говорится про Clustered Index.

Честно говоря не удалось найти какой-то теоретической аргументации по этому поводу.
Полез почитал про сбалансированные деревья, коим является кластеризованный индекс. И с этой позиции не понял, какая к черту разница, насчет GUID и INT... Один хрен при добавлении что в середину, что в конец - дерево будет многообразно перестраиваться.

А вот про доступ к памяти вообще ни слова - перезаписываются ли куски памяти в случае GUID в середину или нет - не понятно. Нигде про это ни слова (или я плохо гуглю).
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39614496
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_Один хрен при добавлении что в середину, что в конец - дерево будет многообразно перестраиваться.Это далеко не один хрен. Это очень разные хрены, я бы даже сказал.
_Промешан_А вот про доступ к памяти вообще ни слова - перезаписываются ли куски памяти в случае GUID в середину или нет - не понятно. Нигде про это ни слова (или я плохо гуглю).А вот тут как раз почти один хрен, ибо сервер оперирует страницами.
_Промешан_Много где встречается идея, что GUID (через NEWID) для Clustered Index - плохо. А вот INT (identity increment) - очень хорошо.Авторы сей идеи не пробовали интенсивно вставлять в конец любого инкрементального индекса хотя бы в 10 коннектов.
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39614503
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_,

Оно в определенной степени не лучше и не хуже.
Как по мне единственная проблема с identity increment это contention на последней странице при энтенсивной вставке, о чем говорит Гавриленко. Тут может помочь :
•Use a random Clustered Key value (like a UNIQUEIDENTIFIER). But be aware of the side-effects: larger logical pointer in EVERY Non-Clustered Index, Page Splits…)
•Implement Hash Partitioning, if you are using the Enterprise Edition of SQL Server.
•Eliminate latching through the use of In-Memory OLTP, that is part of SQL Server 2014.
•Use a so-called Reverse Index. Unfortunately SQL Server doesn’t provide you that kind of index out-of-the box, like Oracle. But you can implement it at your own…
Как и многое связанное с SQL здесь также можно сказать It depends...
Если вы будете бездумно добавлять везде GUID то можете получить сильную фрагментацию, Page Split, плюс это 16 байт, которые также будут в каждом некласт. индексе, а при использовании identity increment вы получите hotspot в виде последней стрницы. Я к чему, надо нагрузку знать знать на таблицу, только тогда можно что-то решать.
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39614536
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_Полез почитал про сбалансированные деревья, коим является кластеризованный индекс. И с этой позиции не понял, какая к черту разница, насчет GUID и INT... Один хрен при добавлении что в середину, что в конец - дерево будет многообразно перестраиваться.Ну, для GUID будет запись в разные страницы для каждой новой записи. Плюс время от времени расщепление страниц (в зависимости от филл фактора). А для INT запись будет последовательная, и только изредка будет перебалансировка, которая в общем тоже будет идти последовательно для перебалансированных узлов.

aleksrov добавил про случаи, когда GUID даёт более высокую производительность, но важно понимать, что она будет выше в абсолюте, то есть это позволит достичь максимума на очень мощном оборудовании. А для обычных серверов, когда дисков не больше нескольких сотен, это будет только замедлять.
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39614539
otdo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39614562
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgНу, для GUID будет запись в разные страницы для каждой новой записи. Плюс время от времени расщепление страниц (в зависимости от филл фактора).
И в случае NEWSEQUENTIALID тоже?
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39614576
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныalexeyvgНу, для GUID будет запись в разные страницы для каждой новой записи. Плюс время от времени расщепление страниц (в зависимости от филл фактора).
И в случае NEWSEQUENTIALID тоже?
Это неотличимо от int. Только длиннее.
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39614621
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,

И только каждый раз новая последовательность при перезгрузке сервака. Из Bol:
Creates a GUID that is greater than any GUID previously generated by this function on a specified computer since Windows was started. After restarting Windows, the GUID can start again from a lower range, but is still globally unique.
И
The UuidCreateSequential function has hardware dependencies. On SQL Server, clusters of sequential values can develop when databases (such as contained databases) are moved to other computers. When using Always On and on SQL Database, clusters of sequential values can develop if the database fails over to a different computer.

И раумеется использовать его для того чтобы убрать last page contention полностью бесмысленно ибо это практически тот же identity с определенными оговорками.
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39614818
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hotspot - это чем плохо?

А что если используется оборудование с flash?
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39614922
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_,

Не быстрые диски, не много памяти тут не помогут. В чем суть, это проблема возникает из-за латчей. Латчи это (вырезка из Internals 2016):
Latches are lightweight synchronization objects that protect the consistency of SQL Server internal data
structures. As the opposite of locks, which protect transactional data consistency, latches prevent the
corruption of the data structures in memory.
Consider a situation where multiple sessions need to update different rows on the same data page.
Those sessions would not block each other, because they don’t acquire incompatible locks on the same
objects. SQL Server, however, must prevent the situation where multiple sessions simultaneously update
a data page structure in-memory, making it inconsistent and corrupting it. Moreover, SQL Server needs to
prevent other sessions from accessing the data page structure at the time of modification. SQL Server uses
latches to achieve this.
When the thread cannot obtain a latch on the data structure, it is placed into the FIFO queue, where it
stays suspended - и вот здесь как раз возникает проблема. Хоть латчи и кратковременны, но когда множество потоков вставляют на одну и туже страницу это становится проблемой.
К примеру можете прочесть тут
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39614952
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleksrov_Промешан_,

Не быстрые диски, не много памяти тут не помогут. В чем суть, это проблема возникает из-за латчей. Латчи это (вырезка из Internals 2016):
А GUID такой проблемы не получают?
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39614958
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_,

Нет, но они получают другие проблемы, о которых было сказано выше. Вы похоже не читаете что вам пишут. Из ссылки которую я привел выше:
Another solution is to use a non-sequential key in order to load data all over the index and not only at the end of it. By doing this, we spread the load and not creating a hotspot. This sounds like a very bad idea at first, because it generates lots of page splits and fragmentation when inserting the data, but it turns out page splits are less problematic for insert performance than latch contention. Also, in order to limit the amount of fragmentation, you can work with a low fillfactor (even 10%), and by doing so, you basically create “buckets” that will be ready for each row, instead of generating fragmentation when the insert occurs. If you use this method, watch out for your table size, as it can make your table quite larger than in other methods.
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39614963
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleksrov_Промешан_,

Нет, но они получают другие проблемы, о которых было сказано выше. Вы похоже не читаете что вам пишут. Из ссылки которую я привел выше:
Another solution is to use a non-sequential key in order to load data all over the index and not only at the end of it. By doing this, we spread the load and not creating a hotspot. This sounds like a very bad idea at first, because it generates lots of page splits and fragmentation when inserting the data, but it turns out page splits are less problematic for insert performance than latch contention. Also, in order to limit the amount of fragmentation, you can work with a low fillfactor (even 10%), and by doing so, you basically create “buckets” that will be ready for each row, instead of generating fragmentation when the insert occurs. If you use this method, watch out for your table size, as it can make your table quite larger than in other methods.
агнонь метод
для таблицы Id UNIQUEIDENTIFIER, Value Id филфактор сколько надо? 1? и диски подносить как дрова
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39614967
aleksrov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

Если честно прочел по диагонали этот абзац:) с fillfactor здесь конечно автор погаричился.
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39614999
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKдля таблицы Id UNIQUEIDENTIFIER, Value Id филфактор сколько надо? 1? и диски подносить как дроваНу, баланс между местом и производительностью :-) Хотя ИМХО достаточно 50%

А диски нужны - да; так ведь такой подход менее производителен на единицу железа.
Это используется, что бы получить масштабирование по железу, и даже думать не надо о нём, если у вас число дисков не от тысячи.
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39615194
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgTaPaKдля таблицы Id UNIQUEIDENTIFIER, Value Id филфактор сколько надо? 1? и диски подносить как дроваНу, баланс между местом и производительностью :-) Хотя ИМХО достаточно 50%

А диски нужны - да; так ведь такой подход менее производителен на единицу железа.
Это используется, что бы получить масштабирование по железу, и даже думать не надо о нём, если у вас число дисков не от тысячи.
так речь то в том что 50 не избавит от давления на последнюю страницу
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39615334
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKalexeyvgпропущено...
Ну, баланс между местом и производительностью :-) Хотя ИМХО достаточно 50%

А диски нужны - да; так ведь такой подход менее производителен на единицу железа.
Это используется, что бы получить масштабирование по железу, и даже думать не надо о нём, если у вас число дисков не от тысячи.
так речь то в том что 50 не избавит от давления на последнюю страницудля кластерного ПК по UNIQUEIDENTIFIER?
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39615335
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgTaPaKпропущено...

так речь то в том что 50 не избавит от давления на последнюю страницудля кластерного ПК по UNIQUEIDENTIFIER?

Код: sql
1.
CREATE TABLE (Id с, Value INT)



сами посчитаете длинну и сколько же на одну страницу влезет
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39618220
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_,

Дело в том, что кластерный индекс физически располагает данные, согласно индексу.
Поэтому при "identity increment" данные всегда добавляются в конец таблицы и это происходит быстро.
Когда через NEWID, так как он не последовательный, данные добавляются в произвольное место таблицы ... скорость падает.
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39618250
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduser_Промешан_,

Дело в том, что кластерный индекс физически располагает данные, согласно индексу.
Поэтому при "identity increment" данные всегда добавляются в конец таблицы и это происходит быстро.
Когда через NEWID, так как он не последовательный, данные добавляются в произвольное место таблицы ... скорость падает.
это только для тех кто не знает про NEWSEQUENTIALID
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39618742
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKblonduser_Промешан_,

Дело в том, что кластерный индекс физически располагает данные, согласно индексу.
Поэтому при "identity increment" данные всегда добавляются в конец таблицы и это происходит быстро.
Когда через NEWID, так как он не последовательный, данные добавляются в произвольное место таблицы ... скорость падает.
это только для тех кто не знает про NEWSEQUENTIALIDИ для тех, кто не знает, когда вставка в произвольные места таблицы повышает производительность, про что, собственно, в этой теме только и говорили.
...
Рейтинг: 0 / 0
Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
    #39618839
heavy-inserts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Внятно объяснить, почему кластеризованный индекс по GUID хуже INT?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]