内容


Big SQL V4.X 中联邦的新特性

Comments

联邦特性首次在 Big SQL V3 中亮相时,我编写了上一篇关于此主题的文章。自那以后,配置得到了简化和改进。本教程将介绍从 V4.0 开始一直到 V4.2.5,在 Big SQL 联邦特性中引入的增量更改。如果跟随这些示例进行操作,在学完本教程后,您应该已经设置了一种基本联邦。

这是一篇独立的教程,您不需要提前阅读任何关于该主题的文章。要比较当前版本与旧版本,请参阅相关主题部分,获取我的上一篇文章的链接。

在整篇教程中,提供了一些代码样本。命令行语句的格式为:[<USER>@myserv]$ <COMMAND>。SQL 语句没有前缀,而且显示的输出是使用 jsqsh 获取的。

完成本教程需要做的准备工作

Big SQL 联邦概述

可以将联邦描述为一种数据仓库架构,其中的不同数据源通过一个中央联邦数据库进行连接并交换信息。

启用联邦特性后,Big SQL 可发挥中央联邦数据库的作用。

联邦依靠 3 个基本对象与远程数据库建立连接:一个包装器、一个服务器、一个(或多个)用户映射,以及其他重要概念(包括函数映射和昵称):

  • 包装器— 包装器是一种使联邦服务器能支持某种特定类型的数据源的对象。这些对象包含特定数据类型支持的版本和默认函数映射信息。
  • 服务器— 服务器是一种表示与特定远程数据源的连接的对象。该对象包含远程数据库的信息 —例如,远程数据源是否有一个与 Big SQL 的二元排序匹配的排序序列。
  • 用户映射— 用户映射是一种对象,包含在与远程数据源通信并在其上执行操作时用作代理的用户的信息。用户映射可以是用户级别的,每个本地用户都映射到一个远程用户,或者它们可以是公共的,任何通过 Big SQL 验证的用户都会映射到一个远程用户。
  • 函数映射— 函数映射是将本地函数映射到远程函数的对象,这通常是因为函数拥有不同的返回类型、不同的参数,甚至拥有不同的名称。创建一个包装器时,会建立一些默认函数映射,但您也可以为任何函数创建映射。
  • 昵称— 昵称是表示远程表的对象。在联邦中,可以使用 3 段式名称来访问远程表。昵称不只是与远程表的简单连接。它向本地目录添加一个条目来收集统计数据,优化器可以使用这些数据计算查询的成本。

下图演示了该架构,以及联邦对象与真实对象的关系。

图 1.联邦架构的表示图
联邦架构的表示图
联邦架构的表示图

增量改进

对 Big SQL 联邦的更改是循序渐进的。仅在后来的版本中可以发现一些简化。对于之前使用过联邦的用户,下面列出了各项改进和引入它们的版本。

表 1.对 Big SQL 中的联邦特性的改进
改进 Big SQL 版本
添加了对数据源 MSSQL 的支持。 V4.0
需要将 Oracle 和 ODBC 库的路径单独添加到 db2dj.ini 中。 V4.1
不再需要对 Db2 数据源进行编目。一种新的 create server 语法允许定义主机和端口。 V4.2
IBM 品牌的 ODBC 驱动程序默认安装在 /usr/ibmpacks/bigsql/<version>/db2/federation/odbc 下。V4.2
Netezza ODBC 驱动程序默认安装在 /usr/ibmpacks/bigsql/<version>/db2/federation/netezza 下。V4.2
样本 db2dj.ini 默认情况下是在实例所有者主目录中的 sqllib/cfg 下创建的。 V4.2
不需要显式创建包装器。 V4.2
支持与 Oracle 建立 ODBC 连接
- 不需要 Oracle client/tnsnames.ora。
V4.2.5
新增服务器类型 oracle_odbc 和 mssql_odbc。 V4.2.5
针对 ODBC 数据源的新 create server 语法意味着不再需要 odbc.ini 文件。 V4.2.5

环境设置

不同数据源有不同的需求,而且更高的 Big SQL 版本简化了所需的设置步骤。您应该注意仅根据将要使用的数据源和安装的 Big SQL 版本,执行必要的更改。以下每节中的“版本更改”项都包含关于哪些 Big SQL 版本需要每种设置的信息。

以下所有示例都假设实例所有者是用户 bigsql,它的主目录是 /home/bigsql。

Db2 环境设置

版本更改:V4.1 及以前的版本需要此设置。

依赖项:无

对于 Big SQL V4.1 或更低的版本,create server 语句需要一个 TCP/IP 节点和要编目的远程数据库。

清单 1.对远程服务器进行编目的 SQL 语句
CATALOG TCPIP NODE MYNODE REMOTE 192.168.0.1 SERVER 32051

MYNODE – 本地目录上的远程节点的名称

192.168.0.1 – 远程服务器的 IP 地址

32051 – Db2 服务在此端口上运行

清单 2.对远程数据库进行编目的 SQL 语句
CATALOG DATABASE MYDB AS "RMTDB" AT NODE "MYNODE"

DATASD2 – 远程数据库实例名称

RMTDB – 本地目录上的远程数据库的名称

MYNODE – 编目的远程服务器

Teradata 环境设置

版本更改:所有 Big SQL 版本都需要此设置。

依赖项:Teradata 包装器依赖于 cliv2,后者可从官方来源获得。

将 Teradata cliv2 安装到您的系统上后(例如,我假设安装路径为 /opt/teradata/client/<VERSION>/),包装器库需要链接到客户端库。为实现此目的,实例所有者的主目录中的 sqllib/bin 目录下提供了一个可执行的 djxlinkTeradata 命令。

以 root 用户身份,导出环境变量 TERADATA_LIB_DIR 以指向 cliv2 库,然后执行二进制命令:

清单 3.将 Teradata 包装器链接到 Teradata cliv2 客户端
[root@myserv]$ export TERADATA_LIB_DIR=/opt/teradata/client/15.10/lib
[root@myserv]$ /home/bigsql/sqllib/bin/djxlinkTeradata

Oracle 环境设置

版本更改:Big SQL V4.2 及以前的版本需要此设置。

依赖项:对于 Big SQL V4.2 及以前的版本,提供了 Net8 包装器。此包装器依赖于 Oracle 的即时客户端。对于 Big SQL V4.2 以前的版本,必须在实例所有者的主目录中的 sqllib/cfg 目录下创建 db2dj.ini。

