Каковы причины увеличения значения количества открытых объектов? - PullRequest
0 голосов
/ 18 сентября 2018

Количество открытых объектов в базе данных sybase сильно увеличивается и имеет эту ошибку:

Increase the config parameter 'number of open objects' to avoid descriptor reuse.

Сначала значения `открытых объектов 'были 100000

   sp_monitorconfig "open objects"
    go
    Name    Num_free           Num_active   Pct_act  Max_Used   Reuse_cnt          Instance_Name
    number of open objects     1223         90380    95.25      92380   9269 

Iизменил значение с 100000 на 160000 и все же значение увеличиваетсяЕсть ли способ узнать, какие объекты увеличиваются?Каковы причины увеличения значений и как прекратить увеличение таким образом?

1 Ответ

0 голосов
/ 18 сентября 2018

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

В Sybase (в настоящее время SAP) ASE подготовленные операторы преобразуются в «облегченные процедуры» (иначе говоря, LWP; подумайте «временные процедуры»), которые, в свою очередь, требуют своего собственного дескриптора.

Чтобы узнать, является ли это проблемой LWP:

  • предоставить sybase_ts_role для вашего логина
  • пробег dbcc traceon(3604)
  • пробег dbcc des

ПРИМЕЧАНИЕ: dbcc des сгенерирует LOT вывода, поэтому убедитесь, что вы записали его в файл !!

В выводе 'dbcc des' LWP отображаются со следующими атрибутами:

  • существует в базе данных tempdb
  • имеют отрицательные идентификаторы объекта
  • имеют такие имена, как * dddddddddddddd_hhhhhh (где 'd' == десятичная цифра, 'h' == шестнадцатеричная цифра) ИЛИ ...
  • может иметь имена вроде * aadddddddddd_dddddddddaa * ('d' == десятичный, 'a' == алфавитный символ)
  • objssystat = O_PROC
  • objsysstat2 = O2_LWP

Чтобы найти нарушающее соединение (я) ... вы можете извлечь spid из имени LWP (вывод dbcc des) или из столбца master..monCachedProcedures (ищите проки с именами вроде *sq##########ss* и *ss#########ss* ... что-то похожее на системные / автоматически генерируемые имена).

ПРИМЕЧАНИЕ. В зависимости от версии ASE (11? 12? 15? 16?) Формат имени LWP может изменяться, поэтому вам, возможно, придется покопаться, чтобы найти связанный spid.

Для LWP, где spid является частью имени, spid, вероятно, является первыми 5 цифрами (dbcc des) имени объекта; поэтому для следующего мы видим spid = 61

*00061000000606_9d5317
*00061000000626_a149eb
*00061000000606_9d5317
*00061000000589_63ea4e

Эта тема поднималась много раз за эти годы, и вы можете просмотреть некоторые из моих рассуждений по следующим ссылкам: здесь , здесь , здесь и здесь

...