在 PostgreSQL 9.2.3 我试图创建这个简化的表:
CREATE TABLE test (
user_id INTEGER,
startend TSTZRANGE,
EXCLUDE USING gist (user_id WITH =, startend WITH &&)
);
Run Code Online (Sandbox Code Playgroud)
但我收到此错误:
Run Code Online (Sandbox Code Playgroud)ERROR: data type integer has no default operator class for access method "gist" HINT: You must specify an operator class for the index or define a default operator class for the data type.
在PostgreSQL的文档使用这个例子不为我工作:
CREATE TABLE room_reservation (
room text,
during tsrange,
EXCLUDE USING gist (room WITH =, during WITH &&)
);
Run Code Online (Sandbox Code Playgroud)
同样的错误信息。
而这个对我来说也不起作用: …
postgresql constraint installation exclusion-constraint gist-index
如果我有一个关于返回附近咖啡馆的查询:
SELECT * FROM cafes c WHERE (
ST_DWithin(
ST_GeographyFromText(
'SRID=4326;POINT(' || c.longitude || ' ' || c.latitude || ')'
),
ST_GeographyFromText('SRID=4326;POINT(-76.000000 39.000000)'),
2000
)
)
Run Code Online (Sandbox Code Playgroud)
如何选择距离以及按距离排序?
有没有比这更有效的方法:
SELECT id,
ST_Distance(ST_GeographyFromText('SRID=4326;POINT(-76.000000 39.000000)'),
ST_GeographyFromText(
'SRID=4326;POINT(' || c.longitude || ' ' || c.latitude || ')')
) as distance
FROM cafes c
WHERE (
ST_DWithin(
ST_GeographyFromText(
'SRID=4326;POINT(' || c.longitude || ' ' || c.latitude || ')'
),
ST_GeographyFromText('SRID=4326;POINT(-76.000000 39.000000)'),
2000
)
) order by distance
Run Code Online (Sandbox Code Playgroud) 我有一个表,它使用列存储预订数据starts_at
,ends_at
每当我查询表以查找重叠预订时,我都可以选择使用以下查询之一:
SELECT * FROM reservations
WHERE starts_at < '2014-01-03 00:00:00'
AND ends_at >='2014-01-01 00:00:00';
Run Code Online (Sandbox Code Playgroud)
或者
SELECT * FROM reservations
WHERE tsrange(starts_at, ends_at) && ('2014-01-01 00:00:00', '2014-01-03 00:00:00')
Run Code Online (Sandbox Code Playgroud)
我在starts_at
和ends_at
列上有常规的 B 树索引,因此第一个查询总是使用它们。但是,除非我在 tsrange 上定义功能性 GiST 索引,否则第二个查询会执行完整扫描。
create index tsrange_idx on reservations using gist(tsrange(starts_at, ends_at));
Run Code Online (Sandbox Code Playgroud)
我的问题是,随着表的增长,哪个索引会更快?查看查询执行计划,答案可能很明显,但我不精通读取EXPLAIN ANALYZE
输出。
我有一个巨大的整数数组列表(300,000,000 条记录)存储在 Postgres 9.2 DB 中。我想有效地搜索这些记录以获得完全匹配(仅相等)。我听说过 intarray 模块和相应的 gist-gin 索引。我想问以下问题:
我总是了解到并理解,只有当我们对前导(或所有)列有谓词时才能使用索引。现在,令我惊讶的是,我注意到以下查询中使用了GiST 索引。这是为什么?这是 GiST 索引的特殊功能吗?
CREATE TABLE t1 (
i INT,
j INT,
k INT
);
INSERT INTO t1
SELECT i, j, k
FROM GENERATE_SERIES(1, 100) AS i,
GENERATE_SERIES(1, 100) AS j,
GENERATE_SERIES(1, 100) AS k;
CREATE INDEX ON t1 USING GiST(i, j, k);
EXPLAIN SELECT * FROM t1 WHERE k = 54;
Run Code Online (Sandbox Code Playgroud)
QUERY PLAN
Bitmap Heap Scan on t1 (cost=199.03..5780.51 rows=5000 width=12)
Recheck Cond: (k = 54)
-> Bitmap Index Scan on t1_i_j_k_idx (cost=0.00..197.78 rows=5000 width=0)
Index Cond: …
Run Code Online (Sandbox Code Playgroud) 我有一个包含 10,301,390 个 GPS 记录、城市、国家和 IP 地址块的表。我有用户当前的经纬度位置。我创建了这个查询:
SELECT
*, point(45.1013021, 46.3021011) <@> point(latitude, longitude) :: point AS distance
FROM
locs
WHERE
(
point(45.1013021, 46.3021011) <@> point(latitude, longitude)
) < 10 -- radius
ORDER BY
distance LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
这个查询成功地给了我我想要的东西,但它很慢。根据给定的纬度和经度,获得一条记录需要 2 到 3 秒。
我在latitude
和longitude
列上尝试了 B 树索引,也尝试过,GIST( point(latitude, longitude));
但查询仍然很慢。
我怎样才能加快这个查询?
似乎缓慢是由 引起的,ORDER BY
但我想获得最短距离,所以问题仍然存在。
我有一个包含日期时间字段start
和end
. 我有一个(开始,结束)项目列表。我需要检查列表中的哪些项目与表中的数据重叠。当前查询如下所示:
select br.duration from booking, (
select tstzrange('2016-09-06 03:45:00+00', '2016-09-06 14:45:00+00') as duration
union select tstzrange('2016-09-06 14:45:00+00', '2016-09-06 15:45:00+00') as duration
-- other items from my list
) as br
where tstzrange(start, end) && br.duration
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以做到?如果我在表中有数百万行并将它们与列表中的数百个项目进行比较,您认为它会起作用吗?
postgresql performance gist-index range-types postgresql-performance
我拥有的是一个非常简单的数据库,用于存储来自 UNC 共享的文件的路径、扩展名和名称。为了测试,我插入了大约 1.5 个 mio 行,下面的查询使用了 GiST 索引,但仍然需要 5 秒才能返回。预计将是几(如 100)毫秒。
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM residentfiles WHERE parentpath LIKE 'somevalue'
Run Code Online (Sandbox Code Playgroud)
当使用%%
在查询中,它需要的并不长,采用顺序扫描的,即使(?!)
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM residentfiles WHERE parentpath LIKE '%a%'
Run Code Online (Sandbox Code Playgroud)
我对name
(filename) 列也有相同的设置,在对该列执行类似查询时,它只需要一半的时间,即使使用%%
:
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM residentfiles WHERE name LIKE '%a%'
Run Code Online (Sandbox Code Playgroud)
我已经尝试过的东西不能用简短的语言写在这里。无论我做什么,它都会从大约 1 mio 行开始变慢。由于基本上从不删除任何内容,因此当然清空和重新索引根本无济于事。除了LIKE %%
GIN 或 GiST 索引,我真的不能使用任何其他类型的搜索,因为我需要能够在感兴趣的列中找到任何字符,而不仅仅是“特定人类语言的单词”。
我是否期望这应该在大约 100 毫秒内工作,即使是错误的多百万行?
重试,没有任何文本或其他索引,1.7 mio 唯一条目
EXPLAIN ANALYZE select * from residentfiles where name …
Run Code Online (Sandbox Code Playgroud) postgresql performance gist-index postgresql-9.5 query-performance
我正在使用带有 *pg_trgm* 扩展名的 Postgresql 9.1。我需要在基于文本的字段上创建索引。我不需要全文搜索,我使用ILIKE
查询来进行搜索。
我会用pg_trgm
,但不具有太多的经验gin
和gist
索引。我会有很多INSERT
报表(每天约 15000 条)和很少的UPDATE
报表(可能是一周内 1 条或 2 条)。
gin
此类表上的索引的索引更新开销是多少?还是gist
更合适?
我们有一个包含大约 50 万行的表。数据库表应该增长到数百万条记录。
这是表的样子:
CREATE TABLE public.influencers
(
id integer NOT NULL DEFAULT nextval('influencers_id_seq'::regclass),
location jsonb,
gender text COLLATE pg_catalog."default",
birthdate timestamp without time zone,
ig jsonb,
contact_info jsonb,
created_at timestamp without time zone DEFAULT now(),
updated_at timestamp without time zone DEFAULT now(),
categories text[] COLLATE pg_catalog."default",
search_field text COLLATE pg_catalog."default",
search_vector tsvector,
ig_updated_at timestamp without time zone,
CONSTRAINT influencers_pkey PRIMARY KEY (id),
CONSTRAINT ig_id_must_exist CHECK (ig ? 'id'::text),
CONSTRAINT ig_username_must_exist CHECK (ig ? 'username'::text)
)
Run Code Online (Sandbox Code Playgroud)
这些是我们需要高效执行的一些查询:
SELECT "public"."influencers".*
FROM …
Run Code Online (Sandbox Code Playgroud) 有没有办法轻松检查 PostgreSQL 数据库是否有任何 GiST 索引以及它们是什么类型?
gist-index ×11
postgresql ×11
index ×4
index-tuning ×3
btree ×2
performance ×2
constraint ×1
gin-index ×1
installation ×1
json ×1
postgis ×1
range-types ×1
spatial ×1