安装 Oracle 即时客户端后(对于下面这个示例,我假设它位于 /opt/oracle_instantclient_<VERSION>/),必须将客户端库添加到 Big SQL 路径。要实现此目的,可将变量 LIBPATHDB2LIBPATHLD_LIBRARY_PATH 添加到实例所有者主目录中的 sqllib/cfg/ 目录下的 db2dj.ini 文件中。

db2dj.ini 中需要另外两个变量:ORACLE_HOME 和 TNS_ADMIN,前者包含 Oracle 客户端的完整路径的值,后者包含 tnsnames.ora 所在的文件夹的路径。

清单 4.适用于 Oracle 的 /home/bigsql/sqllib/cfg/db2dj.ini
LIBPATH=//opt/oracle_instantclient_12_1/lib: 
DB2LIBPATH=/opt/oracle_instantclient_12_1/lib: 
LD_LIBRARY_PATH=/opt/oracle_instantclient_12_1/lib: 
ORACLE_HOME=/opt/oracle_instantclient_12_1
TNS_ADMIN=/home/bigsql/bin/

Netezza 环境设置

版本更改:Big SQL V4.1 及以前的版本需要此设置。

依赖项:对于 Big SQL V4.1 及以前的版本,Netezza 数据源需要通用的 ODBC 驱动程序以及 Netezza 客户端 ODBC 库。Netezza 客户端可从 IBM Fix Central 下载。IBM Fix Central 提供了一个包含 Netezza 客户端和 DataDirect OBDC 驱动程序的捆绑软件。另外,如果要使用其他 ODBC 数据源,推荐使用 IBM 品牌的 ODBC 驱动程序代替 DataDirect OBDC 驱动程序。

安装 ODBC 驱动程序和 Netezza 客户端后(对于下面这个示例,我假设分别安装在路径 /opt/odbc_7.1/ 和 /opt/netezza 下),必须将 ODBC 驱动程序和 Netezza 客户端的库文件添加到 Big SQL 路径中。要实现此目的,可将它们的位置添加到变量 LIBPATH、DB2LIBPATH 和 LD_LIBRARY_PATH 中,这些变量位于实例所有者主目录中的 sqllib/cfg/ 目录下的 db2dj.ini 文件中。

db2dj.ini 中需要另外两个变量:NZ_ODBC_INI_PATH 和 ODBCINST,前者包含 odbc.ini 文件的位置的完整路径值,后者包含 odbc.ini 文件的完整路径。

清单 5.适用于 Netezza 的 /home/bigsql/sqllib/cfg/db2dj.ini
LIBPATH=/opt/odbc_7.1/lib:/opt/netezza/lib64: 
DB2LIBPATH=/opt/odbc_7.1/lib:/opt/netezza/lib64: 
LD_LIBRARY_PATH=/opt/odbc_7.1/lib:/opt/netezza/lib64: 
NZ_ODBC_INI_PATH=/home/bigsql/sqllib/cfg
ODBCINST=/home/bigsql/sqllib/cfg/odbc.ini
清单 6.适用于 Netezza 的 /home/bigsql/sqllib/cfg/odbc.ini
[ODBC Data Sources]
NZSQL = NetezzaSQL

[NZSQL]
Driver                = /opt/netezza/lib64/libnzodbc.so
Description           = NetezzaSQL ODBC
Servername            = 192.168.0.3
Port                  = 5480
Database              = TESTDB
Username              = netuser
Password              = netpassword

[ODBC]
IANAAppCodePage=4
InstallDir=/opt/odbc_7.1.6
Trace=0
TraceDll=/opt/odbc_7.1.6/lib/FOtrc27.so
TraceFile=odbctrace.out
UseCursorLib=0

Microsoft SQL Server 环境设置

版本更改:Big SQL V4.2 及以前的版本需要此设置。

依赖项:可通过 IBM 品牌的 ODBC 驱动程序访问 Microsoft SQL Server。

安装 ODBC 驱动程序后(对于下面这个示例,我假设它们安装在 /opt/odbc_7.1 下),ODBC 驱动程序的库文件必须添加到 Big SQL 路径中。要实现此目的,可将该路径添加到变量 LIBPATH、DB2LIBPATH 和 LD_LIBRARY_PATH 中,这些变量位于实例所有者主目录中的 sqllib/cfg/ 目录下的 db2dj.ini 文件中。

db2dj.ini 中还需要另外一个变量:DJX_ODBC_LIBRARY_PATH,该变量包含 ODBC 驱动程序的 lib 文件夹的完整路径值。

必须在实例所有者主目录中创建一个名为 .odbc.ini 的文件或软链接,并在其中包含远程数据源定义。

清单 7.适用于 Microsoft SQL Server 的 /home/bigsql/sqllib/cfg/db2dj.ini
LIBPATH=/opt/odbc_7.1/lib: 
DB2LIBPATH=/opt/odbc_7.1/lib: 
LD_LIBRARY_PATH=/opt/odbc_7.1/lib: 
DJX_ODBC_LIBRARY_PATH=/opt/odbc_7.1/lib:
清单 8.适用于 Microsoft SQL Server 的 /home/bigsql/.odbc.ini
[mssql2012csdl3]
Driver=/opt/odbc_7.1/lib/FOsqls27.so
Description=SQL Server IBM-Branded Driver
Database=mssql2012db3
Address=192.168.0.4,1433

[mssql2016csdl1]
Driver=/opt/odbc_7.1/lib/FOsqls27.so
Description=DataDirect 7.1 SQL Server Wire Protocol
Database=mssql2016db1
Address=192.168.0.5,1433

[ODBC]
IANAAppCodePage=4
InstallDir=/opt/odbc_7.1/lib/
Trace=0
TraceDll=/opt/odbc_7.1/lib/FOtrc27.so
TraceFile=odbctrace.out
UseCursorLib=0

联邦对象

Big SQL 联邦架构以 3 个核心对象为基础。它们是包装器、服务器和用户映射。

创建这些联邦对象的用户必须拥有 DBADM 特权。

联邦对象有一种固有的分层结构。如果丢弃某个对象,所有从属对象也会丢弃。

每种数据源类型在实例用户的主目录中的 sqllib/cfg 下都有一个 XML 文件。这个文件使用包装器的名称进行命名,可根据该文件来查找可用于数据源的选项,包括包装器选项、服务器选项和支持的数据类型。例如,Db2 数据源使用了 DRDA 包装器,所以您可以查询 drda.xml 来发现哪些选项可用和它们的默认值是多少。

