当我使用 LEFT JOIN 查询时
SELECT employees.eno,employees.name,employees.dept,attendanceIn.attIn FROM `employees`
LEFT JOIN attendanceIn ON employees.eno = attendanceIn.eno
WHERE date(attIn) like '2016-07-02%'
Run Code Online (Sandbox Code Playgroud)
我得到的是,
我有两个表 - 一个标题为“计划约束”的表,其中包含“sot_allowed”时间间隔,另一个标题为“计划”,其中包含“sot_contribution”时间间隔。
以下是两个表的架构(为便于阅读而进行了编辑):
Table "public.planning_constraints"
Column | Type | Modifiers
-------------+--------------------------+-------------------------------
start_time | timestamp with time zone |
end_time | timestamp with time zone |
sot_allowed | interval |
Table "public.planning"
Column | Type | Modifiers
------------------+--------------------------+----------------------------
start_time | timestamp with time zone |
end_time | timestamp with time zone |
sot_contribution | interval |
Run Code Online (Sandbox Code Playgroud)
我可以分别查询它们并生成我想要的总数。“planning_constraints”表的查询是:
SELECT
date_trunc('day', start_time - INTERVAL '18 hours')::date AS planning_day,
sum(sot_allowed) AS minutes_allowed
FROM planning_constraints
WHERE start_time>='2016-11-26 18:00:00+00' AND start_time<'2016-12-03 18:00:00+00' AND comment like …Run Code Online (Sandbox Code Playgroud) 我对 SQL 查询调优相当陌生。我一直在尝试了解如何编写等效的查询。在浏览J. Widom 教授的斯坦福在线视频讲座时,她提到了一些子查询,如果不JOIN使用DISTINCT. 例如,看这个:
4:45 / 20:13 - GPA 示例
SELECT GPA
FROM Student
WHERE sID in (select sID from Apply where major = 'CS');
Run Code Online (Sandbox Code Playgroud)6:39 / 20:13 - 学生申请 CS 而不是 EE
SELECT sID, sName
FROM Student
WHERE sID IN (select sID from Apply where major = 'CS')
AND sID NOT IN (select sID from Apply where major = 'EE');
Run Code Online (Sandbox Code Playgroud)我的问题是如何知道使用子查询编写的 SQL 语句是否将具有使用连接编写的等效语句。我很舒服,如果在答案中,有人喜欢使用关系代数表示法。
我在网上搜索了很多,找不到合适的答案。
Schema 和表创建(对于 PostgreSQL)如下,
CREATE TEMP TABLE college …Run Code Online (Sandbox Code Playgroud) 下面的查询非常慢(运行超过一分钟),我已将问题缩小到OR操作员 ( ...OR (EXISTS (SELECT...)。
我使用实时执行来验证 OR 语句的表之间是否存在嵌套循环连接,然后将记录连接回EmailTable执行计划中的 。
基本上,EmailTable正在被探查两次。
如果我添加提示OPTION (MERGE JOIN),查询将在一秒钟内完成。
请告诉我如何重写此查询,以便优化器默认选择更好的计划。
EmailTable并且TeamMembers在 上有聚集索引INS_ID。表上的统计数据经常更新。
DECLARE @a INT
,@b BIT
,@c INT
,@d INT
,@e INT;
SELECT [XYZ].[CNT] AS [C]
FROM (
SELECT COUNT(1) AS [CNT]
FROM [dbo].[EmailTable] AS [table1]
WHERE ([table1].[INS_ID] = @a)
AND ([table1].[ACTIVE] = 1)
AND ([table1].[QUEUED_TO_SEND] = @b)
AND ([table1].[OWNER_USER_ID] <> @c)
AND (
([table1].[OWNER_USER_ID] IN (- 1))
OR (N'Allusers' = …Run Code Online (Sandbox Code Playgroud) performance join sql-server optimization exists query-performance
我需要根据给定月份的每一行计算给定 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) 我最近开始将个人项目从 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 ×5
performance ×4
sql-server ×4
optimization ×3
coalesce ×1
datetime ×1
exists ×1
hierarchy ×1
index ×1
mysql ×1
subquery ×1
sum ×1
update ×1