我想要实现的目标是:
select * from users where user_id in (?, ?, ?, ?, ?)
)。例如,批量大小为5。因此,如果应用程序要求用户使用8个不同的user_id,那么我会在每次调用中调用前面提到的SQL两次有5个参数(而不是一个调用5个user_ids,然后调用3个)。
因此,如果输入大小小于批量大小,我需要填充 user_ids。我想知道在性能方面什么是好的填充方案:
当使用null时,如果列是NULLABLE,会有任何性能下降吗? 此外,当使用null时,DB仍然会提出一个查询计划,因为这是我想要使用一致大小的批次实现的目标吗?
答案 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)