使用大小一致的批次进行批量选择
我想要实现的是:
- 提供一种批量选择的机制(
select * from users where user_id in (?, ?, ?, ?, ?)
)。例如,批量大小为 5 - 使用绑定变量并保持一致大小的批量
因此,如果应用程序需要用户提供 8 个不同的 user_id,那么我将调用上述 SQL 两次,每次调用中有 5 个参数(而不是使用 5 个 user_id 进行一次调用,然后使用3)。
因此,如果输入大小小于批量大小,我需要填充 user_ids。我想知道就性能而言什么是好的填充方案:
- 使用 null?
- 使用第一个 user_id
当使用 null 时,如果列为 NULLABLE,性能是否会下降? 另外,当使用 null 时,数据库是否仍会提出一个查询计划,因为这就是我想要使用大小一致的批次来实现的目标?
What I want to achieve is:
- Provide a mechanism for batch selects (
select * from users where user_id in (?, ?, ?, ?, ?)
). Batch size is 5 in this e.g. - Use bind variables and maintain consistent sized batches
So if the application requires Users for 8 different user_id then I would call the aforementioned SQL twice having 5 params in each call (rather than one call with 5 user_ids and then with 3).
So, I need to pad the user_ids if the input size is less than the batch size. I wanted to know what would be a good padding scheme in terms of performance:
- Using null?
- Using the first user_id
When using null would there be any performance degradation if the column is NULLABLE?
Also when using null would the DB still come up with one query plan, because that's what I want to achieve using consistent sized batches?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您的两个选择是等效的*。
没有区别*。在 IN 子句中,NULL 被删除,因此不会降低性能,除非您使用的 RDBMS 具有可以设置为 OFF 的 ANSI_NULLS 选项(例如 SQL Server) - 请参阅下文。在子句中也是集合,因此具有 (1,2,3,1,1) 相当于仅具有 (1,2,3),但它确实使您的绑定更容易。
因此,如果您 (1) 使用允许 NULL 与 NULL 匹配的 RDBMS,并且 (2) 您计划使用该设置,则这 2 个设置是等效的。
另一方面,为了 100% 确定,只需使用第二个选项。
SQL Server code showing NULL picking out NULLs.
Both of your options are equivalent*.
There is no difference*. In an IN clause, NULLs are removed, so there is no performance degradation, UNLESS the RDBMS you are using has an ANSI_NULLS option that you can set to OFF (e.g. SQL Server) - see far below. In CLAUSES are also SETs, so having (1,2,3,1,1) is equivalent to only having (1,2,3) but it does make your binding easier.
So if you are (1) using a RDBMS that allows for NULLs to match NULLs and (2) you plan to use that setting, the 2 are equivalent.
On the other hand, to be 100% certain, just use the 2nd option.
SQL Server code showing NULL picking out NULLs.