【问题标题】:Do databases besides Postgres have features comparable to foreign data wrappers?除了 Postgres 之外的数据库是否具有与国外数据包装器相媲美的功能?
【发布时间】:2014-05-01 16:09:54
【问题描述】:

我对最近添加的一些 Postgres 功能(例如外部数据包装器)感到非常兴奋。我不知道有任何其他 RDBMS 具有此功能,但在我尝试向我的主要客户说明他们应该开始更喜欢 Postgres 而不是他们当前的 RDBMS 鸡尾酒之前,并且在我的情况下包括没有其他数据库可以做到这一点,我想验证一下。

我无法找到任何其他支持 SQL/MED 的数据库的证据,以及类似这样的简短说明,指出 Oracle does not support SQL/MED

让我怀疑的主要是http://wiki.postgresql.org/wiki/SQL/MED上的声明:

SQL/MED 是管理外部数据,是 SQL 标准的一部分,它处理数据库管理系统如何集成存储在数据库外部的数据。

如果 FDW 基于 SQL/MED,并且 SQL/MED 是一个开放标准,那么其他 RDBMS 似乎也实现了它。

TL;DR:

除了 Postgres 以外的数据库是否支持 SQL/MED?

【问题讨论】:

  • 我认为 SQL Server 可以做类似的事情(不记得名字)。而甲骨文有“异构服务”:oracle-base.com/articles/misc/…
  • 我很确定所有商业数据库都支持访问远程数据库中数据的方法。当然,SQL Server、Oracle 和 Teradata 提供了此功能。曾几何时,ODBC 是标准化的,这使得该功能随时可用。 (注意:我并不是说这些产品使用 SQL/MED。)
  • 鉴于这似乎很普遍,我想知道为什么其他数据库供应商没有像 Postgres 人那样大肆宣传这种能力。 (也许他们有更好/无痛的实施方式???或者他们只是更擅长营销?)
  • 我认为关键不在于它是否能够或支持类似的东西。真正更重要的是接口,诸如“如何制作 FDW”和“如何从 SQL 中操作数据”之类的内容是 SQL/MED(或类似 SQL/MED 的实现)的范围。
  • 该标准的标志之一是您可以在数据库之间交换 FDW(例如,“哦,我在 XSQL 上创建了这个疯狂的 FDW,现在让它在 MariaDB 上运行!”)。结束... 即使 SQL/MED 已经很老了(与 ISO/ANSI SQL:1999 保持一致),它似乎还不够成熟(因为只有 1 个完全实现的 FDW API,引用 IBM DB2,表明它是过于复杂的 API)并且有更改空间。

标签: sql postgresql foreign-data-wrapper sql-med


【解决方案1】:
  • IBM DB2 声称符合 SQL/MED(包括完整的 FDW API);
  • MySQL的联邦存储引擎can connect to another MySQL database, but NOT to other RDBMSs;
  • MariaDB 的 CONNECT 引擎允许访问各种文件格式(CSV、XML、Excel 等),可以访问“任何”ODBC 数据源(Oracle、DB2、SQLServer 等),并且可以访问存储引擎 MyIsam 上的数据和 InnoDB。
  • Farrago 也有一些;
  • PostgreSQL 实现了它的一部分(特别是它没有实现例程映射,并且具有简化的 FDW API)。自 PG 9.1 起它可用作可读,自 9.3 起可写,在此之前有 DBI-Link

PostgreSQL 社区有很多不错的FDW,例如 noSQL FDW(couchdb_fdw、mongo_fdw、redis_fdw)、Multicorn(用于使用 Python 输出而不是 C 本身作为包装器)或坚果PGStrom(使用 GPU一些操作!)

【讨论】:

    【解决方案2】:

    SQL Server 具有Linked Servers (http://technet.microsoft.com/en-us/library/ms188279.aspx) 的概念,它允许您连接到外部数据源(Oracle、其他 SQL 实例、Active Directory、通过索引服务提供程序的文件系统数据等)和,如果您确实需要,您可以创建自己的Providers,供 SQL Server 链接服务器使用。

    SQL Server 中的另一个选项是CLR,您可以在其中编写代码以根据需要从 Web 服务或其他数据源检索数据。

    虽然这在技术上可能不是“SQL/MED”,但它似乎完成了同样的事情。

    使用本地表连接到 4 部分链接服务器查询的分布式查询。我认为 remotetable 过滤器可能直到整个表被拉到本地后才会应用(文档对此很模糊,我发现文章意见不一致):

    SELECT * 
    FROM LocalDB.dbo.table t
    INNER JOIN LinkedServer1.RemoteDB.dbo.remotetable r on t.val = r.val
    WHERE r.val < 1000
    ;
    

    使用 OpenQuery,remotetable 过滤器将应用于远程服务器,只要将过滤器传递给 OpenQuery 的第二个参数:

    SELECT * 
    FROM LocalDB.dbo.table t
    INNER JOIN OPENQUERY(LinkedServer1, 'SELECT * FROM RemoteDB.dbo.remotetable r WHERE r.val < 1000') r on t.val = r.val
    

    【讨论】:

    • 谢谢!您可以跨外部数据和本地数据进行连接吗?有没有可以与物化视图相媲美的东西,这样它就可以在本地使用,而无需重复查询外部数据库所涉及的延迟?
    • AFAIK 没有“自动”实现 SQL Server 中的链接服务器表的选项,并且链接服务器查询每次都会命中实时远程数据源数据。如果您想要数据的本地副本,则需要编写 ETL 作业以将数据拉入本地表(否则您怎么知道远程数据不是陈旧的?)。您可以在本地和外部数据之间进行连接,但在访问数据时会出现一些问题。例如:select * from LinkedServer1.dbo.someTable where someColumn = 1 实际上会在应用过滤器之前拉下整个远程表。
    • 还有一个选项可以使用 OPENQUERY 并嵌入您的过滤器,这将始终远程应用过滤器,但如果您需要使用 OPENQUERY 的动态参数,则必须通过动态来完成SQL。我将通过使用 openquery 的示例来更新答案。
    • @iconoclast SQL Server 和 PostgreSQL 都有物化视图,但我认为你错过了它们的用途。它们不会从其他表中复制数据,它们只是可以将其数据映射到成员表中,因此您可以通过视图插入/更新/删除数据。
    猜你喜欢
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2019-06-02
    相关资源
    最近更新 更多