22.3 使用外部数据源中的表/视图
外部数据源中的表或视图被注册了以后,有权限的设计者就可以在设计时使用它们。
能够使用它们的场合包括:
定义填写规范
定义表间公式
在模板上映射数据表
Oracle外部数据源查询优化
想获得外部数据源中的数据,常见的做法是定义一个提数表间公式,用外部数据源的表作为来源表。
需要大家知道的是,Excel服务器所用的数据库是SQL Server,所有对数据的读写功能,全部是在SQL Server 数据库中执行,即使是读取其它数据库的外部数据源的数据,也是从SQL Server 中向其它数据库发出一个查询命令,其它的数据库把查询的结果返回给SQL Server,SQL Server再把结果反馈到界面上,我们就能看到查出的数据。通过SQL Server去查询其它数据库的数据,会有一个限制,就是利用不到其它数据库中的索引,当外部数据源表中数据量很大时,查询速度会比较慢。为了解决这个问题,针对Oracle 外部数据源,专门设计了查询优化的功能。
当我们定义一个提数公式,其来源数据表选择了Oracle外部数据源的表后,界面上可能会出现如下的选项:
“以Oracle 为外部数据源时,优化执行速度....”,如下图所示。
图中可见,执行速度有两种可选的模式:普通模式和优化模式。当然优化模式执行速度更快,所以我们肯定愿意选择优化模式。但是,要想选择优化模式,您定义的表间公式必须同时满足以下条件:
1)表间公式的来源数据,都是同一个oracle外部数据源中的表
2)筛选条件或填充方式中,不能用到:结算年、结算月、结算日等带结算时间的函数,此集合函数。
3)筛选条件或填充方式中,不要用到“本报表.明细表.字段”
如果不能同时满足以上条件,就不能选择优化模式,只能选择普通模式,相应地,也就达不到优化查询速度的目的。至于为什么要满足以上条件,涉及到具体的数据库查询处理方式,这里不细说,只说明一点,满足这些条件保证了,所做的数据库查询只需要对Oracle 数据库查询,不需要对Oracle的表和SQL Server的表联合查询。 单纯对Oracle 数据库查询,可以优化,而一旦需要对Oracle 的表和SQL Server的表做联合查询,就会受到 SQL Server 的制约,就无法做查询优化。
这也提示了我们针对Oracle外部数据表定义提数公式时的一个原则,就是,让提数公式做的事情尽量“单纯”,宁可多写几条公式。 比如,我们自己做的Excel服务器的系统要管理订单,订单本身是Excel服务器的模板上定义的表,订单上用的产品信息来自SAP系统,是Oracle外部数据源的表,以往,我们可能定义一条公式,公式的来源数据是两个表,一个是oracle 外部数据源的产品表,另一个是订单模板上的订单表,这样写公式很简洁,一条公式就把要查的数据查了,但是不够“单纯”,因为一条公式,既用到了oracle中的表,也用到了SQL Server中的表,这样的公式是无法优化的。为了达到优化的目的,我们需要把这一条公式拆成两条公式,一条查Oracle 中的产品,另一条查订单,如此满足了优化的条件,查Oracle 产品的公式就可以选优化模式。