在唯一约束之前清理 SQL 数据

2023-12-23

我想在对两列添加唯一约束之前清理表中的一些数据。

CREATE TABLE test (
 a integer NOT NULL,
 b integer NOT NULL,
 c integer NOT NULL,
 CONSTRAINT a_pk PRIMARY KEY (a)
);

INSERT INTO test (a,b,c) VALUES
 (1,2,3)
,(2,2,3)
,(3,4,3)
,(4,4,4)
,(5,4,5)
,(6,4,4)
,(7,4,4);

-- SELECT a FROM test WHERE ????

输出应该是2,6,7

我正在寻找所有行在第一个之后已经重复的b,c

EX:

  • 第 1,2 行有 (2,3) 作为 b,c 第 1 行可以,因为它是第一行,第 2 行则不行。

  • 第 4,6,7 行有 (4,4) 作为 b,c 第 4 行可以,因为它是第一行,第 6,7 行不行。

然后我会:

DELETE FROM test WHERE a = those IDs;

..并添加唯一约束。

我正在考虑对其自身进行相交测试,但不确定从那里该去哪里。


我进行了一些测试。这EXISTS事实证明变体要快得多 - 正如我所预期的那样,与@Tometzky 发布了什么 https://stackoverflow.com/a/10837954/939860.

PostgreSQL 9.1.2 上具有 10.000 行的测试床,设置不错:

CREATE TEMP TABLE test (
  a serial
 ,b int NOT NULL
 ,c int NOT NULL
);

INSERT INTO test (b,c)
SELECT (random()* 100)::int AS b, (random()* 100)::int AS c
FROM   generate_series(1, 10000);

ALTER TABLE test ADD CONSTRAINT a_pk PRIMARY KEY (a);

在第一轮和第二轮测试之间,我运行了:

ANALYZE test;

当我最终应用 DELETE 时,3368 个重复项被删除。如果重复项明显增多或减少,性能可能会有所不同。

我将每个查询运行了几次EXPLAIN ANALYZE并取得了最好的成绩。一般来说,最好的与第一个或最差的几乎没有什么不同。
A bare SELECT(没有DELETE)显示了类似的结果。

1. CTE 与rank()

总运行时间:150.411 毫秒
总运行时间:149.853 ms——分析后

WITH x AS (
    SELECT a
          ,rank() OVER (PARTITION BY b, c ORDER BY a) AS rk
    FROM   test
    )
DELETE FROM test
USING  x
WHERE  x.a = test.a
AND    rk > 1;

2.热膨胀系数row_number()

总运行时间:148.240 毫秒
总运行时间:147.711 毫秒——分析后

WITH x AS (
    SELECT a
          ,row_number() OVER (PARTITION BY b, c ORDER BY a) AS rn
    FROM   test
    )
DELETE FROM test
USING  x
WHERE  x.a = test.a
AND    rn > 1;

3. row_number()在子查询中

总运行时间:134.753 毫秒
总运行时间:134.298 毫秒——分析后

DELETE FROM test
USING (
    SELECT a
          ,row_number() OVER (PARTITION BY b, c ORDER BY a) AS rn
    FROM   test
    )  x
WHERE  x.a = test.a
AND    rn > 1;

4. EXISTS半连接

总运行时间:143.777 毫秒
总运行时间:69.072 毫秒-- 分析后

DELETE FROM test t
WHERE EXISTS (
    SELECT 1
    FROM   test t1
    WHERE  t1.a < t.a
    AND   (t1.b, t1.c) = (t.b, t.c)
    );

第二次运行的差异来自于切换到哈希半连接而不是额外的排序+合并半连接.

Results

  • EXISTS凭借最新的牌桌统计数据,显然获胜。
  • 过时的统计数据row_number()在子查询中是最快的。
  • rank()是最慢的变体。
  • CTE 比子查询慢。
  • ANALYZE(更新的统计数据)有助于提高性能和can有很多帮助。自动真空 http://www.postgresql.org/docs/current/interactive/routine-vacuuming.html(默认)或多或少应该自动处理这个问题 - 除了临时表或在对表进行重大更改后立即进行。阅读更多here https://dba.stackexchange.com/questions/18664/are-regular-vacuum-analyze-stil-recommended-under-9-1 or here https://dba.stackexchange.com/questions/35327/should-i-manually-vacuum-my-postgresql-database-if-autovacuum-is-turned-on.

