Я пытаюсь реализовать последовательность в базе данных Oracle для действия как создатель суррогатного ключа для таблицы. По причинам производительности я хочу, чтобы эта последовательность кэшировалась. Я считал, что существуют потенциальные ловушки при использовании кэшируемых последовательностей начиная с откатов, и отказы экземпляра приведут к пропущенным значениям.
Это получило меня к взглядам. Скажем, я создаю последовательность с размером кэша 100. Затем я делаю 50 рекордных вставок к своей таблице со значением последовательности как основной суррогатный ключ. После фиксации текущее значение последовательности еще не было бы записано в диск. Предположим, что у меня должен был быть отказ экземпляра в этой точке. Когда база данных возвращается, это - мое понимание, что текущее значение последовательности будет сброшено к последнему значению, записанному в диск.
Если я должен был попытаться вставить еще 50 записей в свою таблицу, я теперь буду повреждать ограничение первичного ключа, потому что последовательность была сброшена к ее последнему состоянию от диска, и первичные ключи теперь становятся снова использованными? Если это верно, как я предотвратил бы это?
Нет, это не так.
Ваша последовательность будет продолжена на 101
, значения между 50
и 100
будут отсутствовать.
Единственная причина для отключения кэширования последовательности - это попытка избежать пропусков в вашей последовательности, что не актуально для большинства первичных ключей.
Возможно, вас заинтересует эта статья , в которой говорится, что
Обратной стороной создания последовательности с кешем является то, что в случае сбоя системы , все значения кэшированной последовательности , которые не использовались, будут "потеряны". Это приводит к "разрыву" в назначенных значениях последовательности. Когда система восстанавливается, Oracle кэширует новые числа с того места, где он оставил отключение в последовательности, игнорируя так , что это называется "потерянными" значениями последовательности. .
Скажем, в кэше есть значения 101-200. Значение, записанное на диск, равно 201. Ваша вставка использует 101-150. Инстанс отключается. Инстанс запускается. При следующем использовании последовательности 201-300 будут кэшированы.