在我们的mysql数据库中,我们同时使用myisam和innodb表,尽管还有更多的myisam表。
考虑这两个查询:
SELECT
t1.id, *
FROM
t1
INNER JOIN
t2 ON t1.id = t2.id
where t1.id > -9223372036513411363;
Run Code Online (Sandbox Code Playgroud)
和:
SELECT
t1.id, *
FROM
t1
INNER JOIN
t2 ON t1.id = t2.id
where t1.id > -9223372036513411363 and t2.id > -9223372036513411363;
Run Code Online (Sandbox Code Playgroud)
注意:不是-9223372036513411363表中的最小值,并且条件将结果(从总行数 3.5 亿行)减少到 1700 万行。
就我个人而言,我希望 PostgreSQL 能够为这两个查询提供相同的计划,因为t1.id = t2.id自动意味着第二个条件。但不幸的是,PostgreSQL 正在创建两个不同的计划,第二个计划要好得多:
我非常喜欢第一个查询,因为我想从连接创建一个视图,并将 where 条件放在视图上的查询上,我在其中看到单个 id 列(我使用连接,USING因此单个 id 列在视图中可见) 。另外,我将连接两个以上的表,并且我不希望为每个连接添加这样的条件。
这种行为有什么原因吗?或者这是一个错误?有什么解决方法吗?
ON …postgresql performance join execution-plan postgresql-9.3 postgresql-performance
这有效。
SELECT *
FROM Demographics
JOIN MeasuresofBirthAndDeath
ON Demographics.rowid = MeasuresofBirthAndDeath.rowid;
Run Code Online (Sandbox Code Playgroud)
这不。
SELECT *
FROM Demographics
JOIN MeasuresofBirthandDeath
USING (rowid);
Run Code Online (Sandbox Code Playgroud)
为什么?
我有一个 1:m 协会。
symbols表中有很多行company_key_statistics。company_key_statistics有一个时间戳列createdAt,指示行的创建时间。我需要加入最新symbols的company_key_statistics,但我只需要最新的company_key_statistics。例如,我需要获取ORCL并且MSFT symbols仅获取他们最新的company_key_statistics.
到目前为止我已经尝试过了。
SELECT `symbols`.`id`,
`symbols`.`symbol`,
`statistics`.
`marketCapitalization`
FROM `symbols`
LEFT JOIN (SELECT `s`.`companyId`,
`s`.`marketCapitalization`
FROM `company_key_statistics` AS `s`
WHERE `s`.`companyId` = `symbols`.`id`
ORDER by `createdAt`
DESC LIMIT 1) AS `statistics`
ON `symbols`.`id` = `statistics`.`companyId`
WHERE `symbols`.`symbol` IN ('ORCL', 'SNAP');
Run Code Online (Sandbox Code Playgroud)
但不幸的是我发现我不能在子查询中使用父查询中的列JOIN。
我怎样才能做到这一点?
在 MySQL 中,我可以执行这样的查询
UPDATE
prd_sectionshapename se
inner join
prd_shape s
ON
s.id = se.shape_id
SET
se.company_shape_name = 'ABC',
s.name_en = 'Another name'
WHERE s.serial_number = '1234ST';
Run Code Online (Sandbox Code Playgroud)
在 Postgres 中,我需要分成 2 个查询
UPDATE prd_shape AS s
SET name_en = 'Another name'
WHERE s.serial_number = '1234ST';
UPDATE prd_sectionshapename AS se
SET company_shape_name = 'ABC'
FROM prd_shape s
WHERE se.shape_id = s.id and s.serial_number = '1234ST';
Run Code Online (Sandbox Code Playgroud)
我的问题是可以像 MySQL 一样在 1 个查询中完成它吗?
请注意,我在互联网上找到的其他 postgres 更新联接答案通常表明,即使使用了联接,更新效果也仅发生在单个表上。
我的目的是在一个查询中更新多个表。不只是一张桌子。
有没有办法做我想要的“左交叉连接”?
即,是否有一种方法可以指定 CROSS JOIN ON,但在结果中为左侧的每一行至少返回一行,当右侧表不包含匹配项时,对右侧列使用空值?
我正在尝试解决一个特别困难的问题。我正在 SQL 表 (PostgreSQL) 中存储来自某些传感器的一些遥测数据,我想知道如何编写一个查询,该查询将使用来自其他两个表的关系信息对遥测数据进行分组。
我有一张表存储来自传感器的遥测数据。该表包含三个字段,一为时间戳,一为传感器ID,一为传感器当时的值。值列是一个递增计数(它只会增加,不会重置)
Sensor_Telemetry表
| 时间戳 | 传感器 ID | 价值 |
|---|---|---|
| 2022-01-01 00:00:00 | 5 | 3 |
| 2022-01-01 00:00:01 | 5 | 5 |
| 2022-01-01 00:00:02 | 5 | 6 |
| ... | ... | ... |
| 2022-01-01 01:00:00 | 5 | 第675章 |
我有另一个表,用于存储传感器的状态(无论是静止还是运动)以及该传感器的特定状态的开始/结束日期:
状态表
| 开始日期 | 结束日期 | 地位 | 传感器 ID |
|---|---|---|---|
| 2022-01-01 00:00:00 | 2022-01-01 00:20:00 | 运动中 | 5 |
| 2022-01-01 00:20:00 | 2022-01-01 00:40:00 | 固定式 | 5 |
| 2022-01-01 00:40:00 | 2022-01-01 01:00:00 | 运动中 | 5 |
| ... | ... | ... | ... |
传感器位于特定位置。Sensor 表存储以下元数据:
传感器表
| 传感器 ID | 位置ID |
|---|---|
| 5 | 16 |
在决赛表中,我有每个位置发生的变化。班次表是所有班次发生的列表,即在本例中,班次 A 定义为每天 00:00:00 到 00:30:00 之间发生,班次 B 定义为每天 00:30 …
我有这个表结构:
id1 id2
1 2
1 3
1 4
2 1
2 5
Run Code Online (Sandbox Code Playgroud)
我需要构建一个查询来选择id2where id1is not in id2. 例如,如果id1 = 1只有id2=3和id2=4。
我试过这个:
SET @a=1;
SELECT DISTINCT x.id2
FROM tt x, tt y
WHERE x.id1=@a AND x.id1 != y.id2;
Run Code Online (Sandbox Code Playgroud)
但它不起作用。
我在 MSSQL 课上教过,这是如何连接两个表
Run Code Online (Sandbox Code Playgroud)select * from FirstTable A JOIN SecondTable B on A.ID= B.ID
现在在我的职业生涯中,我遇到过这样的 JOIN 查询
Run Code Online (Sandbox Code Playgroud)select * from FirstTable A, SecondTable B where A.ID=B.ID
我知道第二种选择曾经是常态,但现在可能已经放弃了。
我发现在我加入 6+ 个表 + 有多个子查询的复杂查询中,第二种形式更容易理解,而且简短漂亮。
问题
我有一个中等大小的数据库,分布在几个表上,粗略的架构是:
每个表有大约 200,000 行。
我还有一个视图,它基本上将所有这些粘合在一起,以便我可以SELECT使用一堆 ID(通常根据会话 ID 选择它们)并在一个页面上查看所有相关数据。
该视图有效,查询计划的索引利用率似乎正常,但结果并不快:
> EXPLAIN ANALYZE SELECT(*) FROM overlay WHERE test_session=12345;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Merge Right Join (cost=7.19..74179.49 rows=10 width=305) (actual time=10680.129..10680.494 rows=4 loops=1)
Merge Cond: (p.data_id = d.id)
-> Merge Join (cost=7.19..75077.04 rows=183718 width=234) …Run Code Online (Sandbox Code Playgroud) join ×10
postgresql ×4
mysql ×3
performance ×2
aggregate ×1
cross-join ×1
index ×1
innodb ×1
limits ×1
myisam ×1
query ×1
sql-server ×1
subquery ×1
timescaledb ×1
update ×1
view ×1