Postgres 中高效的反向前缀搜索
Efficient reverse prefix search in Postgres
假设 table 的 100K 加拿大邮政编码前缀和人口规模:
Region code
Population
H2
10,000,000
H2Z
100,000
H2K
50,000
H2Z 1G9
500
给定一个完整的邮政编码,例如“H2Z 1G9”我需要 return 每一行,其区域代码是输入的前缀。出于某种原因,我需要很多,所以我需要有效的索引。
我该怎么办?
这样的事情会有效吗?您可以检查 explain analyze
以确保它在您的 table:
上使用 PK
with in_postal_code as (
select distinct rtrim((left('H2Z 1G9', gs.n))) as postal_prefix
from generate_series(1, 7) as gs(n)
)
select cp.*
from in_postal_code i
join postal_code_population cp
on cp."Region Code" = i.postal_prefix;
您可以使用这样的函数:
CREATE TABLE tab (
region text PRIMARY KEY,
population bigint NOT NULL
);
CREATE FUNCTION find_match (t text) RETURNS SETOF tab
LANGUAGE plpgsql AS
$$DECLARE
s text;
BEGIN
FOR s IN SELECT substr(t, 1, n)
FROM generate_series(1, length(t)) AS s(n)
LOOP
RETURN QUERY SELECT * FROM tab
WHERE region = s;
END LOOP;
END;$$;
假设 table 的 100K 加拿大邮政编码前缀和人口规模:
Region code | Population |
---|---|
H2 | 10,000,000 |
H2Z | 100,000 |
H2K | 50,000 |
H2Z 1G9 | 500 |
给定一个完整的邮政编码,例如“H2Z 1G9”我需要 return 每一行,其区域代码是输入的前缀。出于某种原因,我需要很多,所以我需要有效的索引。
我该怎么办?
这样的事情会有效吗?您可以检查 explain analyze
以确保它在您的 table:
with in_postal_code as (
select distinct rtrim((left('H2Z 1G9', gs.n))) as postal_prefix
from generate_series(1, 7) as gs(n)
)
select cp.*
from in_postal_code i
join postal_code_population cp
on cp."Region Code" = i.postal_prefix;
您可以使用这样的函数:
CREATE TABLE tab (
region text PRIMARY KEY,
population bigint NOT NULL
);
CREATE FUNCTION find_match (t text) RETURNS SETOF tab
LANGUAGE plpgsql AS
$$DECLARE
s text;
BEGIN
FOR s IN SELECT substr(t, 1, n)
FROM generate_series(1, length(t)) AS s(n)
LOOP
RETURN QUERY SELECT * FROM tab
WHERE region = s;
END LOOP;
END;$$;