包装器

包装器表示一种通用的数据源类型。

受防护与受信任

包装器的最重要选项之一是 DB2_FENCED,它控制包装器是以受防护还是受信任进程形式运行。受信任包装器与 Big SQL 引擎在同一个进程中运行,这可能让运行速度变得更快;受防护包装器在单独的进程中运行,这可以从独立分配资源中获取优势。

使用 create server 语句隐式创建包装器时,始终将它创建为受防护包装器。运行受防护包装器有诸多优势。最明显的优势是保护 Big SQL 引擎。受防护进程的资源是与主引擎分开分配的,所以即使包装器在执行某种内存密集型处理,也不会影响数据库的正常功能。 另一个优势是更高的性能。不同于受信任包装器,受防护包装器允许在昵称与本地表之间执行并行化连接,每个节点将接收部分昵称数据来执行本地连接。

但是,受防护包装器不支持联邦过程。联邦过程之于远程过程,就像昵称之于远程表,而且只有受信任的包装器支持它们。

默认包装器

从 Big SQL V4.2 开始,在运行 create server 语句时,会为该服务器类型创建一个默认的受防护包装器。下面列出了服务器类型与创建的默认包装器之间的映射。

表 2.每种服务器类型的默认包装器
服务器类型V4.2.5 包装器V4.2 包装器
DB2 DRDA DRDA
Teradata TERADATA TERADATA
Oracle ODBC Net8
Netezza ODBC ODBC
Microsoft SQL Server ODBC MSSQLODBC3

如何创建或丢弃包装器

从 V4.2 开始,create server 语句会隐式创建一个默认包装器。您总是可以创建一个个性化包装器。

可以选择使用表 2 中的数据类型的默认包装器名称,或者使用不同的名称。如果使用不同的名称,必须使用相应包装器库的文件名来定义 LIBRARY 子句。使用默认包装器名称时无需这么做。包装器库位于实例所有者的主目录中的 sqllib/lib64 下。

ODBC 包装器有一个额外的必要选项:MODULE。在以下示例中,使用的 ODBC 库路径是从 Big SQL V4.2 开始默认安装的路径。对于更低的版本,MODULE 选项应指向安装 ODBC 库的位置。

包装器位于分层结构的最高层,所以如果丢弃某个包装器,也会丢弃使用它的所有服务器、用户映射和昵称。

可在各个包装器的 sqllib/cfg 下的 XML 文件的 <wrapper_options> 部分查询包装器选项。

下面提供了针对受支持的每种数据源类型的一系列示例。这些示例使用以下格式:

  1. 最简单的 create wrapper 语句
  2. Drop wrapper 语句
  3. 包含选项的 Create wrapper
  4. 包含一个不同名称的 Create wrapper
清单 9.DRDA 包装器
CREATE WRAPPER DRDA;
DROP WRAPPER DRDA;
CREATE WRAPPER DRDA OPTIONS (DB2_FENCED 'Y');
CREATE WRAPPER MYDRDA LIBRARY 'libdb2drda.so';

DRDA – Db2 包装器的默认名称

MYDRDA – 包装器的自定义名称,使用自定义名称需要定义子句 LIBRARY

libdb2drda.so – Db2 包装器的库

DB2_FENCED – 将包装器设置为受防护进程的选项

清单 10.Teradata 包装器
CREATE WRAPPER TERADATA;
DROP WRAPPER TERADATA;
CREATE WRAPPER TERADATA OPTIONS (DB2_FENCED 'Y');
CREATE WRAPPER MYTERADATA LIBRARY 'libdb2teradata.so';

TERADATA – 默认 Teradata 包装器名称

libdb2teradata.so – Teradata 包装器的库

清单 11.ODBC 包装器
CREATE WRAPPER ODBC OPTIONS (MODULE '/usr/ibmpacks/bigsql/4.2.5.0/db2/federation/odbc/lib/libodbc.so');
DROP WRAPPER MYODBC;
CREATE WRAPPER MYODBC LIBRARY 'libdb2rcodbc.so' OPTIONS (MODULE '/usr/ibmpacks/bigsql/4.2.5.0/db2/federation/odbc/lib/libodbc.so');

ODBC – 默认 ODBC 包装器名称

libdb2rcodbc.so – ODBC 包装器的库

MODULE – ODBC 包装器需要此选项,它应该是 ODBC 库文件的绝对路径

如何修改包装器

创建一个包装器后,可使用 ALTER WRAPPER 语句修改它。

清单 12.ALTER WRAPPER
ALTER WRAPPER DRDA OPTIONS (SET DB2_FENCED 'N');
ALTER WRAPPER ODBC OPTIONS(SET DB2_FENCED 'Y', SET MODULE '/opt/odbc7.1/lib/libodbc.so');

包装器和包装器选项的目录

SYSCAT 模式下有两个视图包含关于包装器的信息:可分别使用 SYSCAT.WRAPPERS 和 SYSCAT.WRAPOPTIONS 来查询现有的包装器和它们的选项。

清单 13. 包装器目录查询
select * from syscat.wrappers;
+----------+----------+-------------+-----------------+---------+
| WRAPNAME | WRAPTYPE | WRAPVERSION | LIBRARY         | REMARKS |
+----------+----------+-------------+-----------------+---------+
| DRDA     | R        |           0 | libdb2drda.so   | [NULL]  |
| ODBC     | R        |           0 | libdb2rcodbc.so | [NULL]  |
+----------+----------+-------------+-----------------+---------+
2 row in results(first row: 0.928s; total: 0.930s)


select * from syscat.wrapoptions where wrapname='ODBC';
+----------+------------+-----------------------------------------------------------------+
| WRAPNAME | OPTION     | SETTING                                                         |
+----------+------------+-----------------------------------------------------------------+
| ODBC     | DB2_FENCED | Y                                                               |
| ODBC     | MODULE     | /usr/ibmpacks/bigsql/4.2.5.0/db2/federation/odbc/lib/libodbc.so |
+----------+------------+-----------------------------------------------------------------+
2 rows in results(first row: 0.086s; total: 0.090s)

服务器

联邦服务器对象表示远程数据库实例。

数据源与服务器类型/包装器的映射

下表显示了数据源、要在 create server 类型中使用的服务器类型,以及使用的包装器之间的关系。

