标签: postgresql-performance

有没有办法可以加快针对此特定视图的查询?

我在 PostgreSQL 数据库中有三个表,我通过视图和一些连接进行查询。

CREATE TABLE network_info (
  network         CIDR          NOT NULL,
  some_info       TEXT          NULL,
  PRIMARY KEY (network)
);

CREATE TABLE ipaddr_info (
  ipaddr          INET          NOT NULL,
  some_info       INT           NULL,
  PRIMARY KEY (ipaddr, some_info)
);

CREATE TABLE ipaddrs (
  addr            INET          NOT NULL,
  PRIMARY KEY (addr)
);

CREATE VIEW ipaddr_summary AS
SELECT DISTINCT
  i.addr                  AS ip_address,
  a.some_info             AS network_info,
  COUNT(b.ipaddr)         AS ip_info_count
FROM ipaddrs AS i
LEFT JOIN network_info AS a
  ON (i.addr << a.network)
LEFT JOIN ipaddr_info AS b
  ON …
Run Code Online (Sandbox Code Playgroud)

postgresql performance join database-design index-tuning postgresql-performance

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

为什么在这个简单的查询中 seq-scan 可以比 index-scan 和 index-only-scan 快得多?

我正在使用PostgreSQL 9.4.4. 我有一个这样的查询:

 SELECT COUNT(*) FROM A,B WHERE A.a = B.b
Run Code Online (Sandbox Code Playgroud)

a和b是表A和B的主键,所以a&b上有B索引

默认情况下,PostgreSQL 将在 AB 上使用 seq-scan 并使用 hash join,我强制它执行索引扫描和仅索引扫描。

结果表明,seq scan比其他两个快很多,index-scan和index-only-scan在a,b上做全扫描需要更多的时间。

EXPLAIN ANALYZE SELECT COUNT(*) FROM journal,paper WHERE journal.paper_id = paper.paper_id;

在此处输入图片说明

有人可以解释一下吗?

非常感谢!

postgresql performance index postgresql-performance

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

时间序列数据中罕见 SELECT 与频繁 INSERT 的性能

我有一个简单的时间序列表

movement_history (
    data_id serial,
    item_id character varying (8),
    event_time timestamp without timezone,
    location_id character varying (7),
    area_id character varying (2)
);
Run Code Online (Sandbox Code Playgroud)

我的前端开发人员告诉我,如果他想知道某个项目在给定时间戳的位置,那么成本太高了,因为他必须对表格进行排序。他希望我为下一个事件添加另一个时间戳字段,这样他就不必进行排序。然而,这将使我插入新动作的代码成本增加一倍以上,因为我需要查询该项目的前一个条目,更新该条目,然后插入新数据。

我的插入当然远远超过他的查询频率。而且我从未见过包含下一个事件时间条目的时间序列表。他告诉我我的表坏了,因为他不频繁的查询需要排序。有什么建议?

我不知道他在使用什么查询,但我会这样做:

select * from movement_history 
where event_time <= '1-15-2015'::timestamp  
and item_id = 'H665AYG3' 
order by event_time desc limit 1;
Run Code Online (Sandbox Code Playgroud)

我们目前有大约 15,000 个项目,它们最多每天输入一次。然而,我们很快就会有 50K 的项目,其传感器数据每 1 到 5 分钟更新一次。

我没有看到他的查询经常执行,但是另一个获取托盘当前状态的查询将会执行。

select distinct on (item_id) * 
from movement_history 
order by item_id, event_time desc;
Run Code Online (Sandbox Code Playgroud)

该服务器当前运行的是 9.3,但如果需要,它也可以运行在 9.4 上。

postgresql performance partitioning index-tuning postgresql-performance

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

如果检查“为空”,则选择视图时性能不佳

我有两个非常简单的表,以及在bigint字段上加入它们的视图:

CREATE TABLE foo.ao (
  id serial NOT NULL,
  ao_id bigint NOT NULL,
  ao_plz text,
  ao_community text,
  ao_street text,
  ao_ms_id text,
  ao_status text DEFAULT 'Standard'::character varying,
  ao_has_eear boolean,
  ao_last_update timestamp without time zone,
  CONSTRAINT ao_pkey PRIMARY KEY (id),
  CONSTRAINT ao_id_unique UNIQUE (ao_id)
);

