我相信postgresql可以更快地处理我的查询,但每次修改它的尝试都会使它变慢!
我有两张桌子:
我在以下位置创建了索引:
以下是查询
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
我看不出你的问题。
要检查的东西
(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