表 3.数据源与 create server 语句的服务器类型的映射
数据源服务器类型包装器备注
Db2 LUW db2/udb drda
Db2 z/OS® db2/zos drda
Oracle oracle Net8
Oracle oracle_odbc odbc 仅在 V4.2.5 中可用
Microsoft SQL Server mssqlserver mssqlodbc3
Microsoft SQL Server mssql_odbc odbc 仅在 V4.2.5 中可用
Netezza netezza odbc
Teradata teradata teradata

如何创建或丢弃服务器

服务器是联邦对象分层结构中从上往下的第二个对象。丢弃某个服务器时,还会丢弃与之相关的所有用户映射和昵称。在实例所有者主目录中的 sqllib/cfg 下的包装器 XML 文件中,可以在 <server_options> 小节中找到针对所使用服务器类型的服务器选项。create server 语句是更高 Big SQL 版本中简化的语句之一。语法稍有变化,而且 WRAPPER 等某些部分变为可选。以下是每种数据源和可有效使用它们的 Big SQL 版本的示例:

  • Create server 语句
  • Drop server 语句
清单 14.Db2 数据源(V4.2 以前)
CREATE SERVER MYDB2 TYPE DB2/UDB VERSION 11 WRAPPER DRDA AUTHORIZATHION "newton" PASSWORD "Password" OPTIONS (NODE 'MYNODE', DBNAME 'RMTDB', PUSHDOWN 'Y');
DROP SERVER MYDB2;

Password – 密码放在引号中来保留大小写

NODE – 设置期间编目的节点

DBNAME – 设置期间编目的远程数据库

清单 15.Db2 数据源(V4.2 及以后)
CREATE SERVER MYDB2 TYPE DB2/UDB VERSION 11 AUTHORIZATION "newton" PASSWORD "Password" OPTIONS (HOST '192.168.0.1', PORT '5000', DBNAME 'MYDB', PUSHDOWN'N');
DROP SERVER MYDB2;

HOST – 可使用 IP、完全限定的 DN 或从本地 hosts 文件识别的别名

PORT – 远程 Db2 服务器将在此端口上进行监听

DBNAME – 远程数据库实例名称

PUSHDOWN – 此数据源的可能选项之一。它会阻止所有在远程服务器上执行的函数或排序。

清单 16.Teradata 数据源
CREATE SERVER TERA TYPE TERADATA VERSION 15 (NODE '192.168.0.6')
DROP SERVER TERA

NODE – 可以是 IP、完全限定的 DN 或从本地 hosts 文件识别的别名

清单 17.Oracle 数据源(V4.2.5 以前)
CREATE SERVER ORA TYPE ORACLE WRAPPER Net8 VERSION 11 OPTIONS (NODE 'oracle11r2');
DROP SERVER ORA;

NODE – tnsname.ora 中的条目

清单 18.Oracle 数据源 (V4.2.5)
CREATE SERVER ORA TYPE ORACLE_ODBC OPTIONS (HOST '192.168.0.2', PORT '1521', SERVICE_NAME 'orcl.ibm.com');
DROP SERVER ORA;

HOST – IP、完全限定的 DN 或从 hosts 文件识别的别名

PORT – 远程服务器将在此端口上运行

SERVICE_NAME – 数据库实例的服务名称

清单 19.Netezza 数据源(V4.2.5 以前)
CREATE SERVER NTZ TYPE NETEZZA WRAPPER ODBC VERSION 7 OPTIONS (NODE 'netezza');
DROP SERVER NTZ;

VERSION – ODBC 驱动程序版本,不是 Netezza 的驱动程序版本

NODE – odbc.ini 中的条目

清单 20.Netezza 数据源 (V4.2.5)
CREATE SERVER NTZ TYPE NETEZZA OPTIONS (HOST '192.168.0.3', DBNAME 'TESTDB');
DROP SERVER NTZ;

HOST – IP、完全限定的 DN 或从 hosts 文件识别的别名

DBNAME – 远程数据库名称

清单 21.Microsoft SQL Server 数据源(V4.2.5 以前)
CREATE SERVER MSSQL TYPE MSSQLSERVER WRAPPER MSSQLODBC3 VERSION 2012 OPTIONS (NODE 'mssql2016csdl1');
DROP SERVER MSSQL;

NODE – odbc.ini 中的条目

清单 22.Microsoft SQL Server 数据源 (V4.2.5)
CREATE SERVER MSSQL TYPE MSSQL_ODBC VERSION 2016 OPTIONS (HOST '192.168.0.5', DBNAME 'mssql2016db1');
DROP SERVER MSSQL;

HOST – IP、完全限定的 DN 或从 hosts 文件识别的别名

DBNAME – 远程数据库实例名称

如何修改服务器

创建服务器后,可使用 ALTER SERVER 语句修改它的选项。

示例展示了以下操作:

  1. 丢弃服务器选项
  2. 更新现有服务器选项的值
  3. 添加服务器选项
清单 23.修改服务器
ALTER SERVER MYDB2 OPTIONS (DROP PUSHDOWN);
ALTER SERVER MYDB2 OPTIONS (SET COLLATING_SEQUENCE 'Y')
ALTER SERVER MSSQL OPTIONS (ADD DB2_MAXIMAL_PUSHDOWN 'Y')

DB2_MAXIMAL_PUSHDOWN – 导致优化器单独根据网络成本来计算查询成本的服务器选项。这将导致大部分查询在被接受后发送到远程服务器。

服务器和服务器选项目录

SYSCAT 模式下有两个视图提供了关于服务器的信息:可以分别使用 SYSCAT.SERVERS 和 SYSCAT.SERVEROPTIONS 查询现有服务器和它们的选项。

清单 24.服务器目录查询
select * from syscat.servers;
+----------+------------+------------+---------------+---------+
| WRAPNAME | SERVERNAME | SERVERTYPE | SERVERVERSION | REMARKS |
+----------+------------+------------+---------------+---------+
| DRDA     | BIGSQL_1   | BIGSQL     | 4.2           | [NULL]  |
| DRDA     | ZOS_1      | Db2/ZOS    | 11.0          | [NULL]  |
| DRDA     | UDB_1      | Db2/UDB    | 11.1          | [NULL]  |
| ODBC     | MSSQL      | MSSQL_ODBC | 2016          | [NULL]  |
+----------+------------+------------+---------------+---------+
4 rows in results (first row: 0.028s; total: 0.030s)
select OPTION, SETTING from syscat.serveroptions where servername='MSSQL';
+------------------------+---------------+
| OPTION                 | SETTING       |
+------------------------+---------------+
| DBNAME                 | mssql2016db1  |
| HOST                   | 9.181.139.172 |
| Db2_MAXIMAL_PUSHDOWN   | Y             |
+------------------------+---------------+
3 row in results(first row: 0.520s; total: 0.522s)

