大家都是怎么做批量查询的 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jie170601
V2EX    Java

大家都是怎么做批量查询的

  •  
  •   jie170601 2019-12-21 10:31:11 +08:00 via Android 6976 次点击
    这是一个创建于 2146 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近做了个东西感觉很不舒服,特来取经。
    数据库为 sqlserver,
    要根据 3,4 千左右 id 批量查询数据库,
    一开始用循环一个一个 id 查,效率慢的一逼,
    后面用 in 查,速度提升肉眼可见,
    但是遇到了 sqlserver 参数个数限制的问题,
    一直没解决,后面只能每 2 千个分批 in 一次,
    虽然能用但总感觉有更好的办法。
    24 条回复    2019-12-25 14:09:06 +08:00
    orzorzorzorz
        1
    orzorzorzorz  
       2019-12-21 11:03:13 +08:00
    建张临时表,把 id 插进去查完丢?
    w292614191
        2
    w292614191  
       2019-12-21 11:28:46 +08:00
    @orzorzorzorz 限制了参数个数啊,插到临时表 ???
    arthas2234
        3
    arthas2234  
       2019-12-21 11:34:29 +08:00
    @w292614191 #2 关联查询
    w292614191
        4
    w292614191  
       2019-12-21 11:36:17 +08:00
    @arthas2234 先把 id 循环插入到临时表,然后在关联查询的意思吗?

    那还不如直接循环查询数据,还要绕一圈。
    yuanchao
        5
    yuanchao  
       2019-12-21 11:45:11 +08:00   1
    看具体场景,如果读比写多,那么考虑预热到缓存,批量查询的时候直接从缓存取
    sazima
        6
    sazima  
       2019-12-21 12:10:28 +08:00
    select * from table where id in (....2000) or id in (.......) or id in (...)
    sazima
        7
    sazima  
       2019-12-21 12:11:44 +08:00
    随便想的, 没试过
    eason1874
        8
    eason1874  
       2019-12-21 12:11:59 +08:00
    要么调大 SQL 限制,要么分批查询。


    没有更好的方法,除非 ID 连续,那可以用比较条件。
    QUIOA
        9
    QUIOA  
       2019-12-21 12:34:15 +08:00 via Android
    你看看那些玩社工库的,,70E5 秒
    Sor
        10
    Sor  
       2019-12-21 13:35:52 +08:00
    @QUIOA 玩渗透社工的 脑回路是真的奇特,奇淫巧技学不来
    love
        11
    love  
       2019-12-21 13:52:31 +08:00 via Android   2
    你这个按 ID 分批来本身就是标准做法
    uyhyygyug1234
        12
    uyhyygyug1234  
       2019-12-21 14:00:18 +08:00
    @QUIOA
    @Sor

    这是啥技巧
    ryuzaki113
        13
    ryuzaki113  
       2019-12-21 14:15:30 +08:00
    根据 ID 来的话 不如 union all ?
    h123123h
        14
    h123123h  
       2019-12-21 14:17:45 +08:00
    为什么不用缓存~
    jugelizi
        15
    jugelizi  
       2019-12-21 14:21:49 +08:00   1
    实时性要求不高进缓存了 sql 亚历山大
    silentstorm
        16
    silentstorm  
       2019-12-21 14:42:48 +08:00 via Android
    @w292614191
    不一样的,多次查询大部分时间都消耗在数据库连接上面了
    jie170601
        17
    jie170601  
    OP
       2019-12-21 17:20:30 +08:00 via Android
    @yuanchao
    @jugelizi

    内存够,实时性要求不高,缓存是个挺好的方法。
    jie170601
        18
    jie170601  
    OP
       2019-12-21 17:22:21 +08:00 via Android
    @silentstorm
    @orzorzorzorz

    看到很多资料也说用临时表,可是没理解,插入数据也要循环连接数据库。
    Takamine
        19
    Takamine  
       2019-12-21 17:24:14 +08:00 via Android
    @sazima 一个 select *估计 能让我绩效清零。:doge:
    forgottencoast
        20
    forgottencoast  
       2019-12-21 17:45:16 +08:00
    你这个 id 从哪里来的呀?
    临时表可以用表变量来代替。
    orzorzorzorz
        21
    orzorzorzorz  
       2019-12-21 18:00:05 +08:00
    可以一次 insert 批量数据的:
    ```sql
    insertintotable(id,column1)
    values
    (1, 'test1'),
    (2, 'test2');
    ```
    这样一个连接就够了。
    PopRain
        22
    PopRain  
       2019-12-21 20:39:35 +08:00
    @jie170601 join 的循环是数据库内部的操作,速度很快,你循环查询就要做网络发送-语句解析-执行计划分析(缓存)-查询数据-网络返回,整个过程很慢很慢(尤其是前后的网络通讯)
    Eann248
        23
    Eann248  
       2019-12-22 17:12:32 +08:00
    @orzorzorzorz insert 长度限制与 select 是一样的
    bjking2014
        24
    bjking2014  
       2019-12-25 14:09:06 +08:00   1
    如果 in 参数只能放 2k 个,比如传了 5k 个参数,我的思路是
    select .....in(n1,n2000)
    union all
    select .....in(n2001,n4000)
    union all
    select .....in(n4001,n5000)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2398 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 15:51 PVG 23:51 LAX 07:51 JFK 10:51
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86