- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在this dbfiddle demo我有一个 DELETE FROM...WHERE
最后像这样:
......
DELETE FROM data_table
WHERE
(location, param_id, ref_time, fcst_time) NOT IN (SELECT location, param_id, ref_time, fcst_time FROM sel1)
AND
(location, param_id, ref_time, fcst_time) NOT IN (SELECT location, param_id, ref_time, fcst_time FROM sel2);
虽然它有效,但似乎没有必要罗嗦,而且可能在性能方面也不是最佳的?
有什么方法可以简化这个,例如通过使用单个 NOT IN
语句?
由于它们的定义方式,sel1
和 sel2
之间没有重叠/交叉。
status_table
有 8033 行
data_table
有 116432724 行
sel1
有 61860084 行
sel2
有 53706188 行
数字不一定相加,因为它是一个实时数据库,数据一直在输入。是的,目前几乎没有要删除的行,因为大部分/所有数据都是最新的。
最佳答案
回答这个线程中的原始问题:
......
DELETE FROM data_table
WHERE
(location, param_id, ref_time, fcst_time)
NOT IN
(SELECT location, param_id, ref_time, fcst_time FROM sel1
UNION ALL
SELECT location, param_id, ref_time, fcst_time FROM sel2);
将 WHERE (a) NOT IN (b) AND NOT IN (c)
更改为WHERE (a) NOT IN (b UNION c)
不仅缩短了表达式,还提供了一些性能改进。根据 b
和 c
之间的重叠程度,您可以选择 UNION
或 UNION ALL
:
WHERE (a) NOT IN (b UNION c)
删除 b
和 c
之间的重复项,这最初会增加少量成本,但可以加快速度当 a
与实际上更小的联合进行比较时,事情会在以后发生。WHERE (a) NOT IN (b UNION ALL c)
跳过重复数据删除,因此如果设计上没有重复数据删除,这是更好的选择。这是一个 demo显示计划如何改变。在本地,我还针对具有 99% 重叠的 2x 10m 表测试了从 120m 行表删除,初始版本为 118s,union
为 105s,union all
为 98s。在所有相同的计数且没有重叠的情况下,它是 118s、103s、95s。对于更多的列和更复杂的类型,我预计差异会更加明显。
我想我会做我的 comment进入答案,添加随后的测试,将更广泛的优化留在 new thread 中讨论.
关于sql - 简化 WHERE (NOT) IN (...) 和 WHERE (NOT) IN (...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74500008/
我是一名优秀的程序员,十分优秀!