用户映射

用户映射是本地用户与远程用户之间的映射。

用户映射、公共映射还是无映射?

可在一个本地用户与一个远程用户之间创建用户映射。 也可以创建公共映射,将每个能访问 Big SQL 的用户映射到相同远程用户。最后,还可以使用联邦验证而不创建任何映射。

公共映射和单用户映射无法共存。

一些有助于确定使用哪种方法的考虑因素如下:

  • 谁需要远程系统的哪种访问权?
  • 是否有一种集中身份验证机制?
  • 我们是否想使用它?

如果所需的远程数据访问权是统一的,而且仅限所有能访问 Big SQL 的用户访问,那么通过公共映射链接到仅对有限的表拥有限定授权的用户,可能是最佳且最简单的选择。

如果不同用户需要不同的访问级别,或者需要访问不同的远程模式,那么用户映射是最简单的选择。

如果有一个集中身份验证系统(比如 LDAP,本地用户可以在两个系统上拥有相同密码,但保持密码一致比较麻烦),那么最后一种可以阻止创建任何用户映射的备选方案可能是合适的选择。如果 Big SQL 和远程数据源都向同一个 LDAP 服务器执行身份验证,则不需要任何映射;可在所有系统上使用相同的用户凭证。要在 Big SQL 中完成此设置,只需要将 DBM CFG 变量 FED_NOAUTH 设置为 YES。

如何创建/丢弃用户映射

create user mappings 语句的 FOR 子句有两个特殊的关键字。PUBLIC 创建一个与该语句的 OPTIONS 子句中描述的远程用户的公共映射。USER 为当前附加或连接到 Big SQL 的用户创建一个映射。

对于 Db2 数据源,create server 语句上需要授权,而且还需要一个用户映射。其他数据源没有此要求。

用户映射位于分层结构的底层;丢弃它们不会影响其他任何对象。删除该映射可能会删除或更改用户对其他对象的访问权,但不会更改这些对象本身。

创建用户映射后,基本设置也就完成了。现在可通过昵称、一个 3 段式名称或使用直通会话连接到一个远程数据源来测试该设置。

下面的示例展示了:

  1. 创建一个公共用户映射。
  2. 丢弃公共映射。
  3. 为连接用户创建一个用户映射。
  4. 丢弃连接用户映射。
  5. 为指定用户创建一个用户映射。
  6. 丢弃指定用户映射。
清单 25.创建用户映射
CREATE USER MAPPING FOR PUBLIC SERVER UDB_1 OPTIONS (REMOTE_AUTHID 'newton', REMOTE_PASSWORD 'Password');
DROP USER MAPPING FOR PUBLIC SERVER UDB_1;
CREATE MAPPING FOR USER SERVER MSSQL OPTIONS (REMOTE_AUTHID 'user1',REMOTE_PASSWORD 'VeryHardPassword');
DROP USER MAPPING FOR USER SERVER MSSQL;
CREATE MAPPING FOR dataadmin SERVER UDB_1 OPTIONS (REMOTE_AUTHID 'newton', REMOTE_PASSWORD 'Password');
DROP USER MAPPING FOR dataadmin SERVER UDB_1;

REMOTE_AUTHID/REMOTE_PASSWORD – 这些是字符串文字,所以必须放在单引号中。

如何修改用户映射

如果一个远程用户发生更改(例如由于其密码过期),可以运行 ALTER USER MAPPING 语句来修改用户映射。

清单 26.修改用户映射
ALTER USER MAPPING FOR dataadmin SERVER UDB_1 OPTIONS (SET REMOTE_PASSWORD 'newPassword');

用于查询现有用户映射的目录

可在一个 SYSCAT.USEROPTIONS 视图中查找关于现有用户映射的信息。

清单 27.用户映射目录查询
select * from syscat.useroptions;
+--------+------------+------------+-----------------+----------+
| AUTHID | AUTHIDTYPE | SERVERNAME | OPTION          | SETTING  |
+--------+------------+------------+-----------------+----------+
| PUBLIC | G          | UDB_1      | REMOTE_AUTHID   | newton   |
| PUBLIC | G          | UDB_1      | REMOTE_PASSWORD | ******** |
| BIGSQL | U          | BIGSQL_1   | REMOTE_AUTHID   | bigsql   |
| BIGSQL | U          | BIGSQL_1   | REMOTE_PASSWORD | ******** |
+--------+------------+------------+-----------------+----------+
4 rows in results(first row: 0.097s; total: 0.100s)

昵称

昵称表示远程表或视图。

昵称与 3 段式名称之间的区别

3 段式名称是一种访问远程表或视图名称的方式。3 段式名称包含 3 个由点分隔的令牌:服务器名称、远程模式和远程表名称。

使用 3 段式名称的优势是,它们不存在于本地,所以不会占用本地目录中的空间。它们需要有一个服务器对象和一个用户映射,就像昵称一样。

另一方面,昵称是本地目录上的条目。它们的主要优势是,可以为它们计算统计数据,甚至对于没有统计数据的数据源也能这样做。可以在查询优化中使用这些统计数据来确定应将 SQL 语句的哪部分(如果有)发送到远程数据源。它们还支持在昵称与本地表之间的连接操作上实现分区间并行性,将昵称的数据分区,然后由所有节点并行处理连接。

不能在包含独特、引用或用户定义的列类型的表上创建昵称。

如何创建或丢弃昵称

可在远程用户能访问的任何表或视图上创建昵称,除非该表或视图包含上一节中提到的列类型,即独特、引用或用户定义的列类型。

昵称位于联邦分层结构的底层;丢弃它们不会影响其他任何对象。丢弃昵称不会影响远程表。

清单 28.创建昵称
CREATE NICKNAME "UDBPEOPLE" FOR UDB_1.NEWTON.PEOPLE;
DROP NICKNAME "UDBPEOPLE";

UDBPEOPLE – 昵称的本地名称

UDB_1 – 服务器名称

NEWTON – 远程模式

PEOPLE – 远程表名称

如何修改昵称

创建昵称后,会使用默认映射将远程列类型映射到本地类型。用户可能想修改昵称来更准确地表示远程数据。例如,Oracle 支持包含 INT 列的表,但基础表结构将包含 NUMBER,而且 NUMBER 将始终映射到本地 DECIMAL

