我需要根据给定月份的每一行计算给定 client_id 的过去 12 个月的销售额总和。
这是按客户按月汇总的销售额的初始表(此处针对特定客户进行过滤511656A75):
CREATE TEMP TABLE foo AS
SELECT idclient, month_transac, sales
FROM ( VALUES
( '511656A75', '2010-06-01', 68.57 ),
( '511656A75', '2010-07-01', 88.63 ),
( '511656A75', '2010-08-01', 94.91 ),
( '511656A75', '2010-09-01', 70.66 ),
( '511656A75', '2010-10-01', 28.84 ),
( '511656A75', '2015-10-01', 85.00 ),
( '511656A75', '2015-12-01', 114.42 ),
( '511656A75', '2016-01-01', 137.08 ),
( '511656A75', '2016-03-01', 172.92 ),
( '511656A75', '2016-04-01', 125.00 ),
( '511656A75', '2016-05-01', 127.08 ),
( '511656A75', '2016-06-01', 104.17 ), …Run Code Online (Sandbox Code Playgroud) postgresql performance join optimization postgresql-9.6 query-performance
在这个答案中,我解释了 SQL-89 的隐式语法。
但是我在玩的时候注意到不同的查询计划:
EXPLAIN ANALYZE
SELECT *
FROM (values(1)) AS t(x), (values(2)) AS g(y);
QUERY PLAN
------------------------------------------------------------------------------------
Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.002..0.002 rows=1 loops=1)
Planning time: 0.052 ms
Execution time: 0.020 ms
(3 rows)
Run Code Online (Sandbox Code Playgroud)
与此相反:
EXPLAIN ANALYZE
SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(2)) AS g(y);
QUERY PLAN
------------------------------------------------------------------------------------------------
Subquery Scan on g (cost=0.00..0.02 rows=1 width=4) (actual time=0.004..0.005 rows=1 loops=1)
-> Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.002..0.002 rows=1 loops=1)
Planning time: 0.075 ms
Execution time: 0.027 …Run Code Online (Sandbox Code Playgroud) postgresql performance join execution-plan postgresql-9.5 postgresql-performance
我有3张桌子。#a是一个主表和两个辅助表,#b并且#c.
create table #a (a int not null, primary key (a asc)) ;
create table #b (b int not null, primary key (b asc)) ;
create table #c (c int not null, primary key (c asc)) ;
insert into #a (a)
select x*10 + y
from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9))x(x)
cross join (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9))y(y) ;
insert into #b (b)
select a from #a where a % 5 > 0 ;
insert into #c (c)
select a from #a …Run Code Online (Sandbox Code Playgroud) 我有一个存储父/子记录的表,如下所示:
+-------+------------+---------+---------+------------+-----------+
|custid | custname | deptid | company |parentcustid| enrolled |
+=======+============+=========+=========+============+===========+
| 7060 | Sally | AB1 | comp1 | null | 1 |
| 6953 | Ajit | AB7 | comp2 | 7060 | 1 |
| 6957 | Rahul | DE1 | comp3 | 7060 | 1 |
| 6958 | uday | TG6 | comp4 | 7060 | 1 |
| 6959 | john | HY7 | comp5 | 7060 | 1 |
| 6960 …Run Code Online (Sandbox Code Playgroud) 我刚刚开始学习 Postgres,我遇到的情况是,根据我在表上执行 JOIN 的方式,性能和计划输出似乎真的很奇怪。
这些是与其索引一起使用的表:
create table escola
(
pk_codigo integer not null
constraint pk_escola
primary key,
nome varchar(100),
municipio varchar(150),
uf char(2),
cod_municipio integer,
uf_id integer default 0 not null
constraint fk_escola_uf_id
references tb_uf
)
;
create index idx_escola_uf
on escola (uf)
;
create index idx_escola_uf_id
on escola (uf_id)
;
create index idx_multi_escola_uf_pk
on escola (uf, pk_codigo)
;
create table if not exists candidato
(
pk_numero_inscricao bigint not null
constraint candidato_pk
primary key,
cod_municipio_residencia integer,
municipio_residencia varchar(150),
uf_residencia char(2), …Run Code Online (Sandbox Code Playgroud) 如何将texts 数组转换为UUIDs数组?
我需要join在两个表之间做一个:users和projects。
该users表有一个名为的数组字段,project_ids其中包含作为文本的项目 ID。
该projects表有一个名为 的 UUID 字段id。
我最初的想法是一个查询看起来像:
SELECT * FROM projects
JOIN users ON
projects.id = ANY(users.project_ids)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为users.project_ids不是,UUID所以我试过:
projects.id = ANY(users.project_ids::uuid[])
Run Code Online (Sandbox Code Playgroud)
乃至:
projects.id = ANY(ARRAY[users.project_ids]::uuid[])
Run Code Online (Sandbox Code Playgroud)
但没有一个有效:
Run Code Online (Sandbox Code Playgroud)ERROR: invalid input syntax for type uuid: ""
更新
@a_horse_with_no_name 绝对正确。最好的选择应该是使用一组 UUID。
现在的问题是我如何可以改变的阵列text到阵列uuid?
该users表当前为空(0 条记录)。
我试过了
ALTER TABLE "users" ALTER COLUMN "project_ids" SET …Run Code Online (Sandbox Code Playgroud) 为什么不能查询#2使用相同的(car_trims.horsepower_peak)索引来优化行作为的排序查询#1?在只有两个查询之间的区别是增加的JOIN在查询#2。
PK: (car_trims.id), 索引(car_trims.horsepower_peak)
PK: (car_makes.id)
查询#1
SELECT car_trims.*
FROM car_trims
GROUP BY car_trims.id
ORDER BY car_trims.horsepower_peak DESC
LIMIT 0, 200
Run Code Online (Sandbox Code Playgroud)
执行时间处理时间: .0026 seconds
查询#2
SELECT car_trims.*
FROM car_trims
STRAIGHT_JOIN car_makes ON car_makes.id = car_trims.make_id
GROUP BY car_trims.id
ORDER BY car_trims.horsepower_peak DESC
LIMIT 0, 200
Run Code Online (Sandbox Code Playgroud)
执行时间处理时间: .2533 seconds
更新:
我一直在继续这方面的工作,我相信该指数没有被利用在查询#2,由于混合的GROUP BY和ORDER BY。根据 MySQL …
在 Postgres 12 中,我有一张桌子purchase_orders和一张桌子items。我正在运行一个查询,该查询返回给定的 POshop和每个 PO 上订购的项目的总和:
SELECT po.id,
SUM(grouped_items.total_quantity) AS total_quantity
FROM purchase_orders po
LEFT JOIN (
SELECT purchase_order_id,
SUM(quantity) AS total_quantity
FROM items
GROUP BY purchase_order_id
) grouped_items ON po.id = grouped_items.purchase_order_id
WHERE po.shop_id = 195
GROUP BY po.id
Run Code Online (Sandbox Code Playgroud)
此查询返回所需的结果。JOIN 在一个子查询中,因为会有其他 JOINS 到其他表,所以这会生成一个已经分组的表来连接。
我用相关 SELECT子查询而不是 JOIN编写了另一个查询。运行这两种方法的执行时间几乎相同,因此很难看出哪个更快。我跑了,EXPLAIN ANALYZE但不能很好地解释它。
问题:在上面的例子中,Postgres 会处理items子查询的整个表,并且只有在与purchase_orders? 或者它是否足够聪明来过滤集合,如果items首先?
该EXPLAIN报告提到了“Seq Scan on Items...”,它似乎包含 中的所有行items,然后随着它向上移动树而减少。但不确定这是否意味着它实际上 …
当特定图书馆中没有书籍数据时,就会出现问题。考虑以下工作场景。
桌子 library
--------------------------------
| id | name | owner |
--------------------------------
| 1 | ABC | A |
| 2 | DEF | D |
| 3 | GHI | G |
--------------------------------
Run Code Online (Sandbox Code Playgroud)
桌子 books
--------------------------------
| id | title | library |
--------------------------------
| a | xxx | 1 |
| b | yyy | 1 |
| c | zzz | 2 |
--------------------------------
Run Code Online (Sandbox Code Playgroud)
现在,当我进行如下查询时:
SELECT library.name, array_agg(b.title) AS book_list FROM library,
(SELECT title FROM books WHERE …Run Code Online (Sandbox Code Playgroud) 我最近开始将个人项目从 Microsoft SQL Server 转换为 PostgreSQL,我对UPDATE JOIN在两个表之间执行时遇到的糟糕性能感到惊讶。
假设它们看起来像:
CREATE TABLE foo (
id INTEGER NOT NULL PRIMARY KEY,
bar INTEGER NULL
);
CREATE TABLE foo2 (
id INTEGER NOT NULL PRIMARY KEY,
bar INTEGER NULL
);
Run Code Online (Sandbox Code Playgroud)
在 T-SQL 中,我会使用这样的连接来进行更新:
UPDATE foo
SET bar = t2.bar
FROM foo t1
JOIN foo2 t2
ON t1.id = t2.id;
Run Code Online (Sandbox Code Playgroud)
但是在 Postgres 中运行,查询速度非常慢。
如果我将其更改为:
UPDATE foo
SET bar = t2.bar
FROM foo2 t2
WHERE foo.id = t2.id;
Run Code Online (Sandbox Code Playgroud)
这不是问题。
我知道语法是不同的,但我希望查询优化器能在同一个球场上解决一些问题。相反,事情变得疯狂。除了语法差异之外,我看不到的两个查询之间是否存在细微差别?
Update on foo …Run Code Online (Sandbox Code Playgroud) join ×10
postgresql ×7
performance ×3
sql-server ×3
array ×2
index ×2
optimization ×2
cast ×1
coalesce ×1
hierarchy ×1
mysql-5.7 ×1
order-by ×1
sqlalchemy ×1
subquery ×1
update ×1
uuid ×1