当前位置: 首页 > 知识库问答 >
问题:

改进连接查询postgreql/postgis

卞云瀚
2023-03-14

我相信postgresql可以更快地处理我的查询,但每次修改它的尝试都会使它变慢!

我有两张桌子:

    < li >统计数据(id,field1,[...],field10) < li >几何图形(id,geom)

我在以下位置创建了索引:

    < li>statistics.id < li>geometry.id < Li > geometry(ST _ x(ST _ centroid(ST _ transform(geom,2154))),ST _ y(ST _ centroid(ST _ transform(geom,2154))))

以下是查询

EXPLAIN ANALYZE SELECT 
statistics.*,
st_x(st_centroid(st_transform(geometry.geom, 2154))) AS x,
st_y(st_centroid(st_transform(geometry.geom, 2154))) AS y

FROM statistics
 JOIN geometry ON statistics.id = geometry.id 

WHERE statistics.id not like '97%';

这是结果

Hash Join  (cost=1294.66..5158.10 rows=36593 width=342) (actual time=20.788..1085.257 rows=36552 loops=1)
Hash Cond: (geometry.id = (statistics.id)::text)
->  Seq Scan on geometry  (cost=0.00..2445.46 rows=36593 width=279) (actual time=0.010..25.271 rows=36597 loops=1)
    Filter: (id !~~ '97%'::text)
->  Hash  (cost=835.96..835.96 rows=36696 width=69) (actual time=19.892..19.892 rows=36696 loops=1)
    Buckets: 4096  Batches: 1  Memory Usage: 3780kB
    ->  Seq Scan on statistics  (cost=0.00..835.96 rows=36696 width=69) (actual time=0.005..6.871 rows=36696 loops=1)
Planning time: 0.401 ms
Execution time: 1088.612 ms

最昂贵的操作是哈希连接。如何重新组织查询以获得更好的结果?

下面是表格的模式

CREATE TABLE "statistics" (
    "REG" integer,
    "DEP" character varying(10),
    "COM" character varying(50),
    "D03" integer,
    "D04" integer,
    "D05" integer,
    "D06" integer,
    "D07" integer,
    "D08" integer,
    "D09" integer,
    "D10" integer,
    "D11" integer,
    "D12" integer,
    "D13" integer,
    "id" text
);

CREATE TABLE geometry (  
    id text NOT NULL,
    id_geo numeric(10,0),
    cm_code character varying(3),
    name character varying(50),
    status character varying(20),
    lat integer,
    long integer,
    lat_centroid integer,
    long_centroid integer,
    z_ smallint,
    area numeric(10,0),
    population double precision,
    code_ct character varying(2),
    code_r character varying(1),
    code_dp character varying(2),
    name_dp character varying(30),
    code_rg character varying(2),
    geom geometry(MultiPolygon,4326),
    x real,
    y real
);

每个表中大约有40 000行

这些索引的创建方式如下

CREATE INDEX statistics_id_idx ON public.statistics USING btree (id COLLATE pg_catalog."default");
CREATE INDEX geometry_geom_idx ON public.geometry USING gist (geom);
CREATE INDEX geometry_id_gin2 ON public.geometry  USING gin (id COLLATE pg_catalog."default" gin_trgm_ops);

为了获取信息,我尝试了不同的索引(btree

共有1个答案

鲍宁
2023-03-14

我看不出你的问题。

要检查的东西

  • (geometry.id=(statistics.id)::文本)两个字段的数据类型是否相同?
  • 哪里statistics.id不像'97%';像'%me'永远不会使用索引,但是像'me%'可以使用索引。为什么不使用索引?
  • st_x(st_centroid(st_transform(geometry.geom,2154)))AS x,是一个函数,需要时间。需要转换坐标,然后提取一个值。如果计算该值并将其存储在字段中,您会更好。
  • 您的几何索引对此查询没有任何影响,因为您正在计算一个值而不是搜索某些内容。
  • 如果你想执行地理搜索,那也不是正确的索引。但是我们可以稍后再谈

要尝试的事情

首先是< code>where like。

SELECT *
FROM statistics
WHERE statistics.id not like '97%';

然后只需加入

SELECT statistics.*,
       geometry.geom
FROM statistics
JOIN geometry ON statistics.id = geometry.id 

然后加入st_x

SELECT statistics.*,
       st_x(st_centroid(st_transform(geometry.geom, 2154))) AS x,
       st_y(st_centroid(st_transform(geometry.geom, 2154))) AS y
FROM statistics
JOIN geometry ON statistics.id = geometry.id 

然后在< code>geometry表中创建预先计算的< code>x,y列

SELECT statistics.*,
       geometry.x,
       geometry.y,
FROM statistics
JOIN geometry ON statistics.id = geometry.id 

然后连接st_x,如并连接几何体。xy<code>其中like</code>

比较每个步骤之间的时间,以检查哪里花费的时间最多。

 类似资料:
  • MongoDB提供了lookup操作,用于实现两个表的关联聚合,但聚合操作编写起来比较麻烦,而且不符合面向对象的思维。为简化开发,bugu-mongo提供了一个JoinQuery类,用于实现两个表的连接查询。 JoinQuery借鉴了SQL左连接的概念: 当前表为左表,被连接的表为右表; 通过指定左键、右键进行关联; 对于不存在关联的数据,只会返回左表的数据,右表的数据为null。 创建JoinQ

  • 主要内容:1.内连接,2. 左连接 - LEFT JOIN,3. 右连接 - RIGHT JOIN,4. 全连接 - FULL JOIN顾名思义,连接(JOIN)表示要结合一些东西。 在SQL的情况下,连接(JOIN)表示“组合两个或更多表”。 在SQL中,子句用于组合数据库中两个或多个表的记录。 SQL JOIN的类型 内连接 - INNER JOIN 左连接 - LEFT JOIN 右连接 - RIGHT JOIN 全连接 - FULL JOIN 假设有以下几张表,EMPLOYEE 表的结构

  • 问题内容: 与正在执行以下查询的wordpress网站合作,但我看到此查询正在执行许多内部联接,并且该网站需要很长时间才能加载并且失败很多,并且我一直在尝试创建一个产生相同结果的查询但是还没有成功 我想知道有什么更好的方法可以做到这一点 这是说明输出。 WordPress的架构在这里。 问题答案: 看来您正在尝试获取类型为的每个帖子包含一行的结果集。似乎您想在帖子中显示每辆汽车的各种属性,并且隐藏

  • 我正在使用hibernate为一个项目连接到我的数据库。 我想有一个查询,从我的数据库中获得产品与特定语言的描述和名称。我拥有的参数是该语言的简称,因此首先我必须获得该语言的id,然后获得所需语言的文本。 我尝试了下面的hql查询,没有成功。

  • 本文向大家介绍PHP连接MySQL进行增、删、改、查操作,包括了PHP连接MySQL进行增、删、改、查操作的使用技巧和注意事项,需要的朋友参考一下 话不多说,请看代码: fetch_all()              返回全部数组 fetch_row()            返回索引数组 fetch_assoc()         返回关联数组 fetch_object()        返回

  • 我有一个大型Sybase ASE C/C应用程序,我想将其迁移到Postgresql。应用程序使用的是Sybase CT库(没有什么复杂的:简单的SQL,很少批量上传等)。应用程序是使用SYBASE OCS-16在Linux上构建和运行的。 我正在尝试评估BabelFish扩展是否有助于加快迁移。 第一个挑战(从Sybsae迁移)是应用程序广泛使用多语句查询来返回多结果集,使用动态生成的Trans