将远程数据准确地映射到正确的本地数据类型有助于优化查询和提高性能。

请注意,错误的映射可能导致糟糕的性能或错误的结果。

清单 29.修改昵称
ALTER NICKNAME "ORAPEOPLE" ALTER COLUMN ID LOCAL TYPE INT;

昵称的目录

昵称没有特定的目录。可以在 SYSCAT.TABLES 视图中查询它们,它们在该视图中拥有 TYPE 'N'

清单 30.昵称目录查询
select tabschema, tabname, type from syscat.tables where type='N';
+-----------+------------------------+------+
| TABSCHEMA | TABNAME                | TYPE |
+-----------+------------------------+------+
| BIGSQL    | BIGAFED_SMALLCH_NULL   | N    |
| BIGSQL    | TESTINHO               | N    |
| BIGSQL    | BIGSQL_TEST            | N    |
| BIGSQL    | NICK1                  | N    |
+-----------+------------------------+------+
4 row in results (first row: 0.020s; total: 0.021s)

类型映射

在上面的昵称部分中,我介绍了数据类型映射的主题。 除了在昵称级别上更改数据类型映射之外,还可以创建将适用于为给定服务器创建的所有昵称的通用数据类型映射。

如何创建或丢弃数据类型映射

可在 3 种不同的粒度级别上创建通用数据类型映射:服务器类型、服务器类型和版本,或服务器对象。换句话说,可为某种特定类型的所有服务器,为某种特定类型和特定版本的所有服务器,或为某个特定服务器(根据名称)来创建它。

假设我们的系统有两个服务器。两个服务器都具有 Db2/UDB 类型,但一个名为 UDB_1(且版本为 V10.5),另一个名为 UDB_2(且版本为 V11)。

仅当昵称是在创建或丢弃映射之后创建时,这种类型的数据类型映射才会影响到昵称。

下面的示例将演示以下操作:

  1. 创建类型映射
  2. 丢弃类型映射
清单 31.服务器类型级别的数据类型映射
CREATE DATA TYPE MAPPING MY_INT_MAP FROM BIGINT TO SERVER TYPE DB2/UDB TYPE INT;
DROP DATA TYPE MAPPING MY_INT_MAP;

在上面的示例中,我创建了一个服务器类型级别的数据类型映射。此映射将同时应用于我们的两个服务器,并会导致在此类型映射后创建的所有昵称都自动将所有远程 INT 列映射到本地 BIGINT 列。

清单 32.服务器类型和版本级别的数据类型映射
CREATE DATA TYPE MAPPING MY_INT_MAP2 FROM BIGINT TO SERVER DB2/UDB VERSION 10.5 TYPE INT;
DROP DATA TYPE MAPPING MY_INT_MAP2;

在上面的示例中,我们创建并丢弃了一个服务器类型和版本映射。由于指定了版本,此映射仅适用于 UDB_1。在此映射存在期间,在 UDB_1 下创建的昵称将会看到它们的远程 INT 列被映射到本地 BIGINT,而在 UDB_2 下创建的昵称仍拥有从远程 INT 列到 INT 的默认映射。

清单 33.服务器对象级别的数据类型映射
CREATE DATA TYPE MAPPING MY_INT_MAP3 FROM BIGINT TO SERVER UDB_1 TYPE INT;
DROP DATA TYPE MAPPING MY_INT;

最后一个示例展示了为某个特定服务器对象创建的映射。 这个映射仅适用于指定服务器对象(在本例中为 UDB_1)下的昵称。

函数映射

还可以在本地和远程函数之间创建映射,并将此作为一种提高性能的方法。

如何创建或禁用函数映射

默认情况下已映射了大量函数。不能在默认已映射的函数上创建函数映射,但可以禁用默认映射。

如果本地和远程函数的返回类型不同,那么默认情况下可能没有创建函数映射。如果此差别无关紧要,则可以创建一个函数映射来提升性能。

可以在 3 种不同的粒度级别上为系统或用户函数创建函数映射:服务器类型、服务器类型和版本,或服务器对象。也就是说,针对某种特定类型的所有服务器,针对某种特定类型和特定版本的所有服务器,或针对一个特定服务器(根据名称)。

下面的示例将演示以下操作:

  1. 创建函数映射
  2. 丢弃函数映射
清单 34.服务器类型级别的函数映射
CREATE FUNCTION MAPPING MYSTDDEV FOR SYSIBM.STDDEV (INT) SERVER TYPE DB2/UDB OPTIONS (REMOTE_NAME 'SYSIBM.STDDEV');
DROP FUNCTION MAPPING MYSTDDEV;
清单 35.服务器类型和版本级别的函数映射
CREATE FUNCTION MAPPING MYSTDDEV FOR SYSIBM.STDDEV (INT) SERVER TYPE DB2/UDB VERSION 10.5 OPTIONS (REMOTE_NAME 'SYSIBM.STDDEV');
DROP FUNCTION MAPPING MYSTDDEV;
清单 36. 服务器对象级别的函数映射
CREATE FUNCTION MAPPING MYSTDDEV2 FOR SYSIBM.STDDEV (SMALLINT) SERVER UDB_1 OPTIONS (REMOTE_NAME 'SYSIBM.STDDEV');
DROP FUNCTION MAPPING MYSTDDEV2;

直通会话

在直通模式中,会直接将语句传递到远程数据源。Big SQL 成为远程数据源的客户端,使用在用户映射中定义的用户来建立连接。

直通要求已经创建了包装器、服务器和有效的用户映射。

在测试是否已正确配置远程服务器和用户映射时,此模式特别有用。如果需要,还可以使用它直接访问远程数据源。

在直通模式下,用户无法访问本地表。

要进入直通模式,可以使用您想访问的服务器对象名称来运行 SQL 语句 SET PASSTHRU,还可以运行 SET PASSTHRU RESET 终止该模式。

清单 37.直通示例
SET PASSTHRU ORASERV;
0 rows affected (total: 0.011s)
select * from product_component_version where product like 'Oracle Database%';
+----------------------------------------+------------+------------------+
| PRODUCT                                | VERSION    | STATUS           |
+----------------------------------------+------------+------------------+
| Oracle Database 12c Enterprise Edition | 12.1.0.1.0 | 64bit Production |
+----------------------------------------+------------+------------------+
1 row in results(first row: 3.828s; total: 4.011s)
SET PASSTHRU RESET;
0 rows affected (total: 0.002s)

