Firebird 2.5 TRIM(TRAILING FROM FIELD)在UTF8上非常慢

时间:2014-03-17 14:27:52

标签: firebird trim

首先,我的服务器版本,所以我不会忘记它:WI-V2.5.2.26540 Firebird 2.5

我在同一台服务器上有两个数据库。它们共享相同的结构和(几乎)相同的数据,并且仅在字符集上有所不同。实际上,数据库1 是一个旧的ISO8859_1数据库,已迁移到UTF8数据库数据库2 。所以:

  • 数据库1:ISO8859_1。相关字段为COD Char(21) NOT NULL
  • 数据库2:UTF8归类UNICODE_CI_AI。相关字段为COD Char(21) NOT NULL COLLATE UNICODE_CI_AI

两者共享相同的ODS版本(11.2)和方言(3)。

我有几个WHERE TRIM(TRAILING FROM field) like '%something'。问题是这个查询几乎立即在数据库1中执行,但在数据库2中完成大约需要一分钟(我在同一台服务器上都有),在一个包含大约50k记录的表中。与此同时,fbserver进程显示25%的CPU使用率(4个核心中有1个)。 CPU_AFFINITY设置为使用2个核心(我猜不会在同一个查询中)。字段已编入索引,但PLAN在两个数据库中都很自然。

在两个数据库中运行SELECT TRIM(TRAILING FROM field) FROM table在数据库2中显示相同的性能问题(但不在1中),所以我真的相信它必须与charset和trim函数有关。

如果有人知道如何解决这个问题,我将不胜感激。任何有关理解为什么会发生这种情况的提示也非常感谢。感谢。

1 个答案:

答案 0 :(得分:2)

Firebird 2.5.2中存在一个已知错误,它使UNICODE_CI_AI字段上的选择速度极慢。这已在即将发布的2.5.3版本中得到纠正。

以下是Firebird错误跟踪器中的相应项:CORE-4125

因此,解决方法是使用Firebird 2.5.3快照或等到2.5.3将被释放。根据{{​​3}},这应该发生在2014年第一季度。