改进Firebird数据库的'%LIKE%'查询

时间:2012-01-25 17:33:09

标签: sql firebird

情况:

我正在尝试使用“LIKE”语句编写一个有效的查询,以便将一段文本放入带有短文本的列中。

型号:

Table 'EVENTSGENERAL' : { ID (KEY), GENERATOR_ (FK), DATETIME, COMPUTERNAME, OSLOGIN, DBLOGIN, INFOTYPE, INFO }

Table 'EVENTSGENERATORS' : { ID (KEY), GENERATOR_ (FK), SHORTNAME, LONGNAME }

Table 'EVENTSINFOTYPES'  : { ID (KEY), GENERATOR_ (FK), VERSION_, INFOTYPE, DESCRIPTION }

索引:EVENTSGENERAL.GENERATOREVENTSGENERAL.DATETIMEEVENTSINFOTYPES.INFOTYPE 全部升序。

我的查询:

SELECT FIRST @first SKIP @skip A.ID,B.LONGNAME,  A.DATETIME, A.COMPUTERNAME,A.OSLOGIN, A.DBLOGIN, C.DESCRIPTION, A.INFO
FROM EVENTSGENERAL A JOIN EVENTSGENERATORS B ON B.GENERATOR_ = A.GENERATOR_
JOIN EVENTSINFOTYPES C ON C.GENERATOR_ = A.GENERATOR_ AND C.INFOTYPE = A.INFOTYPE
WHERE C.DESCRIPTION LIKE '%VALUE%'

问题:

此查询将在超大型数据库上运行。有什么方法可以改善它吗? 我正在使用Firebird数据库。

提前致谢。

2 个答案:

答案 0 :(得分:7)

不,不幸的是,因为您在%关键字的两边都使用了通配符(LIKE)。前导(开始)通配符表示不能使用任何索引来帮助提高搜索速度,因此必须检查每一行以查看它是否符合条件。

您可以通过更改为LIKE 'VALUE%'来加快速度;索引至少可以用于将搜索的行限制为以VALUE开头的行。

答案 1 :(得分:3)

全文搜索(使用%VALUE%)很慢,因为没有有效的方法可以做到这一点。这就像抓取一本字典来列出包含字母Q的所有单词。这需要永远。另一方面,如果你只是寻找VALUE%,那就更容易了(如果搜索字段被索引)。这就像制作字母Q开头的所有单词的列表。如果单词按字母顺序排序(就像它们在字典中一样),这很容易。你可以很容易地找到第一个和最后一个单词,你可以确定你需要介于两者之间的所有东西。

某些数据库允许全文搜索,它们可以索引列中的每个单词,但只能索引完整单词。因此,搜索%q%仍然会很慢,搜索q%会更快。我不确定Firebird是否支持它。

如果您有一个大型数据库并且希望能够搜索%q%,那么您应该查看其他专业解决方案,例如LuceneXapian