性能

查询优化和谓词下推依赖于拥有查询中涉及的所有对象的正确统计数据。例如,在本地和远程表之间进行连接时,昵称和本地 Hadoop 表都应拥有最新的统计数据。

自动统计

默认情况下,Big SQL 会自动收集统计数据。Hadoop 表和昵称在统计数据自动收集上存在差别。昵称的自动统计数据收集行为更接近缓存表。默认情况下,Hadoop 表通过每 10 分钟运行一次自动分析(默认操作)来收集统计数据;像缓存表一样,昵称是通过约每两小时运行一次 auto_runstats 来计算的。

运行分析或 runstats 具有相同的过程,在它们运行时,都会使用条件(是否已使用该表,它之前是否运行过统计等)来决定是否应重新计算统计数据。

可查询数据库配置,检查是否在 Big SQL 实例上启用了 auto_runstats

清单 38.在 db cfg 上运行 Runstats
[bigsql@myserv ~]$ db2 get db cfg
…
   Automatic runstats                  (AUTO_RUNSTATS) = ON
       Real-time statistics            (AUTO_STMT_STATS) = ON
       Statistical views              (AUTO_STATS_VIEWS) = OFF
       Automatic sampling                (AUTO_SAMPLING) = ON
…

检查是否对某个表运行过统计的一种方法是,在 SYSSTAT 模式下查询 TABLES 和 COLUMNS 视图。还未运行统计的表将有一个值为 -1 的基数 (card) 列。在下面的示例中,昵称和 Hadoop 表都没有统计数据。

清单 39. SYSSTAT.TABLES 视图
select tabschema, tabname, card from sysstat.tables where tabschema='BIGSQL';
+-----------+-----------+------+
| TABSCHEMA | TABNAME   | CARD |
+-----------+-----------+------+
| BIGSQL    | HADOOP_T1 |   -1 |
| BIGSQL    | NICK1     |   -1 |
| BIGSQL    | TEST      |    0 |
+-----------+-----------+------+
3 rows in results(first row: 0.056s; total: 0.059s)

手动收集统计数据

如果在创建后不久就使用昵称,而且性能从一开始就很重要,可以使用 SYSPROC.NNSTAT 过程更新昵称统计数据。

在提供的示例中,使用了收集方法 0。这种收集方法会尝试从远程来源检索统计数据。如果无法执行该检索,则会执行一系列查询来填充统计视图。在远程统计数据不是最新数据时,这可能并不总是最佳选择。

清单 40. 更新昵称的统计数据
CALL SYSPROC.NNSTAT('UDB_1','BIGSQL','NICK1','ID, COL_VCH, DEC1','IX1',0,'/home/bigsql/stats.log', ?, 1)

UDB_1 – 服务器对象。

BIGSQL – 昵称所在的模式。

NICK1 – 将对其运行统计的昵称。如果此参数和模式参数为 NULL,则会对为服务器 UDB_1 创建的每个昵称运行统计。

'ID..'– 要收集其统计数据的列。

'IX1' – 要收集统计数据的索引。

0 – 收集方法,可以为 1(从远程数据源抓取统计数据)、2(在本地查询数据并计算统计结果) 或 0/NULL(尝试方法 1,如果失败则尝试方法 2)。

'/home/bigsq/stats.log' – 操作的日志文件。

? – 输出参数

1 – 更新方法,为多个昵称运行统计时可使用该方法。该参数可以为 0(所有统计数据都将同时更新)或 1(以一次更新一个昵称的方式更新统计数据)。

清单 41.更新在某种模式下创建的所有昵称的统计数据
CALL SYSPROC.NNSTAT(NULL,'BIGSQL',NULL,NULL,NULL,0,NULL,?,1);
ok.(total: 14.230s)

+-------------+------------+
| Return Code | Param #2   |
+-------------+------------+
|           0 | Successful |
+-------------+------------+

如何获取查询并读取它的计划

要获取查询计划,必须在模式上为请求该计划的用户安装解释表。

安装它们的一种方法是使用位于实例所有者主目录的 sqllib/misc 下的 EXPLAIN.DDL 文件。

清单 42. 安装解释表
[bigsql@myserv ~]$ db2 -tvf ~/sqllib/misc/EXPLAIN.DDL

解释查询的一种方式是为它添加前缀 "explain all for"(这会填充解释表),然后使用 db2exfmt 以一种容易阅读的格式将此信息输出到一个文件中。

清单 43.Explain all 和 db2exfmt
explain all for select count (*) from nick1;
0 rows affected (total: 0.094s)

[bigsql@myserv ~]$ db2exfmt -d bigsql -1 -o count.plan
DB2 Universal Database Version 11.1, 5622-044 (c) Copyright IBM Corp. 1991, 2016
Licensed Material - Program Property of IBM
IBM DATABASE 2 Explain Table Format Tool

Connecting to the Database.
Connect to Database Successful.
Binding package - Bind was Successful
Output is in abs.plan.
Executing Connect Reset -- Connect Reset was Successful.

-d – 要连接到的数据库

-o – 计划的输出文件

-1 – 对其他所有选项使用默认值(这将选择上次解释的查询的信息)

下推机会

本节将研究谓词下推机会,具体来讲,将研究函数 ABS,该函数返回所传入的参数的绝对值。对于本示例,我将使用一个具有完全相同的函数(相同的名称和相同的返回类型)的 Db2 数据源,所以已存在针对此函数的默认映射。

清单 44.ABS 的请求计划
explain all for select abs(id) from nick1 where abs(id)>6;
0 rows affected (total: 0.094s)

[bigsql@myserv ~]$ db2exfmt -d bigsql -1 -o abs.plan
DB2 Universal Database Version 11.1, 5622-044 (c) Copyright IBM Corp. 1991, 2016
Licensed Material - Program Property of IBM
IBM DATABASE 2 Explain Table Format Tool

Connecting to the Database.
Connect to Database Successful.
Binding package - Bind was Successful
Output is in abs.plan.
Executing Connect Reset -- Connect Reset was Successful.

在 abs.plan 文件中,找到 SHIP 部分。这部分对应于发送到远程数据源的操作。在这部分中,RMTQTXT 参数是发送到远程服务器的查询。大体上讲,对于该查询,可以下推整个查询。

