Sherman07
V2EX  ›  问与答

磁盘空间不足的情况下, 10 亿级数据库该如何去重?

  •  
  •   Sherman07 · Jul 12, 2022 · 2103 views
    This topic created in 1426 days ago, the information mentioned may be changed or developed.
    现有单表 10 亿条数据,含有大约 5000w 条重复数据,在磁盘空间严重不足(已经使用 92%)的情况下应该如何去重?
    数据库采用 Oracle 云数据库,根据“UID”判断是否重复。
    11 replies    2022-07-13 08:11:28 +08:00
    InDom
        1
    InDom  
       Jul 12, 2022
    这不是知名面试题嘛?

    用那个啥 bitmap ?

    算了下需要用 1G 内存 or 磁盘?
    Reficul
        2
    Reficul  
       Jul 12, 2022
    bloom filter 过滤一遍,发现重复的放 hashmap 再来一遍?
    sadfQED2
        3
    sadfQED2  
       Jul 12, 2022 via Android   ❤️ 1
    在我这里,就算是天王老子来了,我也是提工单申请一台大磁盘服务器处理

    不过你这个是在数据库里面,跟磁盘大小有啥关系?写脚本遍历表,每个 uid 再去数据库查一次有几条,然后删除多余的不就行了
    sadfQED2
        4
    sadfQED2  
       Jul 12, 2022 via Android
    根据主键 id 遍历表,不会出现文件排序,只要数据库还能查数量,哪怕磁盘 100%也不影响啊
    wxf666
        5
    wxf666  
       Jul 12, 2022
    @sadfQED2 会不会他 uid 没加索引。。

    即使一行索引只是存为 (uid: 4 Bytes, 页号: 4 Bytes),给 uid 加索引,至少也需要 (10 ^ 9) * 8 Bytes ≈ 7.5 GB 磁盘?

    感觉 1 楼说的 bitmap 去重可行啊

    如果 UID 为 4 字节,bitmap 需要 (2 ^ 32) bits / 8 (bits/Byte) = 512 MB 内存 /磁盘,

    如果 UID 极差不超过 2 ^ 30 (约 10 亿 7300 万),bitmap 只需要 128 MB 内存 /磁盘
    rrfeng
        6
    rrfeng  
       Jul 12, 2022 via Android
    我一时间没想明白这是个 dba 题目还是…
    wxf666
        7
    wxf666  
       Jul 12, 2022
    上面写错了,一行索引存为 (uid: 4 Bytes, 主键 id: 4 Bytes)
    Jooooooooo
        8
    Jooooooooo  
       Jul 12, 2022
    确实, 你都能有这么多数据了, 还具备处理价值, 申请一个更大的存储不是问题.
    yogogo
        9
    yogogo  
       Jul 12, 2022
    哪家大厂这么扣,10 亿级数据库都不舍得加磁盘空间
    dddd1919
        10
    dddd1919  
       Jul 12, 2022
    读到另一个机器上查重,然后再回来删
    nepiedg
        11
    nepiedg  
       Jul 13, 2022
    布隆过滤器?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   972 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 18:41 · PVG 02:41 · LAX 11:41 · JFK 14:41
    ♥ Do have faith in what you're doing.