我需要在两端使用%实现通配符搜索,如何提高性能?

时间:2011-08-19 01:41:51

标签: sql sybase

我将在sql端实现这一点,所以我最终会得到像

这样的东西
where company.name like '%:parameter%'

我之前已经读过,这会让DB无法使用company.name索引。

那么我的问题是,我还有哪些其他选项可以最大程度地降低这将引入搜索的性能下降?请注意,这是客户要求,因此我没有选择不执行(即使我向他们解释了这种情况的后果)。

该应用程序正在使用Sybase SE 12.5.3(基于DBArtisan 8.5.5中使用的驱动程序)

3 个答案:

答案 0 :(得分:2)

我不了解Sybase,但您可以按照以下方式执行操作:

  • 创建第二个字段,该字段与公司名称相反。
  • 在此新字段上添加索引
  • 使用以下where子句

    WHERE company_name喜欢':parameter%'或reverse_name之类的    反向(参数)+ '%'

希望这能为你指明方向

答案 1 :(得分:0)

可能存在可能使用索引的可能性,但其极不可能(参见this comment)。如果可能的话,我会根据另一个索引字段进行查询,然后根据这些结果进行子选择,以至少避免全表扫描。

答案 2 :(得分:0)

你是对的, 是性能杀手。

我们过去使用过的一种方法是将所有可能的公司名称存储在一个单独的表中,并返回主表。这是您进行优化的经典时间/空间权衡。

换句话说,假设您的主要表格中有两家公司ICBMMicrosloth

您可以做的是创建包含以下内容的另一个表:

TextSegment    varchar(?) indexed
ActualCompany  varchar(?)

并按如下方式填充:

TextSegment  ActualCompany
-----------  -------------
ICBM         ICBM
CBM          ICBM
BM           ICBM
M            ICBM
Microsloth   Microsloth
icrosloth    Microsloth
crosloth     Microsloth
rosloth      Microsloth
osloth       Microsloth
sloth        Microsloth
loth         Microsloth
oth          Microsloth
th           Microsloth
h            Microsloth

然后,当您正在寻找像%slo%这样的公司时,您可以使用:

select ActualCompany from LookupTable where TextSegment like 'slo%'

这允许您在另一个表上使用%...%更有效地使用该表的索引。

现在,请记住,您需要在原始表上使用触发器以确保查找表一致。这将占用相当大的空间(取决于您的数据)但我注意到的一件事是,很少有人抱怨他们的数据库有多大,大多数问题都是速度快。

维护单独表的时间影响通常不会太糟糕,因为大多数数据库的读取频率远远高于写入数据库。此方法将成本从选择移动到插入/更新,在此处可以很好地摊销。