清单 45.ABS 计划的 SHIP 部分
     2) SHIP  : (Ship)
                …

                Arguments: 
                ---------
                CSERQY  : (Remote common subexpression)
                        FALSE
                DSTSEVER: (Destination (ship to) server)
                        - (NULL).
                RMTQTXT : (Remote statement)
                        SELECT A0."ID" C0 FROM "NEWTON"."TABLE1" A0 WHERE (6 < SYSIBM.ABS(A0."ID")) FOR READ ONLY
                SRCSEVER: (Source (ship from) server)
                        UDB_1
                 ...

在这个示例中,仅下推了过滤器部分;返回的值是原始 INT 值,而不是预期的 ABS。因为谓词已作为过滤器下推,所以我们知道有一个现有的映射,而且该谓词可以下推。

优化器使用复杂启发法来计算某个操作的成本。在类似这样的情况下,远程计算 ABS 的性能可能比本地计算还要低。要核实这一点,可以强制优化器下推它能下推的所有功能,并仅考虑网络成本。可通过添加服务器对象选项 DB2_MAXIMAL_PUSHDOWN 或将它设置为“Y”来完成此操作。

清单 46.包含 DB2_MAXIMAL_PUSHDOWN 的 ABS 计划
alter server udb_1 options (add DB2_MAXIMAL_PUSHDOWN 'Y');
0 rows affected (total: 0.181s)
explain all for select abs(id) from nick1 where abs(id)>6;
0 rows affected (total: 0.035s)

[bigsql@myserv ~]$ db2exfmt -d bigsql -1 -o abs2.plan
DB2 Universal Database Version 11.1, 5622-044 (c) Copyright IBM Corp. 1991, 2016
Licensed Material - Program Property of IBM
IBM DATABASE 2 Explain Table Format Tool

Connecting to the Database.
Connect to Database Successful.
Output is in abs2.plan.
Executing Connect Reset -- Connect Reset was Successful.
清单 47.包含 DB2_MAXIMAL_PUSHDOWN SHIP 部分的 ABS 计划
       2) SHIP  : (Ship)
                ...
                Arguments: 
                ---------
                CSERQY  : (Remote common subexpression)
                        FALSE
                DSTSEVER: (Destination (ship to) server)
                        - (NULL).
                RMTQTXT : (Remote statement)
                        SELECT SYSIBM.ABS(A0."ID") C0 FROM "NEWTON"."TABLE1" A0 WHERE (6 < SYSIBM.ABS(A0."ID")) FOR READ ONLY
                SRCSEVER: (Source (ship from) server)
                        UDB_1
                …

这一次,下推了整个查询。在分析某个函数的下推机会时,如果该函数未下推,甚至将 DB2_MAXIMAL_PUSHDOWN 设置为“Y”后也是如此,那么有可能是该函数没有默认映射。在这些情况下,可以选择评估是否存在等效的函数,并创建一个函数映射。

分区间并行性

在本地 Hadoop 与远程表之间执行连接时,可以使用分区间并行性。分区间并行性的含义是:在本地和远程表都运行统计时,尽管只有头节点与远程数据源进行过通信,但在执行连接时,远程数据将分散化,使每个节点都会收到所有数据的一部分并执行本地连接。

将 Hadoop 表连接到昵称

在连接本地 Hadoop 表和昵称时,分区间并行性的唯一要求是,用于昵称的包装器是受防护包装器。

只有在连接中的昵称数据量比本地分区数据量更少时,才会执行并行方法;否则对数据分区并将其发送到节点的成本将使该操作变得更慢,而不是更快。

如果统计数据缺失或错误,优化器计算出并行化查询具有最高成本效益的可能性不大。

对于分区间并行查询的查询计划,在 Access Plan 部分的 SHIP 运算符上方将有一个 BTQ 运算符。

清单 48.连接上没有并行性
Access Plan:   
-----------
        Total Cost:             1510.36
        Query Degree:           8
        
          
                Rows     
               RETURN  
               (   1)  
                Cost   
                 I/O   
                 |     
               694676    
               HSJOIN  
               (   2)  
               1510.36
                 13    
            /----+----\
        25451.6       13365.6                                                                          
        BTQ           SHIP  
        (   3)        (   6)                                                                           
        1311.88       193.226                                                                          
          10             3
          |             |
        64787.7       355360                                                                           
        LTQ      NICKNM: BIGSQL                                                                        
        (   4)     ALLTYPES_NETZ  
        1299.55         Q2
          10             
          |
        64787.7
        TBSCAN
        (   5)
        1292.19
          10
          |
      3.42692e+06
   HTABLE: BIGSQL
 BIGAFED_ALLTYPES_SDS
          Q1
清单 49.连接上的并行性
Access Plan: 
-----------
        Total Cost:             672368
        Query Degree:           8


                Rows
               RETURN
               (   1)
                Cost
                 I/O
                 |
               27.4092
               DTQ
               (   2)
               672368
               171339
                 |
               13.7046
               LTQ
               (   3)
               672368
               171339
                 |
               13.7046
               NLJOIN           
               (   4)           
               672368
               171339
            /----+-----\
          0.5          27.4092
        TBSCAN         TBSCAN
        (   5)         (   8)
        1279.45        671085
          10           171328
          |              |
          0.5          27.4092
        SORT           TEMP
        (   6)         (   9)
        1279.45        671085
          10           171328
          |              |
          0.5          27.4092
          TBSCAN       BTQ    
        (   7)         (  10)                                                                          
        1279.45        671085
          10           171328
          |              |
      3.42692e+06      27.4092                                                                         
   HTABLE: BIGSQL      SHIP  
 BIGAFED_ALLTYPES_SDS  (  11)
          Q2           671084
                       171328
                         |
                     1.80717e+06
                  NICKNM: BIGSQL
                   ALLTYPES_BIGSQL
                         Q1

结束语

如果您跟随本教程进行了操作,那么您现在应该知道如何执行基本的联邦设置。您已知道如何设置您的环境,创建基本联邦对象,甚至对涉及远程表的查询的性能执行基本调查。

BigSQL 的联邦是针对大数据产品的一个扩充特性。它允许用户利用位于其他筒仓中的数据并整合它们。甚至还可以使用它确定整合这些数据源是否有用。我使用联邦特性已有一段时间,而且对它带来的各种可能性感到非常兴奋。希望本教程将对任何想尝试此特性的人有所帮助,希望您会像我一样喜欢使用它。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Big data and analytics, Information Management
ArticleID=1051858
ArticleTitle=Big SQL V4.X 中联邦的新特性
publish-date=11072017