我有一个问题,我有一个大于100,000,000行的市场数据表,我需要搜索并删除符号和totvol列匹配但serial_no不同的重复项。
我在单个表上尝试了下面的查询,并且还使用了表的副本作为参考,但遗憾的是它占用了大量的堆空间(> 100G并计数,有时将硬盘填充到边缘并崩溃我的数据库)和时间(> 30分钟)并使我的服务器爬行(32核上60-95%的CPU使用率!),这是不可接受的。如果我想定期执行这样的事情,是否有一种有效的方法来编写此查询以优化sql执行?
通常我会以某种方式对表进行分区,因为大部分的重复项都是相邻或相邻插入的,但由于monetdb是一个列存储数据库,因此这种分区方式也占用了大量的堆空间。我发现减少堆的唯一有用的事情是创建一个包含数据子集的全新表(即按符号按字母顺序拆分),这会产生较小的列蝙蝠文件,然后在小表上运行操作,是否存在我可以保持大表格的任何方式,并编写一个一次可能运行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行都是重复的=我的critera,注意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>