基础表行存储/压缩
在DB2 9中,XML数据和关系数据存储在不同的位置。这个存储位置称作XML数据区域(XMLdataarea,XDA)。DB2 9将所有XML文档存储在这个存储位置,这意味着访问XML值和关系数据需要更多I/O。如果XML文档较小,而且在存储关系值之后页面大小仍足够容纳 XML值,那么将XML存储在相同的页面能够提供不错的性能收益。这些收益包括:
压缩:因为XML数据和关系数据存储在一起,因此可以使用DB2 9中引入的压缩技术对XML数据进行压缩。由于XML值比关系数据大,所以可以获得较高程度的压缩。
查询性能:由于XML数据和关系数据存储在相同位置,因此直接插入XML数据使得基础表比一般情况下要大。如果XML数据的访问频率与表中的其他关 系值相当,那么这将提高查询数据的性能。
DB2 V9.5引入了XML数据的基础表行存储。这意味着如果每行的关系数据和XML数据的总大小没有超过1页面的大小,这两种数据就可以存储在相同的物理页 面。只有当一个记录的总大小没有超过页面大小时,才能够对XML数据进行基础表行存储。如果是这样,XML数据就会像通常一样存储在XML存储位置。 DB2中允许的页面最大值为32KB,因此一个XML值的最大插入长度也被限制到32KB。如果文档的内部树表示的大小比指定的插入长度小,它们将会被插 入。清单4中的代码所创建的表可以对XML数据进行基础表行存储:
清单4.XML数据的基础表存储
db2 CREATE TABLE emp1(id INT, info XML INLINE LENGTH 1024) |
使用 INLINE 选项指定将 XML 数据跟关系数据存储在一起。这对于要获取的数据都位于相同位置的查询来说很有利。另一方面,对于访问非 XML 数据的查询,这可能导致需要更多的 I/O 才能找到关系数据。
使用 XML 数据基础表行存储的理想情形是,当表只有一个 XML 类型列并且 XML 文档的最大值没有超过页面大小时。
兼容的 XML 模式演化
为了增加灵活性并提供更好的模式演化,DB2 V9.5 为 XML 模式引入了 update 特性。以前注册的模式能够更新为新模式,只要它们互相兼容。如果使用旧模式验证的 XML 文档对于新模式仍然有效,那么这两种模式就是兼容的。
例如,新模式中添加的可选元素和旧模式中的元素兼容,这是由于新元素的可选特性使经过旧模式验证的 XML 文档仍然有效。新 XML 文档可以拥有这个可选元素,并且能够通过新模式的验证。因为旧文档仍然有效,所以更新模式之后无需再执行任何操作。如果模式不兼容,模式更新就会失败。旧 模式的注释和标识符仍然会保留。
为了更新模式,DB2 V9.5 引入了 XSR_UPDATE 存储过程。存储过程检查兼容性,只当新模式具备兼容性时才更新模式。要更新模式,用户需要分别注册新旧模式,然后调用 XSR_UPDATE 存储过程。一旦旧模式经过更新,用户可以选择保留旧模式或者将其删除。
让我们以 customer 表的 info 列作为一个例子。info 列包含 addr 元素,该元素具有以下定义(在 sqllib/samples/db2sampl 目录下可以找到完整的模式)。
清单 5. 旧 XML 模式定义
﹤xs:element xmlns:xs="http://www.w3.org/2001/XMLSchema" name="addr" minOccurs="1" maxOccurs="unbounded"﹥ ﹤xs:complexType﹥ ﹤xs:sequence﹥ ﹤xs:element name="street" type="xs:string" minOccurs="1" /﹥ ﹤xs:element name="city" type="xs:string" minOccurs="1" /﹥ ﹤xs:element name="prov-state" type="xs:string" minOccurs="1" /﹥ ﹤xs:element name="pcode-zip" type="xs:string" minOccurs="1" /﹥ ﹤/xs:sequence﹥ ﹤xs:attribute name="country" type="xs:string" /﹥ ﹤/xs:complexType﹥ ﹤/xs:element﹥ |
之后,用户希望拥有一个可选的 HouseNo 元素。要更新已注册的模式以使标识符保持不变,需要先注册包含附加元素的新模式。 新 addr 元素的定义如下:
清单 6. 新 XML 模式定义
﹤xs:element xmlns:xs="http://www.w3.org/2001/XMLSchema" name="addr" minOccurs="1" maxOccurs="unbounded"﹥ ﹤xs:complexType﹥ ﹤xs:sequence﹥ ﹤xs:element name="HouseNo" type="xs:string" minOccurs="0" /﹥ ﹤xs:element name="street" type="xs:string" minOccurs="1" /﹥ ﹤xs:element name="city" type="xs:string" minOccurs="1" /﹥ ﹤xs:element name="prov-state" type="xs:string" minOccurs="1" /﹥ ﹤xs:element name="pcode-zip" type="xs:string" minOccurs="1" /﹥ ﹤/xs:sequence﹥ ﹤xs:attribute name="country" type="xs:string" /﹥ ﹤/xs:complexType﹥ ﹤/xs:element﹥ |