我有一个问题,我有一个超过 100,000,000 行的市场数据表,我需要搜索并删除 symbol 和 totvol 列匹配但 serial_no 不同的重复项。
我已经在单个表上尝试了下面的查询,也使用表的副本作为参考,但不幸的是它占用了大量的堆空间(> 100G并且还在计数,有时会将硬盘驱动器填满并崩溃我的数据库)和时间(> 30 分钟)并使我的服务器陷入爬行状态(32 核上的 CPU 使用率为 60-95%!)这是不可接受的。如果我想定期执行这样的事情,有没有一种有效的方法来编写这个查询来优化 sql 执行?
通常我会以某种方式对表进行分区,因为大部分重复项是相邻或相邻插入的,但由于 monetdb 是列存储数据库,因此这种分区方式也会占用大量堆空间。我发现减少堆的唯一有用的方法是创建一个包含数据子集的全新表(即按字母顺序按符号拆分),这会导致更小的列 bat 文件,然后在小表上运行操作,是否存在有什么方法可以让大表保持完整并编写一个查询,一次可以处理 1,000,000 行?
查询:
delete from print_11_11
where exists (Select a.serial_no
from print_11_11 as a, print_11_11 as b
where a.symbol=b.symbol
and a.totvol = b.totvol
and a.serial_no>b.serial_no)
一些示例数据,第 2 行和第 3 行是彼此重复的,第 4-7 行都是重复的 = 根据我的标准,请注意 exseq 可能相同或不同,删除重复项时我们保留哪个 exseq 值并不重要:
<table border="1"><tr BGCOLOR="#CCCCFF"><th>serial_no</th><th>ttime</th><th>symbol</th><th>vol</th><th>totvol</th><th>exseq</th></tr>
<tr><td>0</td><td>80017</td><td>T</td><td>200</td><td>200</td><td>133813</td></tr>
<tr><td>855</td><td>80017</td><td>T</td><td>42</td><td>242</td><td>133813</td></tr>
<tr><td>867</td><td>80017</td><td>T</td><td>42</td><td>242</td><td>136690</td></tr>
<tr><td>868</td><td>80210</td><td>T</td><td>100</td><td>342</td><td>136690</td></tr>
<tr><td>876</td><td>80211</td><td>T</td><td>100</td><td>442</td><td>136690</td></tr>
<tr><td>877</td><td>80211</td><td>T</td><td>100</td><td>442</td><td>136696</td></tr>
<tr><td>882</td><td>80211</td><td>T</td><td>100</td><td>442</td><td>136737</td></tr>
<tr><td>883</td><td>80213</td><td>T</td><td>2928</td><td>3370</td><td>136737</td></tr>
</table>