Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql-使用或/和的多列gin索引_Postgresql - Fatal编程技术网

Postgresql-使用或/和的多列gin索引

Postgresql-使用或/和的多列gin索引,postgresql,Postgresql,我正在“companys”表上运行以下查询: SELECT * FROM companies WHERE name ILIKE '%foo%' AND (city ILIKE 'bar%' OR state ILIKE 'bar%') 我尝试使用gin索引,并为名称、城市和州添加了一个单独的索引: CREATE INDEX trgm_idx_companies_name ON companies USING gin (name gin_trgm_ops); CREATE IND

我正在“companys”表上运行以下查询:

SELECT *
  FROM companies
  WHERE name ILIKE '%foo%'
    AND (city ILIKE 'bar%' OR state ILIKE 'bar%')
我尝试使用gin索引,并为名称、城市和州添加了一个单独的索引:

CREATE INDEX trgm_idx_companies_name ON companies USING gin (name gin_trgm_ops);
CREATE INDEX trgm_idx_companies_city ON companies USING gin (city gin_trgm_ops);
CREATE INDEX trgm_idx_companies_state ON companies USING gin (state gin_trgm_ops);
但是,运行查询时只使用名称索引。我怀疑答案在于一个多列索引,但无论我尝试什么变化,我都无法让它工作

我猜“名字”远比城市或州更具排他性。大概你在表格中经常重复相同的城市和州,但是名字不经常重复

例如,如果这些是医院,那么位于完全不同的城市和州的两家医院拥有相同名称的“纪念医院”并非不可能,但其频率远低于拥有相同城市和州的两家医院,而这一情况一直在发生(德克萨斯州休斯顿有100家医院)

因此,分析人员可能意识到搜索“纪念医院”可能会返回X个结果,X是一个非常小的数字,只扫描X个结果比尝试使用索引更快。为什么索引一个有五条记录的表?诸如此类的事情

作为测试用例,请尝试以下操作:

SELECT *
FROM companies
WHERE  (city ILIKE 'bar%' OR state ILIKE 'bar%')
我猜您会发现查询同时使用索引和位图或。这应该会给您一些信心,让您相信索引正在工作——它们对于您的查询不是必需的