我使用包含空间数据的数据库。 大多数这些数据库采用 ESRI 创建的专有格式,用于其 ArcGIS 软件。 我们将数据存储在这些地理数据库内的标准化数据模型中。
我们发现该数据库在处理关系时的性能相当慢(即将几千条记录关联到几千条记录可能需要几分钟)。
是否有任何方法可以在不完全扁平化/非规范化数据库的情况下提高性能,或者这是否受到我们正在使用的数据库平台的严格限制?
只有一种方法:测量。尝试获取一个查询计划,并尝试读取它。尝试将查询与日志文件隔离,将其编辑为可执行(非参数化)形式,然后手动提交(在 psql 中)。尝试调整它,看看哪里痛。
如果必须连接许多(大)多边形,并且它们的边界框有很大的机会重叠,则几何连接在 CPU 方面可能会很昂贵。在极端情况下,您必须根据其他条件(例如邮政编码,如果可用)进行预选择或维护匹配记录的缓存表。
编辑: 顺便说一句:你有统计数据和自动清理吗? IIRC、ESRI 仍然与 postgres-8.3-something 相关,默认情况下它们不会运行。
更新2014-12-11
ESRI 不会干扰非 gis 内容。将 PK/FK 关系或附加索引添加到您的模式中是完全可以的。如果合适的话,DBMS 将选取它们。 ESRI 将忽略它们。 (ESRI只使用自己的元目录,忽略系统目录)
当我必须处理空间数据时,我倾向于预先计算值并存储它们。是的,这会产生一个大表,但是当您只在数据输入时进行一次复杂的计算时,查询速度要快得多。 但数据输入确实需要更长的时间。我的情况是,我的所有空间数据都来自每月的负载,所以预先计算还不错。
确保您的地理数据库已正确建立索引。索引可以显着提高查询性能,尤其是对于大型数据集。重点为连接和查询中经常使用的字段创建索引。
定期调整您的数据库设置。这包括调整内存分配、查询优化设置和其他特定于数据库的参数。 ESRI 提供了调整数据库以获得更好性能的指南。
不要仅仅依赖 SQL 连接,而是使用 ArcGIS 关系类。这些旨在更有效地处理地理数据库环境中的关系。
确保空间索引配置正确。空间索引可以通过减少需要扫描的数据量来极大地提高空间查询的性能。