标签: gist-index

PostgreSQL EXCLUDE USING 错误:数据类型整数没有默认操作符类

在 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)

但我收到此错误:

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.
Run Code Online (Sandbox Code Playgroud)

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

47
推荐指数
2
解决办法
3万
查看次数

按距离排序

如果我有一个关于返回附近咖啡馆的查询:

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)

postgresql postgis postgresql-9.2 gist-index

11
推荐指数
1
解决办法
5921
查看次数

tsrange 上的 2 个 B 树索引或 1 个 GiST 索引——哪个性能更好?

我有一个表,它使用列存储预订数据starts_atends_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_atends_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输出。

postgresql index index-tuning postgresql-9.2 gist-index

8
推荐指数
1
解决办法
3802
查看次数

PostgreSQL,整数数组,相等索引

我有一个巨大的整数数组列表(300,000,000 条记录)存储在 Postgres 9.2 DB 中。我想有效地搜索这些记录以获得完全匹配(仅相等)。我听说过 intarray 模块和相应的 gist-gin 索引。我想问以下问题:

  • PostgreSQL 是否使用哈希函数来检查整数数组的相等性,还是执行一个比较数组元素的蛮力算法?
  • 如果 PostgreSQL 使用哈希函数,是否有一些 PostgreSQL 函数代码来实际获取特定数组的哈希函数结果?
  • 哪个索引最适合这样的任务?B-tree,还是 intarray 模块提供的 gist - gin 索引?数据集将是静态的,即,一旦插入所有记录,就不会再插入。所以,建立索引/更新索引的时间对我来说并不重要。

postgresql btree gist-index

8
推荐指数
2
解决办法
3077
查看次数

为什么使用 GiST 索引来过滤非前导列?

我总是了解到并理解,只有当我们对前导(或所有)列有谓词时才能使用索引。现在,令我惊讶的是,我注意到以下查询中使用了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)

postgresql index-tuning gist-index postgresql-12

6
推荐指数
1
解决办法
1758
查看次数

如何加快对地理位置过程的查询

我有一个包含 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 秒。

我在latitudelongitude列上尝试了 B 树索引,也尝试过,GIST( point(latitude, longitude));但查询仍然很慢。

我怎样才能加快这个查询?

更新:

似乎缓慢是由 引起的,ORDER BY但我想获得最短距离,所以问题仍然存在。

postgresql index spatial gist-index

5
推荐指数
1
解决办法
5761
查看次数

PostgreSQL - 日期时间范围重叠

我有一个包含日期时间字段startend. 我有一个(开始,结束)项目列表。我需要检查列表中的哪些项目与表中的数据重叠。当前查询如下所示:

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

4
推荐指数
1
解决办法
2635
查看次数

使用 GiST 索引的 Postgres LIKE 查询与完整扫描一样慢

我拥有的是一个非常简单的数据库,用于存储来自 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

4
推荐指数
1
解决办法
2085
查看次数

很少更新和很多插入的索引方法

我正在使用带有 *pg_trgm* 扩展名的 Postgresql 9.1。我需要在基于文本的字段上创建索引。我不需要全文搜索,我使用ILIKE查询来进行搜索。

我会用pg_trgm,但不具有太多的经验gingist索引。我会有很多INSERT报表(每天约 15000 条)和很少的UPDATE报表(可能是一周内 1 条或 2 条)。

gin此类表上的索引的索引更新开销是多少?还是gist更合适?

postgresql index index-tuning gist-index gin-index

3
推荐指数
1
解决办法
844
查看次数

Postgres 中 jsonb 的最佳索引

我们有一个包含大约 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 index btree gist-index json

3
推荐指数
1
解决办法
4492
查看次数

如何确定 postgres 数据库是否包含 GiST 索引以及什么类型?

有没有办法轻松检查 PostgreSQL 数据库是否有任何 GiST 索引以及它们是什么类型?

postgresql postgresql-9.2 gist-index

2
推荐指数
1
解决办法
333
查看次数