批量选择使用一致大小的批次

时间:2011-02-14 22:02:15

标签: sql performance select

我想要实现的目标是:

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

因此,如果应用程序要求用户使用8个不同的user_id,那么我会在每次调用中调用前面提到的SQL两次有5个参数(而不是一个调用5个user_ids,然后调用3个)。

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

  • 使用null?
  • 使用第一个user_id

当使用null时,如果列是NULLABLE,会有任何性能下降吗? 此外,当使用null时,DB仍然会提出一个查询计划,因为这是我想要使用一致大小的批次实现的目标吗?

1 个答案:

答案 0 :(得分:3)

您的两个选项都相同*。

* Using null?
* Using the first user_id

没有区别*。在IN子句中,删除了NULL,因此没有性能下降,除非您使用的RDBMS具有可以设置为OFF的ANSI_NULLS选项(例如SQL Server) - 请参见下文。在CLAUSES中也是SET,所以有(1,2,3,1,1)相当于只有(1,2,3),但它确实使你的绑定更容易。

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

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

<小时/> SQL Server代码显示NULL选择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)