查询一个表时,提高联合搜索视图的查询性能

问题描述 投票:1回答:1

我使用视图在postgresql数据库上实现了一个简单的全文搜索。例如。就像是

  create view searches as 
  (
  select id as searchable_id, 'Person' as searchable_type,
         coalesce(last_name, '') || ' ' || coalesce(first_name, '') || ' ' || coalesce(organization_name, '') || ' ' || coalesce(comments, '') as term
  from people
  union
  select id as searchable_id, 'Community' as searchable_type,
         name || ' ' || coalesce(comments, '') as term
  from communities
  union
  select id as searchable_id, 'Street' as searchable_type,
         name || ' ' || coalesce(comments, '') as term
  from streets
  )

这是一个简化的示例:它包含14个表的并集。

通过这种方式,我通常可以轻松查询与特定搜索词匹配的所有“记录”。尼斯。我可以很容易地计算它们,然后我向用户呈现每个“searchable_type”的nr个匹配项。

然后,用户可以选择检索特定类型,然后遇到性能问题:查询表始终对所有表执行全表扫描,即使我指定了特定的“表”(searchable_type)。

所以要说明一下:

  select * from searches where searchable_type like '%something%' and searchable_type='Person' 

大约需要5秒钟,如果我运行相同的查询

  select * from (
    select id as searchable_id, 'Person' as searchable_type,
           coalesce(last_name, '') || ' ' || coalesce(first_name, '') || ' ' || coalesce(organization_name, '') || ' ' || coalesce(comments, '') as term
    from people) as searches 
  where term like '%something%'

返回约40ms。

那我怎么解决这个问题呢?我想使用视图,但具有单个查询的性能。换句话说:如何避免重复定义查询两次? (一次在视图中,一次单独)。

提高速度的想法:

  • 使用带索引的物化视图,它应该飙升,但数据当然是动态的,所以我们有刷新,不知道是多么昂贵
  • 使用某种提示(存在吗?)所以postgresql知道它只需要检查一个表?
  • 而不是定义单个大视图,定义较小的视图和联合每个表 - 搜索视图的选择,因此我们减少了重复
  • 实际上在这种情况下使用视图是否有意义,为什么不每次都使用所有per-table-queries ad hoc构建查询?在大型查询中使用视图是否有任何性能优势?
sql postgresql full-text-search
1个回答
1
投票

如果不是使用“searchable_type”字符串,而是使用整数,那么你的性能会提高很多。

您可以添加一个附加表以从String获取相应的整数id(例如“Person”)。

© www.soinside.com 2019 - 2024. All rights reserved.