jie170601
V2EX  ›  Java

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

  •  
  •   jie170601 · Dec 21, 2019 via Android · 7928 views
    This topic created in 2510 days ago, the information mentioned may be changed or developed.
    最近做了个东西感觉很不舒服,特来取经。
    数据库为 sqlserver,
    要根据 3,4 千左右 id 批量查询数据库,
    一开始用循环一个一个 id 查,效率慢的一逼,
    后面用 in 查,速度提升肉眼可见,
    但是遇到了 sqlserver 参数个数限制的问题,
    一直没解决,后面只能每 2 千个分批 in 一次,
    虽然能用但总感觉有更好的办法。
    24 replies  •  2019-12-25 14:09:06 +08:00
    orzorzorzorz
    orzorzorzorz
    Dec 21, 2019
    1
    建张临时表,把 id 插进去查完丢?
    w292614191
    w292614191
    Dec 21, 2019
    2
    @orzorzorzorz 限制了参数个数啊,插到临时表 ???
    arthas2234
    arthas2234
    Dec 21, 2019
    3
    @w292614191 #2 关联查询
    w292614191
    w292614191
    Dec 21, 2019
    4
    @arthas2234 先把 id 循环插入到临时表,然后在关联查询的意思吗?

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


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

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

    内存够,实时性要求不高,缓存是个挺好的方法。
    jie170601
    jie170601
    OP
    Dec 21, 2019 via Android
    18
    @silentstorm
    @orzorzorzorz

    看到很多资料也说用临时表,可是没理解,插入数据也要循环连接数据库。
    Takamine
    Takamine
    Dec 21, 2019 via Android
    19
    @sazima 一个 select *估计 能让我绩效清零。:doge:
    forgottencoast
    forgottencoast
    Dec 21, 2019
    20
    你这个 id 从哪里来的呀?
    临时表可以用表变量来代替。
    orzorzorzorz
    orzorzorzorz
    Dec 21, 2019
    21
    可以一次 insert 批量数据的:
    ```sql
    insert into table (id, column1)
    values
    (1, 'test1'),
    (2, 'test2');
    ```
    这样一个连接就够了。
    PopRain
    PopRain
    Dec 21, 2019
    22
    @jie170601 join 的循环是数据库内部的操作,速度很快,你循环查询就要做网络发送-语句解析-执行计划分析(缓存)-查询数据-网络返回,整个过程很慢很慢(尤其是前后的网络通讯)
    Eann248
    Eann248
    Dec 22, 2019
    23
    @orzorzorzorz insert 长度限制与 select 是一样的
    bjking2014
    bjking2014
    Dec 25, 2019❤️1
    24
    如果 in 参数只能放 2k 个,比如传了 5k 个参数,我的思路是
    select .....in(n1,n2000)
    union all
    select .....in(n2001,n4000)
    union all
    select .....in(n4001,n5000)
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5353 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 63ms · UTC 03:32 · PVG 11:32 · LAX 19:32 · JFK 22:32
    ♥ Do have faith in what you're doing.