Ответ 1
Как я понимаю, Postgres не поддерживает кластеризацию строк при вставках
Правильно в данный момент. К сожалению.
поэтому я предполагаю, что в Postgres, использующем UUID PK, это не повредит производительности этой вставки.
У него все еще есть стоимость исполнения из-за необходимости поддерживать PK и потому, что вставленный кортеж больше.
-
uuid в 4 раза шире типичного 32-битного целочисленного синтетического ключа, поэтому строка для записи составляет 12 байт больше, и вы можете поместить меньше строк в заданный объем ОЗУ
-
Индекс b-дерева, который реализует первичный ключ, будет в 4 раза больше (по сравнению с 32-разрядным ключом), занимая больше времени для поиска и требуя кэширования большего количества памяти. Он также нуждается в более частых разбиениях страниц.
-
Писания будут иметь тенденцию быть случайными в индексах, а не присоединяться к горячим, недавно доступным строкам
Есть ли способ исправить [влияние производительности на индекс] или UUID просто не хороший PK на большой, не разделенной таблице?
Если вам нужен ключ UUID, вам нужен ключ UUID. Вы не должны использовать его, если вы его не требуете, но если вы не можете полагаться на центральный источник синтетических ключей, и нет подходящего естественного ключа для использования, это все равно путь.
Разделение не сильно поможет, если вы не можете ограничить запись в один раздел. Кроме того, вы не сможете с пользой использовать исключение ограничений при поиске ключа, если записываете только один раздел за раз, поэтому вам все равно придется искать все индексы разделов для ключа при выполнении запросов. Я вижу только, что это полезно, если ваш UUID формирует часть составного ключа, и вы можете разбить другую часть составного ключа.