【问题标题】:Bulk selects using consistent sized batches使用一致大小的批次进行批量选择
【发布时间】:2011-08-24 18:24:19
【问题描述】:

我想要实现的是:

  • 提供批量选择机制 (select * from users where user_id in (?, ?, ?, ?, ?))。例如,批量大小为 5。
  • 使用绑定变量并保持批次大小一致

因此,如果应用程序需要 8 个不同 user_id 的用户,那么我将调用上述 SQL 两次,每次调用有 5 个参数(而不是一个调用有 5 个 user_id,然后使用 3 个)。

所以,如果输入大小小于批量大小,我需要 填充 user_ids。我想知道在性能方面什么是好的填充方案:

  • 使用空值?
  • 使用第一个 user_id

如果列为 NULLABLE,使用 null 是否会降低性能? 此外,当使用 null 时,数据库是否仍会提出一个查询计划,因为这就是我想要使用一致大小的批次来实现的目标?

【问题讨论】:

    标签: sql performance select


    【解决方案1】:

    您的两个选项是等效的*。

    * Using null?
    * Using the first user_id
    

    没有区别*。在 IN 子句中,NULL 被删除,因此不会降低性能,除非您使用的 RDBMS 有一个 ANSI_NULLS 选项,您可以将其设置为 OFF(例如 SQL Server) - 见下文。在 CLAUSES 中也是 SET,因此具有 (1,2,3,1,1) 等同于仅具有 (1,2,3),但它确实使您的绑定更容易。

    因此,如果您 (1) 使用允许 NULL 匹配 NULL 的 RDBMS 并且 (2) 您计划使用该设置,则 2 是等效的。

    另一方面,为了 100% 确定,只需使用第二个选项。


    显示 NULL 的 SQL Server 代码挑选出 NULL。
    set ansi_nulls off
    select *
    from (select 1 a union all select 2 union all select null) x
    where a in (1,2, null)
    

    【讨论】:

    • 谢谢! Oracle 中的空值是否也有特殊处理?
    • @aayush Oracle 以标准方式处理空值,即它们是无与伦比的。您只能对它们使用 IS NULL 或 IS NOT NULL。
    猜你喜欢
    • 2019-01-18
    • 1970-01-01
    • 2021-05-31
    • 2021-12-28
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多