CREATE TABLE foo.ms (
  id serial NOT NULL,
  ms_nis_number text NOT NULL,
  ms_plz text,
  ms_community text,
  ms_street text,
  ms_status text DEFAULT 'Standard'::character varying,
  ms_coord_x integer,
  ms_coord_y integer,
  ms_ao_id bigint,
  CONSTRAINT ms_pkey PRIMARY KEY (id),
  CONSTRAINT …
Run Code Online (Sandbox Code Playgroud)

postgresql performance view postgresql-9.3 postgresql-performance

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

使用带有非重音和右端通配符的 ILIKE

我使用 Postgresql 9.4,我有一个名为 foo 的大表。我想搜索它,但如果搜索文本很短(例如“v”)或很长(例如“这是一个在表 foo% 上使用 gin 的搜索示例”),我的执行时间会很长。在这种情况下,我的索引被忽略。这是我的搜索查询:

EXPLAIN (ANALYZE, TIMING)
SELECT  "foo".* FROM "foo" WHERE "foo"."locale" = 'de'
AND f_unaccent(foo.name) ILIKE f_unaccent('v%')
AND foo.configuration->'bar' @> '{"is":["a"]}'
LIMIT 100;
Run Code Online (Sandbox Code Playgroud)

这是我的索引:

CREATE INDEX index_foo_on_name_de_gin ON foo USING gin(f_unaccent(name) gin_trgm_ops) WHERE locale = 'de';
Run Code Online (Sandbox Code Playgroud)

为什么索引被忽略并使用seq scan和/或Bitmap heap scan?如何添加其他索引来解决此问题?

为什么它会重新检查?

Recheck Cond: ((f_unaccent((name)::text) ~~* 'v%'::text) AND ((locale)::text = 'de'::text))
Run Code Online (Sandbox Code Playgroud)

功能f_unaccent

CREATE OR REPLACE FUNCTION f_unaccent(text)
         RETURNS text AS
         $func$
         SELECT unaccent('unaccent', $1)
         $func$  LANGUAGE sql IMMUTABLE …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index index-tuning postgresql-9.4 postgresql-performance

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

加速 GROUP BY, HAVING COUNT 查询

我试图在 Postgres 9.4 中加速这个查询:

SELECT "groupingsFrameHash", COUNT(*) AS nb
FROM "public"."zrac_c1e350bb-a7fc-4f6b-9f49-92dfd1873876"
GROUP BY "groupingsFrameHash"
HAVING COUNT(*) > 1
ORDER BY nb DESC LIMIT 10
Run Code Online (Sandbox Code Playgroud)

我在 上有一个索引"groupingsFrameHash"。我不需要精确的结果,模糊近似就足够了。

这是查询计划:

Limit  (cost=17207.03..17207.05 rows=10 width=25) (actual time=740.056..740.058 rows=10 loops=1)
  ->  Sort  (cost=17207.03..17318.19 rows=44463 width=25) (actual time=740.054..740.055 rows=10 loops=1)
        Sort Key: (count(*))
        Sort Method: top-N heapsort  Memory: 25kB
        ->  GroupAggregate  (cost=14725.95..16246.20 rows=44463 width=25) (actual time=615.109..734.740 rows=25977 loops=1)
              Group Key: "groupingsFrameHash"
              Filter: (count(*) > 1)
              Rows Removed by Filter: 24259
              ->  Sort  (cost=14725.95..14967.07 rows=96446 …
Run Code Online (Sandbox Code Playgroud)

postgresql performance index count postgresql-performance

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

有没有更快的方法来计算 JSONB 标签?

我试图在 Postgres 9.5 中从这个查询中挤出更多的性能。我正在运行超过 400,000 行。

在玩弄它时,我注意到这些CASE语句增加了相当多的查询成本 - 如果我用简单地对一些现有列求和来替换它们,它会将执行时间减半。有没有更有效的方法来计算这些总和?

SELECT sum("tag1"), sum("tag2"), sum("total_tags")
FROM (
    SELECT people.data->'recruiter_id' AS recruiter_id,
          (CASE WHEN people.data->'tags' ? 'tag1' THEN 1 END) AS "tag1",
          (CASE WHEN people.data->'tags' ? 'tag2' THEN 1 END) AS "tag2", 
          ((CASE WHEN people.data->'tags' ? 'tag1' THEN 1 ELSE 0 END) +
           (CASE WHEN people.data->'tags' ? 'tag2' THEN 1 ELSE 0 END)) AS total_tags
    FROM people WHERE people.data->'tags' ?| ARRAY['tag1','tag2'] ) AS target
GROUP BY recruiter_id
Run Code Online (Sandbox Code Playgroud)

的输出EXPLAIN ANALYSE: …

postgresql performance statistics execution-plan json postgresql-performance

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

pgsql - 从不在的大表中删除数据

我需要从一个大表中删除一些行。要删除的行不应在另一个表中,例如:

DELETE FROM LargeTable WHERE id IS NOT IN (SELECT DISTINCT foreign_id from EvenLargerTable)

但是我的服务器无法处理这种生硬的查询,因为 LargeTable 中几乎有一百万条记录,而 EvenLargerTable 中有几百万条记录

我该如何解决?

postgresql performance postgresql-performance

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

使用更大的运算符在 jsonb 数组中搜索嵌套值

这是表定义(简化):

CREATE TABLE documents (
    document_id int4 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
    data_block jsonb NULL
);
Run Code Online (Sandbox Code Playgroud)

示例值:

INSERT INTO documents (document_id, data_block)
VALUES
   (878979, 
    '{"COMMONS": {"DATE": {"value": "2017-03-11"}},
     "PAYABLE_INVOICE_LINES": [
         {"AMOUNT": {"value": 52408.53}}, 
         {"AMOUNT": {"value": 654.23}}
     ]}')
 , (977656, 
    '{"COMMONS": {"DATE": {"value": "2018-03-11"}},
     "PAYABLE_INVOICE_LINES": [
         {"AMOUNT": {"value": 555.10}}
     ]}');
Run Code Online (Sandbox Code Playgroud)

我想搜索其中一个'PAYABLE_INVOICE_LINES'元素包含'value'大于 1000.00 的所有文档。

我的查询是

select *
from documents d
cross join lateral jsonb_array_elements(d.data_block -> 'PAYABLE_INVOICE_LINES') as pil 
where (pil->'AMOUNT'->>'value')::decimal > 1000
Run Code Online (Sandbox Code Playgroud)

但是,由于我想限制为 50 个文档,因此我必须对document_id …

postgresql performance index-tuning json postgresql-10 postgresql-performance

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

PostgreSQL 地理空间查询很慢

在放弃 MySQL 之后,我尝试了 Elasticsearch,现在不想看看我是否可以使用 PostgreSQL/PostGIS,因为它可以让我只使用 PostgreSQL。

我需要按距离(不能完全相同)从表中获取记录并按距离排序。该表有 1000 万条记录。

当我在 PostgreSQL 上查询比在 MySQL 上的查询速度慢时,我想我一定做错了什么。

我可以做什么更好?

桌子:

id | hash_id | town | geo_pt2 

geo_pt2 is geography
Run Code Online (Sandbox Code Playgroud)

指数:

CREATE INDEX geo_pt2_gix ON public.member_profile USING gist (geo_pt2)
Run Code Online (Sandbox Code Playgroud)

询问:

SELECT hash_id, town
     , ST_Distance(t.x, geo_pt2) AS dist
FROM   member_profile, (SELECT ST_GeographyFromText('POINT(47.4667 8.3167)')) AS t(x)
WHERE  ST_DWithin(t.x, geo_pt2, 250000)
ORDER  BY dist
limit 100 offset 1000;
Run Code Online (Sandbox Code Playgroud)

解释:

Limit  (cost=9.08..9.08 rows=1 width=53)
  ->  Sort  (cost=9.07..9.08 rows=1 width=53)
        Sort Key: (_st_distance('0101000020E610000088855AD3BCBB474052499D8026A22040'::geography, member_profile.geo_pt2, '0'::double precision, true))
        -> …
Run Code Online (Sandbox Code Playgroud)

postgresql performance spatial postgis postgresql-10 postgresql-performance

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