标签: join

当前行日期过去 12 个月的总销售额

我需要根据给定月份的每一行计算给定 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

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

为什么这种隐式连接的规划方式与显式连接不同?

在这个答案中,我解释了 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

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

为什么优化器在这里选择嵌套循环而不是合并连接?

我有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)

join sql-server optimization database-internals

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

同一个表中的父子关系

我有一个存储父/子记录的表,如下所示:

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

join sql-server hierarchy

5
推荐指数
2
解决办法
4万
查看次数

Postgres JOIN 奇怪的行为

我刚刚开始学习 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)

postgresql performance index join postgresql-performance

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

将文本数组转换为 UUID 数组

如何将texts 数组转换为UUIDs数组?

我需要join在两个表之间做一个:usersprojects

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)

但没有一个有效:

ERROR: invalid input syntax for type uuid: ""
Run Code Online (Sandbox Code Playgroud)

更新

@a_horse_with_no_name 绝对正确。最好的选择应该是使用一组 UUID。

现在的问题是我如何可以改变的阵列text到阵列uuid

users表当前为空(0 条记录)。

我试过了

ALTER TABLE "users" ALTER COLUMN "project_ids" SET …
Run Code Online (Sandbox Code Playgroud)

postgresql join cast array uuid

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

MySQL 使用 INDEX 使用 GROUP BY 优化 ORDER BY,除非您添加 JOIN

为什么不能查询#2使用相同的(car_trims.horsepower_peak)索引来优化行作为的排序查询#1?在只有两个查询之间的区别是增加的JOIN在查询#2。

car_trims ~50k 行

PK: (car_trims.id), 索引(car_trims.horsepower_peak)

car_makes ~100 行

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

解释: 查询 #1 解释

查询#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 BYORDER BY。根据 MySQL …

index join order-by mysql-5.7

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

Postgres 是否使用子查询优化此 JOIN?

在 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,然后随着它向上移动树而减少。但不确定这是否意味着它实际上 …

postgresql join subquery

5
推荐指数
2
解决办法
965
查看次数

Postgres 不返回有关 array_agg 查询的数据,如下所示

当特定图书馆中没有书籍数据时,就会出现问题。考虑以下工作场景。

桌子 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)

postgresql join array coalesce sqlalchemy

5
推荐指数
2
解决办法
312
查看次数

PostgreSQL 更新加入与 SQL Server 更新加入

我最近开始将个人项目从 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)

postgresql join sql-server update

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