增加打开对象的值数量的原因是什么?

What are the reasons of increasing the values number of open objects?

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 

我将值从 100000 更改为 160000,但该值仍在增加。 有什么办法可以知道增加的对象是什么? 值增加的原因是什么以及如何停止以这种方式增加?

当我看到这个问题(打开对象的描述符使用量不断增加)时,我将问题追溯到生成大量准备好的语句的应用程序(例如,而不是重新使用为重复的 DML 语句准备语句,应用程序为每个 DML 语句创建一个新的准备语句)。

在 Sybase(现在的 SAP)ASE 中,准备好的语句被转换为 'lightweight procedures'(又名 LWP;想想 'temporary procedures'),这又需要它们自己的描述符。

要确定这是否是 LWP 问题:

  • 授予 sybase_ts_role 您的登录名
  • 运行 dbcc traceon(3604)
  • 运行 dbcc des

注意:dbcc des 将生成 LOT 的输出,因此请务必将其捕获到文件中!!

在 'dbcc des' 输出中,LWP 显示了以下属性:

  • 存在于登录的临时数据库中
  • 有负对象 ID
  • 有类似 *dddddddddddddd_hhhhhh 的名称(其中 'd' == 十进制数字,'h' == 十六进制数字) ...
  • 可能有类似 *aadddddddddd_dddddddddaa* 的名称('d' == 十进制,'a' == 字母字符)
  • objssystat = O_PROC
  • objsysstat2 = O2_LWP

要查找有问题的连接...您可以从 LWP 名称(dbcc des 输出)或从 master..monCachedProcedures 列(查看对于名称为 *sq##########ss**ss#########ss* 的 proc ... 看起来像 system-/auto-generated names).

注意:根据 ASE 版本(11?12?15?16?),LWP 名称格式可能会有所不同,因此您可能需要进行一些挖掘才能找到关联的 spid

对于 spid 是名称一部分的 LWP,spid 可能是 (dbcc des) 对象名称的前 5 位数字;所以接下来我们看到 spid = 61

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

这个话题多年来多次出现,您可以在以下链接中查看我的一些漫谈:here, here, here and here