文章 Nicky Zhu · 五月 22 3m read

从 Oracle、MSSQL 等迁移到 IRIS 时的注意事项

从 Oracle、MSSQL 或其他纯关系型数据库系统迁移到多模型 InterSystems IRIS 是一项战略决策,需要认真规划和执行。虽然这种过渡具有显著的优势,包括增强性能、可扩展性和对现代架构的支持,但它也伴随着挑战。在本文中,我将重点介绍与编码相关的一些注意事项,以确保成功迁移。与结构和数据的实际迁移相关的所有事项都不在本文讨论范围之内。


首先,当你考虑迁移到不同的数据库系统时,你需要了解你的业务逻辑,无论是在应用程序(应用服务器)还是数据库服务器端。基本上,你需要重写的 SQL 语句在哪里

 

如果应用程序逻辑严重依赖于直接在应用程序代码中执行的 SQL(而不是数据库中的存储过程或触发器),那么从关系数据库迁移到 InterSystems IRIS 时,就需要仔细检查 SQL 语句。让我们来看看你需要考虑的一些最重要的因素。

  1. SQL 方言差异。IRIS SQL 支持 SQL-92 标准。这并不意味着一些更现代的功能没有实现。这只是意味着你需要事先检查。例如,窗口函数出现在 SQL:2003 中,但你仍然可以在 IRIS 中编写它们:
--window function
select id, rating
  from (select a.id, 
               r.rating, 
               avg(r.rating) over () as avg_rating 
          from SQLUSER.Actor a join SQLUser.Review r on a.id = r.Reviews) as sub 
 where rating > avg_rating

同时,不支持新的复杂数据类型,如 XML、JSON、数组和地理数据类型。因此,以下查询

SELECT a.id, 
       a.firstname, 
       ARRAY_AGG(r.rating) AS ratings 
  FROM SQLUSER.Actor a LEFT JOIN SQLUser.Review r ON a.id = r.Reviews 
GROUP BY  a.firstname

将返回错误信息:ERROR #5540: SQLCODE: -359 Message: User defined SQL function 'SQLUSER.ARRAY_AGG' does not exist

但这并不是世界末日。有很多内置函数可以让你重写查询,从而得到预期的结果。

2.内置函数。不同的 DBMS 有不同的内置函数。因此,您需要了解它们与 IRIS 中可用函数的对应关系。下面是我所说的几个例子,Oracle 中使用的函数和 IRIS 中的对应函数:

甲骨文 IRIS
NVL ISNULL(字段,默认值)
子串 $extract(field, start_pos, end_pos)
instr $find(field, text_to_find)
连接 {fn CONCAT(string1,string2)}

当主要SQL 逻辑位于数据库(如存储过程、触发器、视图)中时,迁移到 InterSystems IRIS 需要采用不同的方法。以下是一些注意事项:

  1. 数据库对象迁移
    1. 必须使用 ObjectScript 重写所有存储过程。这也是改用对象模型的好时机,因为当你创建一个类时,无论如何都会得到一个表。不过,使用类可以编写方法(可作为存储过程调用),并充分发挥面向对象范例的威力。
    2. IRIS支持触发器索引 视图 。如果不使用任何不支持的函数/语法,表列保持不变,你甚至可以让视图保持原样(见上一点)。
  2. 定义的迁移也很重要,可能会带来一些挑战。首先,您必须小心地将以前数据库中的数据类型与 IRIS 匹配,尤其是在使用新的复杂类型时。此外,由于索引具有更大的灵活性,您可能希望以不同的方式重新定义索引。

在决定从不同的关系数据库迁移到 InterSystems IRIS 时,您需要考虑以下事项。这是一项战略决策,可以带来显著的效益,包括提高可扩展性、性能和效率。但是,仔细规划对于确保无缝过渡以及满足兼容性、数据转换和应用程序重构需求至关重要。