OBJECT_ID 和 DATA_OBJECT_ID 坑人的区别

今天遇到一个case,具体内容就是一个非常简单的语句,但是返回结果非常的慢。语句如下

Select count(*) from OTSADMIN.QC_TS_EVENT where create_dt>=to_date('2012 APR 01','YYYY MON DD');


分析了一下这个语句非常简单,可为什么这么慢呢,猜想也许是有wait,于是就10046 trace一下。

alter session set events '10046 trace name context foreve, level12';

trace 的过程中用 tail -f 去实时的跟踪trace文件发现有很多这样的等待。

WAIT #7: nam='free buffer waits' ela= 10719 file#=11 block#=6208 set-id#=6 obj#=0 tim=1305050069528068
WAIT #7: nam='free buffer waits' ela= 10711 file#=11 block#=6208 set-id#=6 obj#=0 tim=1305050069538808
WAIT #7: nam='free buffer waits' ela= 10716 file#=11 block#=6208 set-id#=6 obj#=0 tim=1305050069549548
WAIT #7: nam='free buffer waits' ela= 10718 file#=11 block#=6208 set-id#=6 obj#=0 tim=1305050069560290

这样看来是data buffer不够用了啊。可是为啥就不够用了呢,我先看了一下alert  发现很多这样的信息

Thread 1 cannot allocate new log, sequence 7912
Checkpoint not complete


哦, 原来是日志没法switch。 一般来讲如果总有这种错误的话,就说明这个DB的redo log设置不合适。 说明对这个DB的吞吐量没有合理的分析。DB的吞吐量大,就要频繁的写redo log,就会频繁的导致redo 切换。 在redo切换的时候,要确保目标redo中的数据已经完全写入data file了。但如果alert中总是出现上面的信息的话,这就说明了alert 切换的速度比 redo 写入data file的速度快太多。解决办法就是增加redo 或者增加redo group的个数,也就是增加这个缓冲。 



这是一种解决办法。但是要注意一点是,alert中是不是总有这种信息,如果总有的话自然是说明db 吞吐量大,需要修改redo 的配置,如果是偶尔才有的话,就说明是特例了。这时也许是db中发生了什么不合理的操作,这样解决的方向就不应该是修改redo配置了,而是检查db,找出问题。 检查的过程如下:

既然是 data buffer总是满,那么就看一下哪些数据对象在占用data buffer吧。

SQL> select count(*) as num , objd from v$bh group by objd order by  num;

       NUM       OBJD
---------- ----------

      1389        574
      1936      90035
      2013      90033
      2051      90034
      3379      90030
      4542      90032
      9908 4294967295
     12730      90031

发现了这些OBJD占用的data buffer应该很多。 于是就去查这些objd是什么。

SQL> select object_name,object_type,owner from dba_objects where object_id=90031;

no rows selected

结果没查到,这很是迷糊

去ITPUB提问,经过牛人 vaga(http://www.itpub.net/space-uid-321157.html) 指导,明白了这些OBJD代表的是DATA_OBJECT_ID而不是object_id,data_object_id是segment的id。

于是转而用 DATA_OBJECT_ID来查,果然查到了是那些数据对象占用data buffer。







查到了这些数据对象就好办了。根据v$lock查找到是那些SESSION 那些SQL在使用这些对象,然后就知道为啥会使用那么多的data buffer 。

### SQL Server `OBJECT_ID` 函数指定类型的使用方法 在 SQL Server 中,`OBJECT_ID` 函数用于返回数据库中某个对象的唯一标识符(即对象 ID)。当需要通过指定类型来过滤特定种类的对象时,可以通过结合 `sys.objects` 系统视图实现。 以下是具体的使用说明示例: #### 基本语法 ```sql OBJECT_ID('object_name', 'object_type') ``` - `'object_name'`: 要查询的对象名称,支持字符串类型 `varchar` 或 `nvarchar`。如果提供的是 `varchar` 类型,则会自动转换为 `nvarchar`[^1]。 - `'object_type'`: 对象的类型,同样支持 `varchar` 或 `nvarchar` 类型。具体可用的类型可以在 `sys.objects` 的 `type` 列中找到[^2]。 #### 示例代码 以下是一个完整的示例,展示如何使用 `OBJECT_ID` 并结合对象类型进行判断: ```sql -- 检查是否存在名为 usp_send_email 的存储过程 (类型 P 表示普通存储过程) IF NOT EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[usp_send_email]', N'P') -- 这里指定了对象类型为 P AND type IN (N'P', N'PC') -- 可以进一步限定多个类型 ) BEGIN PRINT 'The stored procedure does not exist.' END ELSE BEGIN PRINT 'The stored procedure exists.' END ``` 在此示例中: - 使用了 `OBJECT_ID` 来获取对象 `[dbo].[usp_send_email]` 的 ID,并显式指定了其类型为 `P`(表示普通存储过程)[^2]。 - 结合 `sys.objects` 系统视图验证该对象的存在性类型。 #### 获取不同类型的对象 除了存储过程外,还可以针对其他类型的对象执行类似的检查操作。例如: ##### 查找表对象 ```sql DECLARE @TableObjectId INT; SET @TableObjectId = OBJECT_ID(N'dbo.MyTable', N'U'); -- U 表示用户定义的表 IF @TableObjectId IS NULL BEGIN PRINT 'Table dbo.MyTable does not exist.'; END ELSE BEGIN PRINT 'Table dbo.MyTable exists with Object ID: ' + CAST(@TableObjectId AS NVARCHAR); END ``` ##### 查找索引视图 ```sql DECLARE @ViewObjectId INT; SET @ViewObjectId = OBJECT_ID(N'dbo.MyIndexedView', N'V'); -- V 表示视图 IF @ViewObjectId IS NULL OR OBJECTPROPERTY(@ViewObjectId, 'IsIndexable') = 0 BEGIN PRINT 'View dbo.MyIndexedView is either non-existent or not indexable.'; END ELSE BEGIN PRINT 'View dbo.MyIndexedView exists and can be indexed.'; END ``` 以上代码展示了如何利用 `OBJECT_ID` `OBJECTPROPERTY` 配合工作,从而更精确地定位目标对象及其属性。 --- ### 注意事项 1. 如果未明确指定第二个参数(即对象类型),则默认仅匹配第一个参数所描述的对象名,而不考虑其实际类别。 2. 当前上下文中不存在的目标对象将导致 `OBJECT_ID` 返回 `NULL` 值[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值