Слишком часто устаревание кэша последовательностей Oracle - PullRequest
5 голосов
/ 16 февраля 2011

мое приложение asp.net использует некоторые последовательности для генерации первичных ключей таблиц.Администраторы БД установили размер кэша равным 20. Теперь приложение тестируется, и ежедневно добавляется несколько записей (скажем, 4 для каждого сеанса пользовательского тестирования).Я обнаружил, что в новых записях тестовых сессий всегда используются новые части кеша, как если бы кешированные цифры предыдущего дня истекли, теряя десятую часть ключей каждый день.Я хотел бы понять, связано ли это с какой-то ошибкой, которую я мог допустить в своем приложении (удаление табличных адаптеров или что-то еще), или это обычное поведение.Существуют ли передовые методики программирования, которые следует учитывать при обработке последовательностей оракула?

Поскольку приложение не будет нести большую нагрузку (скажем, 20-40 новых записей в день), я подумал, может ли онов этом случае установить меньший размер кэша или вообще не устанавливать его.Означает ли изменение размера кэша последовательности сброс текущего индекса?

Заранее благодарен за любую подсказку

Ответы [ 4 ]

7 голосов
/ 16 февраля 2011

Вам может быть интересен ответ от Джастина Кейва в этой теме:

http://forums.oracle.com/forums/thread.jspa?threadID=640623

В двух словах: если к последовательности обращаются недостаточно часто, но у вас много «трафика» в библиотечном кеше, то последовательность может быть устаревшей и удалена из кеша. В этом случае предварительно назначенные значения теряются.

Если это происходит очень часто с вами, кажется, что ваша последовательность используется не очень часто.

Полагаю, что уменьшение размера кэша (или его полное отключение) не окажет заметного влияния на производительность в вашем случае (также если учесть ваше заявление о 20-40 новых записей в день )

2 голосов
/ 16 февраля 2011

Последовательности Oracle не свободны от пробелов.Уменьшение размера кэша уменьшит разрывы ... но у вас все еще будут разрывы.Последовательность связана с таблицей не базой данных, а вашим кодом (через nextval на вставке через триггер / sql / pkg api) - на этом примечании вы можете использовать одну и ту же последовательность для нескольких таблиц (это не похоже наидентификатор сервера sql, где он связан со столбцом / таблицей)

, поэтому изменение последовательности не повлияет на индексы.

Вам просто нужно убедиться, что вы удалили последовательность иперезапустите его, вы «перезапуститесь» до +1 текущего значения (например, создать секвенсор последовательности, начинающийся с 125 nocache;)

, но

Если вашему приложению требуется пробел -свободный набор чисел, то вы не можете использовать последовательности Oracle.Вы должны сериализовать действия в базе данных, используя собственный разработанный код.

, но имейте это в виду, вы можете увеличить дисковый ввод-вывод и возможную блокировку транзакций, если решите не использовать последовательности.

Генератор последовательностей полезен в многопользовательских средах для генерации уникальных чисел без накладных расходов на дисковый ввод-вывод или блокировку транзакции.

для повторения комментариев a_horse_with_no_name, что является проблемой с пробелами в id?


Edit также посмотрите на логику кэширования, которую вы должны использовать, расположенную здесь: http://download.oracle.com/docs/cd/E11882_01/server.112/e17120/views002.htm#i1007824


1 голос
/ 16 февраля 2011

Если вы используете последовательность для PK, а не для применения некоторой логики приложения, вам не следует беспокоиться о пробелах.Однако, если есть некоторая логика приложения, связанная с последовательными значениями последовательности, у вас будут дыры, если вы используете кэширование последовательности и не имеете загруженной системы.Значения кэша последовательности могут быть удалены из кэша библиотеки.

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

0 голосов
/ 16 февраля 2011

Как уже упоминалось, пробелы не должны быть проблемой, поэтому, если вам требуется без пробелов, вы делаете что-то не так.(Но я не думаю, что это то, что вам нужно).

Уменьшение кэша должно уменьшить число и снизить производительность последовательности, особенно при одновременном доступе к ней.(что не должно быть проблемой в вашем случае использования).

Изменение последовательности с помощью оператора alter sequence (http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_2011.htm) не должно сбрасывать текущее / следующее значение последовательности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...