使用 100.000 行进行测试

我用 100.000 行和 63045 个重复项重复了测试。类似的结果,除了EXISTS速度较慢,即使在之后ANALYZE.

  1. 总运行时间:1648.601 毫秒
  2. 总运行时间:1623.759 毫秒
  3. 总运行时间:1568.893 毫秒
  4. 总运行时间:1692.249 毫秒

将统计目标提高到 1000,然后提高到最大 10000(现实生活中的杀伤力),然后再提高ANALYZE将所有查询速度加快了约 1%,但查询规划器仍然采用排序+合并半连接 for EXISTS.

ALTER TABLE test ALTER COLUMN b SET STATISTICS 10000;
ALTER TABLE test ALTER COLUMN c SET STATISTICS 10000;
ANALYZE test;

只有在我强迫规划器避免合并连接之后,规划器才使用哈希半连接再次花费一半的时间:

SET enable_mergejoin = off
  1. 总运行时间:850.615 毫秒

Update

曾经有过改进从那时起到查询规划器。直接去了哈希半连接使用 PostgreSQL 9.1.7 进行重新测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在唯一约束之前清理 SQL 数据 的相关文章

  • 在 plpgsql 函数中使用 quote_ident()

    我是创建 plpgsql 函数的新手 我需要一些有关在函数内部执行的动态命令上使用 quote ident 甚至 quote literal 的说明 希望有人能给我一个关于它们如何在函数内部工作的具体解释 TIA 这是一个例子 EXECUT
  • MYSQL:如何在同一查询中联接两个表,两次引用同一个表

    我有两张桌子 我正在尝试将下面的示例两个表与表 1 引用表 2 两次结合起来 例如 如果我查看表 1 组 2 和成员 7 它应该查找表 2 中的 ID 并给出输出 Group Members Name Name 2 7 Blue Dog T
  • hive - 在值范围之间将一行拆分为多行

    我在下面有一张表 想按从开始列到结束列的范围拆分行 即 id 和 value 应该对开始和结束之间的每个值重复 包括两者 id value start end 1 5 1 4 2 8 5 9 所需输出 id value current
  • 在 Yii 的标准中如何获得计数 (*)

    我正在尝试构建一个具有以下内容的查询group by属性 我正在尝试得到id和count它一直告诉我count is invalid列名 我怎样才能得到count来自group by询问 工作有别名 伊伊 1 1 11 其他不及格 crit
  • R 数据结构的运算效率

    我想知道是否有任何关于操作效率的文档R 特别是那些与数据操作相关的 例如 我认为向数据框添加列是有效的 因为我猜您只是向链接列表添加一个元素 我想添加行会更慢 因为向量保存在数组中C level你必须分配一个新的长度数组n 1并将所有元素复
  • SQL Server:如果存在会大大减慢查询速度

    正在使用SQL Server 2012 我找到了一些关于查询优化的主题 并将 EXISTS 与 COUNT 进行比较 但我找不到这个确切的问题 我有一个看起来像这样的查询 select from tblAccount as acc join
  • 替换字符串中的多个字符,而不使用任何嵌套替换函数

    我的表中存储了一个方程 我一次获取一个方程 并希望将所有运算符替换为任何其他字符 输入字符串 N 100 6858 6858 N 100 0 2 N 35 运算符或模式 替换字符 输出字符串 N 100 6858 6858 N 100 0
  • mysql GROUP_CONCAT 重复项

    我从 farmTOanimal 表中进行连接 如下所示 有一个类似的farmTotool表 id FarmID animal 1 1 cat 2 1 dog 当我在视图中加入表时 我得到的结果如下所示 FarmID animal tool
  • 处理ON INSERT触发器时,innodb表如何锁定?

    我有两个 innodb 表 articles id title sum votes 1 art 1 5 2 art 2 8 3 art 3 35 votes id article id vote 1 1 1 2 1 2 3 1 2 4 2
  • 仅选择 Varchar 列中的数字[重复]

    这个问题在这里已经有答案了 在 SQL Server 2008 R2 中 我在 varchar 12 列中有一些数据 它看起来像这样 Data 1234 1765 34566 123 SDRMH HJG434 我想从所有包含 的行中删除 并
  • 多少个 div 标签太多了?

    在一个 HTML 文档中需要多少个 div 标签才会影响性能 在这种情况下 标签不嵌套 并且每个标签内的内容最少 背景颜色 图像 这个问题是上一个问题的后续问题 使用 JavaScript 绘制带有可点击点的线条 https stackov
  • 使用 SQL 完全复制 postgres 表

    免责声明 这个问题和栈溢出问题类似here https stackoverflow com questions 198141 copy a table including indexes in postgres 但这些答案都不适用于我的问题
  • 连接 3 三张表

    我有这个图表应该可以解释我的情况 我需要一些关于连接 3 个表的帮助 我不知道如何做这种事情 因此 我可以通过执行以下操作来经历一段检索记录的 while 循环 img src alt Album AlbumID 使用内部联接 http w
  • 如何改变HTML5视频的播放速度?

    如何更改 HTML5 中的视频播放速度 我查过视频标签的属性 https www w3schools com html html5 video asp在 w3school 但无法做到这一点 根据这个网站 http www chipwreck
  • 如何避免连接两个表时重复

    Student Table SID Name 1 A 2 B 3 C Marks Table id mark subject 1 50 physics 2 40 biology 1 50 chemistry 3 30 mathematics
  • SQL。 SP 或函数应计算周五的下一个日期

    我需要编写一个存储过程来返回给定日期的下周五日期 例如 如果日期是 05 12 2011 那么它应该返回下周五日期 05 13 2011 如果您通过 05 16 2011 那么它应该返回日期是 5 20 2011 星期五 如果您将星期五作为
  • jQuery 选择器:为什么 $("#id").find("p") 比 $("#id p") 更快

    该页面的作者 http 24ways org 2011 your jquery now with less suck http 24ways org 2011 your jquery now with less suck断言 jQuery
  • 要做或不做:将图像存储在数据库中[重复]

    这个问题在这里已经有答案了 在 Web 应用程序的上下文中 我的前老板总是说在数据库中放置对图像的引用 而不是图像本身 我倾向于同意在数据库中存储 url 与图像本身是一个好主意 但在我现在工作的地方 我们在数据库中存储大量图像 我能想到的
  • 作为 UDF 结果的列上的 Where 子句

    我有一个用户定义的函数 例如myUDF a b 返回一个整数 我试图确保该函数仅被调用一次 并且其结果可以用作WHERE clause SELECT col1 col2 col3 myUDF col1 col2 AS X From myTa
  • MYSQL 按喜欢/不喜欢和受欢迎程度排序

    我有评论表 其中包括喜欢和不喜欢的内容 现在我在正确的顺序上遇到了问题 实际上 我的系统在顶部显示了最多点赞的评论 我正在 youtube 上寻找类似系统的东西 这意味着 100like 100dislikes 的评论的顺序高于 1 1 我

