gpt4 book ai didi

sql - 简化 WHERE (NOT) IN (...) 和 WHERE (NOT) IN (...)

转载 作者:行者123 更新时间:2023-12-05 04:20:24 27 4
gpt4 key购买 nike

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 语句?

由于它们的定义方式,sel1sel2 之间没有重叠/交叉。

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) 不仅缩短了表达式,还提供了一些性能改进。根据 bc 之间的重叠程度,您可以选择 UNIONUNION ALL:

  • WHERE (a) NOT IN (b UNION c) 删除 bc 之间的重复项,这最初会增加少量成本,但可以加快速度当 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com