加入性能支持¶
app-schema joining是一个可选的配置参数,它告诉app-schema使用不同的实现 特征链 在许多情况下,通过减少发送到DBMS的SQL查询量,可以显著提高性能。
条件¶
要使用应用程序架构联接,必须满足以下配置条件:
使用的所有功能映射都必须映射到JDBC数据存储。
所有相互链接的功能映射必须映射到同一物理数据库。
在您的映射中,父特征中的引用字段和嵌套特征中的引用字段(如FEATURE_LINK)的<SourceExpression>中指定的CQL表达式都有限制。此表达式中使用的任何运算符或函数都必须受过滤器功能的支持,即地理工具必须能够将它们直接转换为SQL代码。对于每个DBMS,这可能是不同的,尽管作为一般规则,可以假设比较运算符、逻辑运算符和算术运算符都受支持,但函数不受支持。使用简单字段名进行功能链接保证总是有效的。
如果在启用联接时不遵守这三个限制中的任何一个,将导致在运行时抛出异常。
在启用联接的情况下使用应用程序模式时,对于正常行为存在以下限制:
在筛选器内指定的xpaths不支持处理引用的功能(请参见 引用的多值属性( XLink:链接 ) )就好像它们是实际的嵌套特性一样,也就是说,只有当根据xpath标准,根据WFS生成的实际XML代码对xpaths进行评估时,才能对xpaths进行评估。
配置¶
默认情况下,连接处于打开状态。通过将此简单行添加到app-schema.properties文件(请参见 插值属性 ):
app-schema.joining = false
或者,或者,通过将Java系统属性“Apple Schema.Engin”设置为“false”,例如:
java -DGEOSERVER_DATA_DIR=... -Dapp-schema.joining=false Start
如果不指定“app schema.joining”参数,默认情况下将启用联接。
数据库设计指南¶
应优化数据库,以便快速连接和订购。
确保将索引放在用作标识符的所有字段上,并尽可能将唯一索引用于功能链接。缺少索引可能会导致数据编码顺序错误,或者在涉及功能链接时导致输出损坏。
最好将您的功能映射到标准化的表。
建议将功能链接应用于常规的一对多关系,即在用于链接的其中一个字段上定义一个唯一约束,如果可能,在另一个字段上定义一个外键约束。
对性能的影响¶
对于具有或不具有连接的配置,其响应时间的典型曲线与产生的特征量的关系如下:

在默认实现中,响应时间相对于生成的特性数量迅速增加。这是因为要素链接是通过向每个要素的DBMS发送多个SQL请求来实现的,因此请求量随着生成的要素数量的增加而增加。当连接处于打开状态时,响应时间几乎与要素的数量有关。这是因为在此实现中,少量较大的查询被发送到DBMS,而与生成的要素数量无关。总而言之,随着请求的功能数量变大,性能差异也会变得更大。连接的一般性能将取决于数据库和映射设计(见上文)以及数据库大小。
强烈建议在需要生成大量功能时使用连接,例如在使用WMS生成地图时(请参见 WMS支持 )
优化数据库的性能将最大限度地利用连接的好处,包括用于小查询。
嵌套属性上过滤器的本机编码¶
当应用程序模式连接处于活动状态时,对嵌套属性(即,通过 特征链 )转换为SQL并直接在数据库后端执行,而不是在加载所有功能后在内存中进行评估(这是早期版本的geoserver中的标准行为)。本机编码可以显著提高性能,特别是当数据库中的功能总数很高(几千个或更多)时,但只有少数功能能够满足过滤器的要求。
然而,在当前的实施中有一些限制:
连接支持不能被显式禁用,必须满足其所有前提条件(见上文)
仅限二进制比较运算符(例如
PropertyIsEqualTo
,PropertyIsGreaterThan
等……)PropertyIsLike
和PropertyIsNull
筛选器被转换为SQL涉及条件多态映射的过滤器在内存中进行评估。
在内存中计算比较两个或多个不同嵌套属性的筛选器
匹配多个嵌套属性映射的筛选器在内存中计算
与加入支持类似,嵌套过滤器的本机编码在默认情况下是打开的,并且通过将行添加到app-schema.properties文件来禁用它:
app-schema.encodeNestedFilters = false
或者,或者,通过将Java系统属性“Apple Scheme.EnCODEnEdEdStudio过滤器”的值设置为“false”,例如:
java -DGEOSERVER_DATA_DIR=... -Dapp-schema.encodeNestedFilters=false Start
或条件的联合绩效改进¶
或者,PostgreSQL的条件很难优化,而且通常速度很慢。应用程序架构使用union子句或嵌套的filter子查询来改进或调节性能。
启用联合改进后,嵌套筛选器子查询上的主或二进制运算符将重新生成普通或类似以下查询的查询:
SELECT id, name FROM table WHERE name = "A" OR name = "B"
到:
SELECT id, name FROM table WHERE name = "A" UNION SELECT id, name FROM table WHERE name = "B"
默认情况下启用联合改进,并通过将行添加到app-schema.properties文件来禁用联合改进:
app-schema.orUnionReplace = false
或者,或者,通过将Java系统属性“Apple Scheme.OrUnon Posiple”的值设置为“false”,例如:
java -DGEOSERVER_DATA_DIR=... -Dapp-schema.orUnionReplace=false Start
备注
只有在使用Postgressql数据库时才会应用此优化。