Keyword:
FGA DRIVING_SITE HINT NOT WORK DBLINK 10053 SYS_AUDIT
用户发现对某使用的DB Link的视图(View)设定细粒度审计(Fine Grained Auditing 简称FGA)后, 该视图中包含的DRIVING_SITE提示(HINT)变的无效了。
用户的数据库环境信息如下:
根据用户描述,可以判定问题的焦点是SQL提示(HINT)DRIVING_SITE的无效和FGA设定的关系。
以下是用户提供的执行计划状况:
通过上面的输出,我们看到设定FGA后执行计划确实发生了变化,和没有追加DRIVING_SITE 提示的执行计划输出相同,即该提示没有起到期待的作用。
即使是再优秀的工程师,也不是所有的问题和所有的知识都了解的。 所以针对用户的问题,现在我们需要一步一步地明确和解决以下的一些问题:
我们首先了解一下DRIVING_SITE提示:
官方在线文档【Database Reference】手册会提供关于一般SQL语法、表达式 、 使用规则等相关的知识内容,所以我们先从这个文档开始入手查看DRIVING_SITE提示的含义:
根据上面的描述,我们知道DRIVING_SITE 提示的主要作用是在分布式处理(即使用DB Link)时, 指示优化器在哪个数据库上执行。
根据用户提供的SQL文:
即,如果没有指定DRIVING_SITE的情况下,dept_view(DEPT@TEST)的数据应该通过DB Link发送到本地(即EMP所在的数据库)后,在本地进行表的连接。
如果指定DRIVING_SITE的情况下,emp的数据会被送到远程(即dept_view所在的数据库), 然后在远程数据库上进行表的连接后生成结果,再返回结果给本地。 (※这样在本地的表很小,远程表很大的情况下,可能会减少数据的传输,得到更好的效率)
了解了DRIVING_SITE的含义,我们再看看是不是DRIVING_SITE的使用限制导致该问题发生? 通过对MOS和相关资源如在线文档,白皮书,网上资源等的检索, 我们知道对于DRIVING_SITE提示的使用,有如下的限制:
虽然对于driving_site提示有上面的限制,但是我们并没有发现任何和FGA有关的内容。
所以我们还要进一步地调查driving_site提示无效的原因。
既然我们现在没有找到最终合理的解释,下面尝试从一般经验和方法入手调查。 根据经验,一般都有哪些情况会导致提示无效?
好吧,越扯越远了~~,但确实没有本次问题(DRIVING_SITE)的经验。。。
下面我们通过一般的诊断方法进行入手。 其实目前为止,并没有包治百病的提示无效的解决方法,但是通过10053 Trace(Optimizer Trace),通常可以排除一些提示无效的原因和SQL解析执行情况, 并且在 10gR2以后的版本,10053中增加了Dumping Hints的功能,会表示出Hint相关的错误(err)和是否使用等信息。
(当然有时候Dumping Hints并不能输出很有用的信息,甚至输出的是无法理解的内容,所以仅能做参考)
不管怎样,我们需要先取得10053 trace看一看是有查询变换或者其他有用的信息输出。
根据用户的描述,在用户环境中通过TEST CASE可以重现问题, 所以我们也尝试在测试环境中重新问题,看看是不是跟环境有关,是不是在所有的数据库上都能够重现?
测试1. 没有设定FGA,追加了DRIVING_SITE 提示时的情况
我们根据执行计划可以看到,DRIVING_SITE提示起到了作用:
ID 3中emp的数据被送到远程(即dept_view所在的数据库),然后在远程数据库上进行表的连接后生成结果,再返回结果给本地; Note信息中包括了“fully remote statement”信息。
测试2. 设定FGA,追加了DRIVING_SITE 提示时的情况
我们根据执行计划可以看到,DRIVING_SITE提示并没有起到作用:
ID=4 dept_view(DEPT@TEST)的数据通过DB Link发送到本地(即EMP所在的数据库)后,在本地进行表的连接; 并且Note信息中没有远程执行的信息。
我们还在11.2.0.4 、12.1.0.2和12.2.0.1版本上做了测试,如用户所说会有同样的问题。
虽然在我们的测试环境中也重现了现象,但是我们还是无法确定是期待动作还是bug导致的问题,于是尝试取得10053 Trace来看看是否有有效的输出。
在【没有设定FGA追加了DRIVING_SITE 提示时】和【设定FGA追加了DRIVING_SITE 提示时】的情况,分别通过下面的方法,取得10053 trace。
然后我们查看输出内容,看看有什么有用的信息。
在没有设定FGA追加了DRIVING_SITE 提示时本地的10053中并没有完整的输出, 猜测是在远程数据库中执行的,所以应该在远程数据库中设定10053,查看才有效。 (本次暂时忽略)
查看设定FGA追加了DRIVING_SITE 提示时时本地的10053的信息
根据Dumping Hints的信息err=0,used=1,应该是使用了提示, 但事实上提示(HINT)确实无效的,所以通过这个信息无法继续调查。
我们通过【Final query after transformations】,即查询转换后的信息, 可以看到在对于DEPT_VIEW视图,系统自动追加了SYS_AUDIT函数。
至此,我们可以猜测问题很有可能和追加了SYS_AUDIT函数有关。
SYS_AUDIT函数有什么特点? 关于这个函数的信息很少,但是我们知道在实现FGA时,内部会使用这个函数。 而且它和SYS_CONTEXT等函数一样都是只能在本地数据库执行的函数。 通过检索相关的信息时,我们发现类似于Bug 12810600(Not a Bug)的报告, (关于只能在本地数据库执行的函数SYS_CONTEXT导致DRIVING_SITE无效的报告) 即为了避免由于本地数据库执行的函数在远程数据库执行发生结果不正确, 这些函数只能够在本地执行,不能够在远程执行。
参考: Bug 12810600 - DRIVING_SITE HINT DOES NOT WORK
Product Version 10.2.0.4 Status 92 - Closed, Not a Bug
根据上面的调查结果,我们可以判断本次现象的原因是由于Oracle产品规格的限制, 当设定FGA审计时,DRIVING_SITE 提示无效属于期待动作, 对于这一点没有更好的解决办法,需要客户在应用程序和应用方法上做调整。
如果为了更好的分布式查询性能可考虑其他的查询优化方法。
参考:
Database Administrator's Guide
http://docs.oracle.com/cd/E11882_01/server.112
/e25494/ds_appdev.htm#ADMIN12196
>Tuning Distributed Queries
通过本次案例, 我们详细描述了解决DRIVING_SITE 提示设定无效问题的思路和过程, 并涵盖了以下的知识点。