随机推荐

  • 无法找到 Python PIL 库。Google App Engine

    完美安装了Google App Engine SDK Python 2 6 想要进入图像并在本地进行测试 已安装 PIL 安装了Python 然后运行了PIL安装 这次成功了 事情看起来不错 但尝试进行本地主机图像处理 给出 NotImpl
  • Node Puppeteer, page.on( "request" ) 抛出“请求已处理!”

    我在用着puppeteer extra https www npmjs com package puppeteer extra和 node js 来迭代多个 url 我试图拦截一些资源类型以在每次迭代时加载 并收到以下错误 PS C Use
  • ios 中的阴影

    iOS 中如何去掉物体的阴影 My object is UIImageView and i want to drop an elliptical shadow Please refer image for reference 最好使用另一张
  • 使一个流的输出成为另一个流的输入的最佳方法是什么

    我想知道除了使用字节缓冲区和循环之外 是否有更好 内置的方法从一个流读取并将其写入另一个流 在 NET 中 通常 这样做是为了将转换应用于流并将其继续移动 在本例中 我正在加载一个文件 将其放入 deflate 流并将其写入文件 为简单起见
  • AMD(特别是 RequireJs)如何处理跨多个模块的依赖关系

    我有一个调用 require 的主初始化脚本 其中一个依赖项是实用程序框架 但我通过 require 指定的其他一些模块本身也已将此框架定义为依赖项 例如 init js require module a module b module c
  • 删除了方法的 C++ 类可以轻松复制吗?

    我希望类 B 继承类 A 的除少数方法之外的所有方法 假设它是可简单复制的 并且仍然可简单复制 在 C 11 中我可以删除方法 举个例子 class A trivially copyable private stuff here publi
  • 用于奇异控制流的 ES6 Promise 模式

    ES6 Promise 很棒 到目前为止 调整我的想法很容易 回调习惯用法 我发现它自然地鼓励更多的模块化代码 并且 当然错误处理更加清晰 但有几次我遇到了看起来不像 的心流情况 可以很容易地从节点返回到承诺 也许就是这样 但也许我只是对答
  • 如何在 VS Code 设置中为 VS Code 进程指定环境变量?

    我发现这两种方法来添加环境变量 添加环境变量terminal integrated env osx对于终端 添加环境变量launch json用于调试 但 VSCode Process 没有类似的配置选项 一些插件经常需要访问特定的环境变量
  • C++ 中的 rand() 和 srand()

    C 中生成随机数的基础是什么 这背后有什么逻辑或者原理吗 生成的数字是完全随机的吗 假设我正在运行这个程序 include
  • 在javascript中获取元数据属性

    我在从元标记检索信息时遇到问题 我正在尝试从网站获取 img src 但不太明白 这是我正在尝试做的一个例子 var image document querySelector meta property og image getAttrib
  • 如何在引导模式主体上创建具有固定标题的可滚动表格?

    我尝试了这个 但这不起作用 字段值是动态变化的 所以宽度不固定 div class table responsive table class table table hover thead tr tr thead tbody style h
  • 对 Django Q 对象执行逻辑异或

    我想执行逻辑异或 XOR http en wikipedia org wiki Exclusive disjunction on django db models Q对象 使用operator http docs python org 2
  • if 语句无论条件是否满足都运行

    我的 if 语句贯穿始终 就好像条件已满足 即使条件尚未满足 我尝试过移动一些代码 甚至以不同的方式重写 if 语句 但它并没有改变结果 有谁知道我做错了什么 include
  • 如何将字节数组转换为MultipartFile

    我正在接收 BASE64 编码字符串 encodedBytes 形式的图像 并使用以下方法在服务器端解码为 byte BASE64Decoder decoder new BASE64Decoder byte decodedBytes dec
  • 平均特定数字的随机数

    看起来很简单 但我想要一个公式 最好是 net 对于给定的数字 比如说 1 5 公式将输出一个随机数 该数字在一系列中平均约为 1 5 所以它可能是 0 1 1 2 7 1 2 5 2 等 但平均值将接近1 5 澄清 我希望这些数字是正数
  • 在 Mobile Safari 上的 CSS 中使用右浮动时字体大小错误

    我在使用简单的 CSS 布局时遇到问题 它适用于桌面浏览器 但不适用于 iPhone 的 Mobile Safari 使用 style float right 似乎与 Mobile Safari 进行的自动字体大小调整相冲突 以下代码在桌面
  • shmget() 返回的 shmid 在进程中是否唯一?

    这是我无法真正弄清楚的事情 如果你在Linux上使用相同的密钥但在不同的进程中调用shmget 你会得到相同的shmid吗 shmid 是一个临时值 例如文件描述符编号 还是可以在调用之间保留的值 是的 您将收到相同的 shmid 共享内存
  • 如何相对于图像定位 div?

    我有一张图像 它可能会根据某些操作和我想要的几个 div 来改变其位置position on the img tag 简化后的代码如下 div img src someRandomImageUrl div foobar div div 为了
  • Symfony3:致命错误:在 .\bin\console 中找不到类“AppKernel”

    刚开始做一个项目 我跑了composer update并在尝试清除缓存时遇到异常 当我尝试跑步时php bin console server run我收到这样的消息 php bin console server run PHP Fatal
  • 在唯一约束之前清理 SQL 数据

    我想在对两列添加唯一约束之前清理表中的一些数据 CREATE TABLE test a integer NOT NULL b integer NOT NULL c integer NOT NULL CONSTRAINT a pk PRIMA